问题标签 [nvrtc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - cuModuleGetFunction 返回未找到
我想用 nvrtc JIT 编译器编译 CUDA 内核来提高我的应用程序的性能(所以我有更多的指令获取,但我保存了多个数组访问)。
这些函数看起来像这样,由我的函数生成器生成(不是那么重要):
我正在使用以下函数编译上面的代码:
一切正常,除了cuModuleGetFunction
返回CUDA_ERROR_NOT_FOUND
。发生该错误是因为GetSumOfBranches
在 PTX 文件中找不到。
然而,输出printf("%s", ptx);
是这样的:
在我看来,一切都很好,GetSumOfBranches
可以被 cuModuleGetFunction
. 你能解释一下为什么吗?
第二个问题
当我发表评论时std::string savedString = std::string(programText);
,PTX 的输出只是:
这很奇怪,因为savedString
根本没有使用......
c - 您如何包含标准 CUDA 库以与 NVRTC 代码链接?
具体来说,我的问题是我有需要<curand_kernel.h>
运行的 CUDA 代码。默认情况下,这不包含在 NVRTC 中。大概然后在创建程序上下文(即调用nvrtcCreateProgram
)时,我必须发送文件名(curand_kernel.h
)以及源代码curand_kernel.h
?我觉得我不应该这样做。
很难说;我还没有设法从 NVIDIA 找到一个需要像这样的标准 CUDA 文件作为源的示例,所以我真的不明白语法是什么。一些问题:curand_kernel.h
还包括...我是否必须对这些中的每一个都做同样的事情?我什至不确定 NVRTC 编译器是否会在 上正确运行curand_kernel.h
,因为它不支持某些语言功能,不是吗?
下一篇:如果你已经将头文件的源代码发送到了nvrtcCreateProgram
,我是否还必须#include
在要执行的代码中发送它/如果我这样做会导致错误吗?
一个指向执行此操作或类似操作的示例代码的链接将比一个简单的答案更受欢迎;我真的没有找到任何东西。
struct - 如何正确地将参数作为结构传递给 NVRTC?
这是我目前正在处理的主要存储库的摘录。我非常接近 Cuda C 编译器的工作 F# 引用,但我无法弄清楚如何从主机端正确地将参数传递给函数。
尽管有 pack pragma,NVRTC 7.5 Cuda 编译器正在做一些其他的优化,我不知道它是什么。
因为我正在处理 F# 引用,所以我需要将参数作为单个结构传递才能使其工作。如果我将函数从更改kernel_main(global_array_float x)
为类似的东西,kernel_main(int x_length, float *x_pointer)
那么它就可以工作,但我这不是报价系统预先给我的形式,我想避免做额外的工作来使 F# 更像 C。
知道我可以尝试什么吗?
optimization - 为什么 NVRTC 不优化我的整数除法和模运算?
我在 NVRTC 中编译了一个内核:
我知道整数除法和模数在 CUDA GPU 上非常昂贵。但是我认为这种除以 2 的幂应该优化为位操作,直到我发现它不是:
似乎kernel_B
只是跑得更快。当省略内核中的所有其他代码时,以 1024 个大小为 1024 的块启动,nvprof
显示平均kernel_A
运行时间为15.2us,而平均kernel_B
运行时间为7.4us。我推测 NVRTC 没有优化整数除法和模数。
该结果是在 GeForce 750 Ti、CUDA 8.0 上获得的,平均来自 100 次调用。给定的编译器选项nvrtcCompileProgram()
是-arch compute_50
.
这是预期的吗?
cuda - NVRTC 对 Win32 不可用吗?
我正在运行 Python27 x32 并收到此错误:
我也试过cuda8。
我意识到,NVRTC 文档将 x64 列为要求:
NVRTC 需要以下系统配置: 操作系统:Linux x86_64、Linux ppc64le、Linux aarch64、Windows x86_64 或 Mac OS X。
(nvrtc64_75.dll
真的有0x8664
IMAGE_FILE_HEADER 和0x20b
(pe32+) 魔法。)
我正在尝试将libgpuarraypygpu
与theano一起使用,并且我之前已经使用 Win32 mingw 构建了它。
我现在的理解是我需要安装一个 x64 版本的 python 并从那里开始。我知道我可以改用conda并且 libgpuarray 中的文档谈论 msvc,顺便说一句。到目前为止,它与 mingw 合作。
我解释得对吗?NVRTC真的没有Win32版本吗?
编辑:在%1 is not a valid Win32
conda x32 和 msvc 上遇到了同样的错误(这并不奇怪)。
cuda - 是否有可以在字符串中使用 NVRTC 编译的标头列表?
(使用 NVRTC 运行时编译器)
有一串CUDA函数:
被驱动API成功编译成ptx代码并在程序中用于计算c=a+b。
但是当我尝试一些标题来包含一个算法时
它返回一个错误说
或者
取决于包含或标头的类(例如 device_vector)。
此外,文档显示 cuFFT 和推力都只能在主机端使用,似乎我不能使用我想在每个线程块上独立使用的任何“部分”算法。
是否有一些支持 cuda 的算法的标头列表用作每个块:
在任何目标机器上成功编译和运行,或者是否可以将这些算法库(对于 device_vector 的推力)从主机端链接到 ptx 链接器,以便我可以以某种方式从编译的内核中使用它们?如果这些都不可能,那么我是否需要自己编写傅立叶变换并通过自己实现算法使其“快速”?
compilation - 序列化 CUfunction 对象
是否可以将CUfunction
NVRTC 生成的对象序列化并保存在非易失性内存(磁盘、SSD 等)上,以便以后可以再次使用,而无需经过 JIT 编译过程?
cuda - 在 CUDA NVRTC 代码中包含 C 标准头文件
我正在编写一个在运行时使用 NVRTC(CUDA 9.2 版和 NVRTC 7.5 版)编译的 CUDA 内核,它需要stdint.h
标头,以便拥有int32_t
等类型。
如果我编写没有包含的内核源代码,它可以正常工作。例如内核
编译为 PTX 代码,其中 f 定义为.visible .entry f
。
但是如果内核源代码是
它报告A function without execution space annotations (__host__/__device__/__global__) is considered a host function, and host functions are not allowed in JIT mode.
(也没有extern "C"
)。
传递-default-device
使 PTX 代码.visible .func f
,因此无法从主机调用该函数。
有没有办法在源代码中包含标头,并且仍然具有__global__
入口功能?或者,一种方法可以知道 NVRTC 编译器使用哪种整数大小约定,以便int32_t
可以手动定义等类型?
编辑: 显示问题的示例程序:
当//#include <stdint.h>
内核源代码被取消注释时,它不再编译。取消注释时//options.push_back("-default-device");
,它会编译但不会将函数标记f
为.entry
.
CMakeLists.txt 进行编译(需要 CUDA 驱动 API + NVRTC)
c++ - 设备函数指针作为模板参数
由于某些原因(超出了这个问题的范围),我有一个模板结构:
可以这样使用:
这适用于 nvcc(cuda 10.0),但会因 nvrtc(JIT 编译)而失败,并出现以下错误:
错误:属性可能不会出现在这里
我应该如何修改此代码以使其与 nvrtc 一起使用?或者我应该在命令行中添加标志?
cuda - 将 CUDA-gdb 与 NVRTC 一起使用
我有一个应用程序,它生成 CUDA C++ 源代码,在运行时使用 将其编译成 PTX NVRTC
,然后使用 CUDA 驱动程序 API 从它创建 CUDA 模块。
如果我使用 调试此应用程序cuda-gdb
,它会在回溯中显示内核(发生错误的位置),但不显示行号。
我将生成的源代码导出到一个文件中,并将目录提供给cuda-gdb
使用该--directory
选项。我还尝试将其文件名传递给nvrtcCreateProgram()
(name
参数)。我使用编译选项--device-debug
和--generate-line-info
NVRTC。
有没有办法让cuda-gdb
知道生成的源代码文件的位置,并在其回溯中显示行号信息?