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_expressionspath 结合使用 name_expressionsbackend='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)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”