cupy.RawModule 使用 name_expressions 和 nvcc 和/或路径
Posted
技术标签:
【中文标题】cupy.RawModule 使用 name_expressions 和 nvcc 和/或路径【英文标题】:cupy.RawModule using name_expressions and nvcc and/or path 【发布时间】:2020-10-20 09:41:52 【问题描述】:我正在使用 CuPy 测试库中的 cuda 内核。更具体地说,我使用cupy.RawModule
来利用python 中的内核。但是,内核是模板化的并包含在命名空间中。在 CuPy 8.0.0 中的 RawModule 的 name_expressions
参数之前,我必须手动将 c++ 损坏的名称复制到 RawModule 的 get_function()
方法中。使用name_expressions
我认为这应该是可能的,但是,这需要使用code
参数结合backend='nvrtc'
从源代码编译代码。
是否可以启用(以下任何一项)?:
name_expressions
与 path
结合使用
name_expressions
与 backend='nvcc'
结合使用
【问题讨论】:
【参考方案1】:是否可以启用(以下任何一项)?:
'name_expressions' 与 'path' 结合使用 'name_expressions' 与 'backend'='nvcc' 结合使用
这两个问题的答案都是否定的。
name_expressions
功能需要使用 NVRTC 即时 (JIT) 编译 C++ 模板内核的源代码,而 path
参数用于加载外部 cubin、fatbin 或 ptx 代码。如果要编译外部源代码,可以先在 Python 中加载它,然后将其作为 code
参数传递:
with open('my_cuda_cpp_code.cu') as f:
code = f.read()
mod = cp.RawModule(code=code, name_expressions=(...), ...)
不幸的是,与 NVRTC 不同的是,NVCC 不提供 API 来返回错误名称,因此无法使用 NVCC。如果您将backend='nvcc'
传递给 RawModule,则会引发错误。
【讨论】:
啊,我明白了,然后我继续使用“路径”到预编译的 .ptx 文件并手动复制我的重整名称,希望 NVCC 在未来获得重整提取功能。 是因为你没有CUDA C++源代码吗? 内核是我写的,我使用CuPy对内核进行单元测试。但是,我需要将包含具有相同编译器标志的内核的 .cu 文件编译为生产代码中使用的 nvcc。 然后你可以像我上面那样加载源文件,并在options
参数中设置编译器标志:mod = cp.RawModule(code=code, name_expressions=(...), backend='nvrtc', options=('-O3', ...))
。
谢谢,但nvrtc
不支持我用于nvcc
的所有编译器标志。无论如何尝试通过,我遇到了两个错误:1)cupy.cuda.compiler.CompileException: nvrtc: error: unrecognized option -O2 found
2)cupy.cuda.compiler.CompileException: /path_to/myheader.h (3): catastrophic error: cannot open source file "cstdint"
由于某种原因它没有找到标准包含。指定code=code
后,我必须提供-I
选项才能找到源文件的标头。以上是关于cupy.RawModule 使用 name_expressions 和 nvcc 和/或路径的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?