【问题标题】:Pass a function body from C to C++将函数体从 C 传递到 C++
【发布时间】:2020-08-29 17:26:17
【问题描述】:

不确定这是否可能。 我需要将一个函数从 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,编译器在链接阶段崩溃了。

【问题讨论】:

  • 我们看到的代码比(模糊)描述的代码更容易推理。
  • 如何在没有函数指针的情况下表示 C 函数?
  • @StoryTeller-UnslanderMonica 添加了一些代码 sn-ps 以澄清
  • “我试图杀死一只苍蝇,所以我引爆了一枚战术核武器,现在这座城市和其中的一切都具有放射性,请派人帮忙”。这就是对您尝试的描述听起来或多或少的方式。让我们试着收拾残局。您可以从 C++ 调用 C 代码。您不能直接从 C 调用 C++ 特定代码(模板、lambda、成员函数)。您可以通过使用 extern "C" 链接将模板或任何内容包装在普通 C++ 函数中来间接从 C 调用此类 C++ 代码。你试过吗?

标签: c language-interoperability sycl


【解决方案1】:

根据代码 sn-ps 和 cmets,我了解到您尝试使用 SYCL parallel_for 启动 C 内核。

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

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

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

【讨论】:

  • 感谢您富有洞察力的评论!是的,我现在正在研究 IR 注射,希望能轻松获胜。 +1
猜你喜欢
  • 2017-01-07
  • 1970-01-01
  • 2013-04-26
  • 2018-07-28
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
相关资源
最近更新 更多