使用Clang将OpenCL编译为PTX时未解决的外部问题?
我正在按照上的说明进行操作,但当我尝试运行生成的PTX文件时,在clBuild中出现了以下错误使用Clang将OpenCL编译为PTX时未解决的外部问题?,clang,opencl,llvm-clang,Clang,Opencl,Llvm Clang,我正在按照上的说明进行操作,但当我尝试运行生成的PTX文件时,在clBuild中出现了以下错误 ptxas fatal : Unresolved extern function 'get_group_id' 在PTX文件中,我使用的每个OpenCL函数调用都有以下内容 .func (.param .b64 func_retval0) get_group_id ( .param .b32 get_group_id_param_0 ) ; 当我提供CL文件时,OpenCL运
ptxas fatal : Unresolved extern function 'get_group_id'
在PTX文件中,我使用的每个OpenCL函数调用都有以下内容
.func (.param .b64 func_retval0) get_group_id
(
.param .b32 get_group_id_param_0
)
;
当我提供CL文件时,OpenCL运行时创建的PTX文件中没有上述内容。相反,它有适当的特殊寄存器
以下(针对不同libclc库的链接)在LLVM IR到PTX编译期间给了我一个分段错误,错误如下:
fatal error: error in backend: Cannot cast between two non-generic address spaces
这些说明仍然有效吗?我还有别的事要做吗
我使用的是最新版本的libclc、clang3.7和Nvidia驱动程序352.39。问题是llvm不提供OpenCL设备代码库。然而,llvm提供了获取GPU线程ID的内部函数。现在,您必须使用clang的内置代码编写自己的
get\u global\u id
等植入,并使用nvptx目标将其编译为llvm位代码。在将IR降低到PTX之前,请使用llvm link
将设备库与已编译的OpenCL模块链接,就这样
您将如何编写此函数的示例:
#define __ptx_mad(a,b,c) ((a)*(b)+(c))
__attribute__((always_inline)) unsigned int get_global_id(unsigned int dimindx) {
switch (dimindx) {
case 0: return __ptx_mad(__nvvm_read_ptx_sreg_ntid_x(), __nvvm_read_ptx_sreg_ctaid_x(), __nvvm_read_ptx_sreg_tid_x());
case 1: return __ptx_mad(__nvvm_read_ptx_sreg_ntid_y(), __nvvm_read_ptx_sreg_ctaid_y(), __nvvm_read_ptx_sreg_tid_y());
case 2: return __ptx_mad(__nvvm_read_ptx_sreg_ntid_z(), __nvvm_read_ptx_sreg_ctaid_z(), __nvvm_read_ptx_sreg_tid_z());
default: return 0;
}
}