【发布时间】:2014-01-17 13:49:49
【问题描述】:
有一个用 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(不管它是全局变量还是其他东西)(就像在第一个伪代码)。有可能吗?
【问题讨论】:
-
你能澄清一下你在这里实际尝试做的事情吗,也许有一个更充实的例子?在您显示的 CUDA 代码中,
my_global_var是预处理器符号,而不是全局变量(在 CUDA 代码的上下文中具有特定含义)。你写的现在没有多大意义 -
您好,谢谢您的回答。我编辑了主帖,希望现在更容易理解。
-
那么您希望能够在使用 PyCUDA 的 SourceModule 进行 JIT 编译期间控制预处理器符号的设置?
-
如果我理解正确的话,是的。
-
@talonmies 哦,我想我现在明白了!所以基本上我能做的是在python中定义我的变量X,然后(在python中)写一些类似if X=True: then string+="do something"(其中string是我的C内核代码)的东西?然后只需执行 SourceModule(string)。这应该与 C 代码中发生的事情类似,对吧?