-1

不确定这是否可能。我需要将一个函数从 C 传递到 C++。它不能是函数指针。

我需要调用的 C++ 函数:

template<class Lam>
void parfor(int N, Lam lam) {
  lam(i);
}

我想给 parfor 的 C 函数(这里的 ptr 可以是全局指针):

void calc(int num) {
  ptr[0] = num;
}

C Main 看起来像这样:

include <ParFor.hpp>
parfor(calc, 1);

我可以将我的函数定义放在标题中。在 C++ 方面,我有一个函数(来自外部库),它采用 C++ lambda 或 C++ 仿函数。它被模板化为 lambda

我目前的想法是将我的 C 函数放在一个文件中,为它们编译 LLVM IR,并以某种方式强制将 clang 生成的 IR 内联到我的 C++ 函数中。C 调用 mycppfunc(mycfunc)。mycppfunc 具有用于 mycfunc 的 LLVM IR,并且能够生成正确的代码。我尝试了这个,但是由于似乎不兼容的 IR,编译器在链接阶段崩溃了。

4

1 回答 1

0

从代码片段和评论中,我了解到您尝试使用 SYCL 启动 C 内核parallel_for

从官方支持的角度来看,由于 SYCL 设备编译器按定义是 C++ 编译器(因为 SYCL 是基于 C++ 的编程模型),内核代码必须被解析为 C++ 代码。我认为没有任何官方方法可以实现与 C 代码的更多互操作性,而只是尝试通过设备编译器将其编译为 C++。但是,我的印象是,您对作为一个研究项目之外的互操作性进行试验更感兴趣。

为此,注入 IR 可能是一条值得研究的道路,但我认为这不会是直截了当的。根据您使用的 SYCL 功能,设备编译器可能需要执行额外的 IR 转换以实现正确的语义。因此,您可能必须复制这些转换才能注入您的 IR。您最终可能会为 C 重新发明一个 SYCL 编译器...

由于对此进行更深入的讨论需要对您的 SYCL 实现的内部实现细节有广泛的了解,我建议您直接联系您的实现的开发人员以进行澄清。

于 2020-05-13T15:13:43.563 回答