有一个用C语言编写的带有一些CUDA内核的程序,我需要调整这个程序,使用PyCUDA在python中运行。现在,在这个C代码中定义了一些全局变量,其中一些内核通过#ifdef访问这些变量。我想要做的是在python中定义那些全局变量,然后只需复制我的CUDA C内核代码并使用SourceModule方案运行它们(假设我只是懒惰)。我想象这样的事情:
my_global_var=True
mod=SourceModule(""" __global__ void func() {
...
#ifdef my_global_var
do something
#endif }
""")
有没有办法做到这一点?显然,这种天真的尝试根本不起作用。我应该使用某种特殊指针或类似的东西吗? 换句话说,当用PyCUDA编译的CUDA C内核中有#ifdef时,会发生什么?
修改 好吧,我可能在这里滥用“全局变量”一词。 C代码或多或少看起来像这样:
#define X
__global__ void func(...) {
...
#ifdef X
do something
#endif }
我想要实现的是在PyCUDA中使用该C代码而不会过多地使用它。所以我想复制“ global _ void func ...”,把它放在PyCUDA SourceModule中并在python中定义那个X(无论是全局变量还是其他不一样的东西)(就像在第一个伪代码)。有可能吗?
答案 0 :(得分:0)
与编译任何C或C ++代码一样,预处理器符号的外部操作(我的意思是代码本身之外)需要将其他参数传递给编译器。如果你有这个代码:
__global__ void func(...) {
...
#ifdef X
do something
#endif
}
然后在编译期间设置X
的方法是将-DX
传递给编译器,编译器在当前预处理器传递期间定义符号X
。
您可以使用options
构造函数中的SourceModule
关键字将选项传递给构建,从而在PyCUDA中执行完全相同的操作。编译器选项作为列表传递,因此您的PyCUDA示例可以实现如下:
my_global_var=True
....
build_options = []
if my_global_var:
build_options.append('-Dmy_global_var')
mod=SourceModule(""" __global__ void func() {
...
#ifdef my_global_var
do something
#endif }
""", options=build_options)
[免责声明:完全未经测试,使用风险自负 - 我没有工作的PyCUDA安装ATM]
在这里,我们只是构建一个包含任意条目的列表,因为您需要将这些选项传递给编译器,然后使用这些选项实例化SourceModule
实例。在那之后,它应该工作......