我已经写了一个惊人的内核,这将给我带来名誉和财富-如果我只能用NVRTC编译它:
#include <stdio.h>
__global__ void do_stuff() { }
字符串
我本来希望系统头可以被(运行时)编译器识别,就像一个普通的编译器一样,并且这将“正常工作”(模任何printf特定的机器)。或者,如果它不起作用,我会期望得到一个错误消息,说明stdio.h
的源代码不能通过“程序创建”API调用(nvrtcCreateProgram()
)获得,因为我将NULL
和NULL
作为它的最后两个参数传递。
然而,我得到的是以下内容:
/usr/include/stdio.h(33): catastrophic error: cannot open source file "stddef.h"
型
我觉得很奇怪。这意味着运行时编译器 * 能够 * 查看系统头文件,但 * 不能 * 找到stddef.h
,就像nvcc或主机端编译器一样。
为什么会发生这种情况,惯用/推荐的解决方法是什么?
注意:我想一个解决办法,这将是跨平台,而不仅仅是我的个人机器上工作。
2条答案
按热度按时间m1m5dgzv1#
Robert Crovella亲切地提醒我的“JITify”库中采用了另一种方法。虽然这似乎没有很好地记录,但Jitify预先包含了它认为适合的各种标题的处理片段。特别是对于
<climits>
/<limits.h>
:字符串
对于
stddef.h
:型
对于
stdio.h
:型
如果您包含这些字符串作为头文件,并使用适当的名称作为键,那么您的内核很可能会编译。
事实上,可以在
jitify.hpp
中使用这些和其他迷你头文件形成头文件,用于非NVRTC内核编译。这也可能有用。最后一点:上面的常量不指定
__device__
执行空间。因此,要么在其中添加__device__
,要么告诉编译器假设函数仅在设备上执行,除非另有说明;这是--device-as-default-execution-space
NVRTC编译器选项。wfsdck302#
这里有两个可能有效的解决方案,但我宁愿“避免”。如果他们是唯一合理的行动方案毕竟-请评论并说:
1.添加
stddef.h
的特定路径作为编译器参数(-I
或--include-path=
)。1.将
stddef.h
的源传递给nvrtcCreateProgram()
调用。