如何在PyCUDA中使用预处理程序符号?

时间:2013-12-30 16:33:31

标签: python cuda pycuda

有一个用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(无论是全局变量还是其他不一样的东西)(就像在第一个伪代码)。有可能吗?

1 个答案:

答案 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实例。在那之后,它应该工作......