【问题标题】:How to use preprocessor symbols in PyCUDA?如何在 PyCUDA 中使用预处理器符号?
【发布时间】: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 代码中发生的事情类似,对吧?

标签: python cuda pycuda


【解决方案1】:

与编译任何 C 或 C++ 代码一样,预处理器符号的外部操作(我的意思是在代码本身之外)需要将额外的参数传递给编译器。如果你有这个代码:

__global__ void func(...) {
...
#ifdef X
do something
#endif 

}

那么在编译过程中设置X的方法是将-DX传递给编译器,编译器在当前预处理过程中定义符号X

您可以在 PyCUDA 中执行完全相同的操作,方法是使用 SourceModule 构造函数中的 options 关键字将选项传递给构建。编译器选项作为列表传递,因此您的 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 实例。之后,它应该就可以工作了……

【讨论】:

  • 嘿,我已经用一些简单的代码对其进行了测试,它按预期工作。如果我发现自己需要更好地了解这里真正发生的事情,我可以使用任何参考资料吗?谢谢!
  • 我不太确定您想进一步了解什么,但所有内容都包含在 (1) 关于 C 预处理器的任何好书或教程、(2) nvcc 文档和 (3) PyCUDA文档
  • 好的。将 if my_global_var 更改为 tryexcept NameError 可能会很好 - 因为如果未定义 my_global_var,此特定代码将引发错误。
猜你喜欢
  • 2010-09-26
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
相关资源
最近更新 更多