Clang 使用LLVM3.3后端为AMD编译OpenCL

Clang 使用LLVM3.3后端为AMD编译OpenCL,clang,opencl,llvm,amd-gpu,Clang,Opencl,Llvm,Amd Gpu,如何使用LLVM 3.3中新的R600后端生成适合传递给AMD卡上OpenCL clCreateProgramWithBinary API的二进制文件?有关于如何做到这一点的代码示例吗 我已经看到了一个关于如何为AMD编译的命令行,但是我还没有看到如何使用驱动程序的输出 非常感谢。您可以在llvm/test/CodeGen/R600中阅读测试用例 例如: add.ll ;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s ;CHE

如何使用LLVM 3.3中新的R600后端生成适合传递给AMD卡上OpenCL clCreateProgramWithBinary API的二进制文件?有关于如何做到这一点的代码示例吗

我已经看到了一个关于如何为AMD编译的命令行,但是我还没有看到如何使用驱动程序的输出


非常感谢。

您可以在
llvm/test/CodeGen/R600
中阅读测试用例

例如:
add.ll

;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s

;CHECK: ADD_INT T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}

;CHECK: ADD_INT * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}

;CHECK: ADD_INT * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}

;CHECK: ADD_INT * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}

define void @test(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) {

  %b_ptr = getelementptr <4 x i32> addrspace(1)* %in, i32 1

  %a = load <4 x i32> addrspace(1) * %in

  %b = load <4 x i32> addrspace(1) * %b_ptr

  %result = add <4 x i32> %a, %b

  store <4 x i32> %result, <4 x i32> addrspace(1)* %out

  ret void
}
;运行:llc<%s-march=r600-mcpu=redwood |文件检查%s
;检查:添加\u INT T{[0-9]+\[XYZW],T[0-9]+\[XYZW],T[0-9]+\[XYZW]}
;检查:添加\u INT*T{[0-9]+\[XYZW],T[0-9]+\[XYZW],T[0-9]+\[XYZW]}
;检查:添加\u INT*T{[0-9]+\[XYZW],T[0-9]+\[XYZW],T[0-9]+\[XYZW]}
;检查:添加\u INT*T{[0-9]+\[XYZW],T[0-9]+\[XYZW],T[0-9]+\[XYZW]}
在测试时定义void(地址空间(1)*%out,地址空间(1)*%in){
%b_ptr=getelementptr addrspace(1)*%in,i32 1
%a=加载地址空间(1)*%in
%b=加载地址空间(1)*%b\u ptr
%结果=添加%a,%b
存储%result,地址空间(1)*%out
ret void
}

然后您可以通过clCreateProgramWithBinary直接使用输出。

也许您应该使用libclc来使用OpenCL的内置函数。(
不幸的是,它要求LLVM为3.7或更高。
这是因为LLVM 3.7及更高版本仅支持AMD GPU后端。 在LLVM 3.3中,clang中没有opencl前端,LLVM中也没有amd gpu后端。
(叮当声3.3:)
(LLVM 3.3:)
(LLVM 3.7:)
(我不知道为什么发布说明中没有AMD GPU后端支持。)

因此,如果您想为AMD GPU编译OpenCL内核,则需要使用LLVM 3.7版或更高版本

如果您负担不起使用LLVM 3.3,请寻找R600后端。我不知道确切情况,但AMDGPU后端的前名称是R600后端。 ()