编译用于GPU的C ++程序的一部分

埃里克·奥·莱比格特

是否可以将具有nvcc的GPU的代码(C ++)编译为共享对象(.so文件),然后从C ++程序(在本例中为Cern的ROOT,它实际上是C ++解释器(“ CINT”))动态加载代码)。

我要运行的一个简单示例是:

extern "C"
void TestCompiled() {
  printf("test\n");
  exit(0); 
}

此代码使用编译nvcc --compiler-options '-fPIC' -o TestCompiled_C.so --shared TestCompiled.cu使用以下命令将共享对象加载到ROOT中:

{ // Test.C program
  int error, check;
  check = gROOT->LoadMacro("TestCompiled_C.so", &error);
  cout << "check " << check << " " << " error: " << error << endl;
  TestCompiled();  // run macro
  exit(0); 
}

可以加载库,但是找不到TestCompiled()

$ root -b -l Test.C
root [0] 
Processing Test.C...
check 0  error: 0
Error: Function Hello() is not defined in current scope  Test.C:11:
*** Interpreter error recovered ***

通过使用ROOT编译第一个测试脚本来完成相同的工作(无代码extern行,使用编译root TestCompiled.C++)……当nvcc进行编译时,我可以尝试使C ++程序找到测试功能吗?

埃里克·奥·莱比格特

我正在复制RootTalk论坛中解决问题答案的要点,以供参考

关键是,ROOT(CINT)的C解释器需要外部编译函数的“ CINT词典”。(通过ROOT编译时没有问题,因为ACLiC在预编译宏[ root TestCompiled.C++]时会创建此字典)。

因此,TestCompiled.h++必须创建一个接口

#ifdef __cplusplus
extern "C" {
#endif

  void TestCompiled(void);

#ifdef __cplusplus
} /* end of extern "C" */
#endif

然后必须将接口与共享库一起装入ROOT内部:

{ // Test.C ROOT/CINT unnamed macro (interpreted)
  Int_t check, error;
  check = gROOT->LoadMacro("TestCompiled_C.so", &error);
  std::cout << "_C.so check " << check << " error " << error << std::endl;
  check = gROOT->LoadMacro("TestCompiled.h++", &error);
  std::cout << "_h.so check " << check << " error " << error << std::endl;
  TestCompiled(); // execute the compiled function
}

现在,ROOT可以使用外部编译的程序:root -b -l -n -q Test.C有效。

可以使用例如以下的g ++进行测试TestCompiled.C

#include <cstdio>
extern "C" void TestCompiled(void) { printf("test\n"); }

用...编译

g++ -fPIC -shared -o TestCompiled_C.so TestCompiled.C

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

编译用于GPU的C ++程序的一部分

来自分类Dev

为什么Preproccessor不像C&C ++这样的Java程序的一部分?

来自分类Dev

一部分首先被编译

来自分类Dev

作为C#安装程序向导的一部分安装Matlab MCR

来自分类Dev

从 C# 程序集中提取版本作为 Jenkins 管道的一部分

来自分类Dev

如何使用oprofile计算C程序一部分的执行时间?

来自分类Dev

在C中读取文件的一部分

来自分类Dev

在C中传递结构的一部分

来自分类Dev

C是.NET框架的一部分吗?

来自分类Dev

C ++将编译后的代码中使用的一部分代码的大小

来自分类Dev

C#Asp.net Site.css编译时缺少一部分

来自分类Dev

我如何编译(运行)C# 中的一部分代码?

来自分类Dev

索引错误-适用于我的代码的一部分,而不适用于另一部分

来自分类Dev

把手,避免编译(忽略)模板的一部分?

来自分类Dev

如何使cMake仅对项目中的一部分目录使用Debug编译模式?

来自分类Dev

.xsd不是此编译的一部分-错误

来自分类Dev

在编译时排除功能模板的一部分

来自分类Dev

Angular 5 升级 - 模块构建失败:customPackage 不是编译输出的一部分

来自分类Dev

UITapGesture仅适用于一部分

来自分类Dev

是否可以将颜色应用于字符的一部分?

来自分类Dev

递归复制xml的一部分并将模板应用于副本

来自分类Dev

是否将语言标准仅应用于源文件的一部分?

来自分类Dev

MongoDB $ match不适用于子文档的一部分

来自分类Dev

将StandardScaler应用于数据集的一部分

来自分类Dev

将设计应用于Android中的一部分按钮

来自分类Dev

正则表达式,用于标识javascript中URL的一部分

来自分类Dev

MySQL-WHERE语句仅适用于SELECT语句的一部分

来自分类Dev

MongoDB $ match不适用于子文档的一部分

来自分类Dev

grep文件仅用于行的一部分

Related 相关文章

  1. 1

    编译用于GPU的C ++程序的一部分

  2. 2

    为什么Preproccessor不像C&C ++这样的Java程序的一部分?

  3. 3

    一部分首先被编译

  4. 4

    作为C#安装程序向导的一部分安装Matlab MCR

  5. 5

    从 C# 程序集中提取版本作为 Jenkins 管道的一部分

  6. 6

    如何使用oprofile计算C程序一部分的执行时间?

  7. 7

    在C中读取文件的一部分

  8. 8

    在C中传递结构的一部分

  9. 9

    C是.NET框架的一部分吗?

  10. 10

    C ++将编译后的代码中使用的一部分代码的大小

  11. 11

    C#Asp.net Site.css编译时缺少一部分

  12. 12

    我如何编译(运行)C# 中的一部分代码?

  13. 13

    索引错误-适用于我的代码的一部分,而不适用于另一部分

  14. 14

    把手,避免编译(忽略)模板的一部分?

  15. 15

    如何使cMake仅对项目中的一部分目录使用Debug编译模式?

  16. 16

    .xsd不是此编译的一部分-错误

  17. 17

    在编译时排除功能模板的一部分

  18. 18

    Angular 5 升级 - 模块构建失败:customPackage 不是编译输出的一部分

  19. 19

    UITapGesture仅适用于一部分

  20. 20

    是否可以将颜色应用于字符的一部分?

  21. 21

    递归复制xml的一部分并将模板应用于副本

  22. 22

    是否将语言标准仅应用于源文件的一部分?

  23. 23

    MongoDB $ match不适用于子文档的一部分

  24. 24

    将StandardScaler应用于数据集的一部分

  25. 25

    将设计应用于Android中的一部分按钮

  26. 26

    正则表达式,用于标识javascript中URL的一部分

  27. 27

    MySQL-WHERE语句仅适用于SELECT语句的一部分

  28. 28

    MongoDB $ match不适用于子文档的一部分

  29. 29

    grep文件仅用于行的一部分

热门标签

归档