使用LLVM 3.3后端为AMD编译OpenCL

时间:2013-06-28 09:40:42

标签: clang opencl llvm amd-processor

如何使用LLVM 3.3中的新R600后端生成适合传递到AMD卡上的OpenCL clCreateProgramWithBinary API的二进制文件?是否有任何代码示例如何执行此操作?

我已经看到了如何编译AMD的clang命令行,但我还没有看到如何使用驱动程序的输出。

非常感谢。

2 个答案:

答案 0 :(得分:1)

您可以在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
}

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

答案 1 :(得分:0)

也许您应该使用 libclc 来使用OpenCL的内置函数。(https://libclc.llvm.org/
不幸的是,它要求LLVM为3.7或更高 这是因为LLVM 3.7及更高版本仅支持AMD GPU后端。 在LLVM 3.3中,clang中没有opencl前端,llvm中也没有amd-gpu后端。
(铿锵3.3:http://releases.llvm.org/3.3/tools/clang/docs/UsersManual.html
(LLVM 3.3:http://releases.llvm.org/3.3/docs/index.html
(LLVM 3.7:http://releases.llvm.org/3.7.0/docs/AMDGPUUsage.html
(我不知道为什么AMD GPU后端支持不在发行说明中。)

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

如果您无法使用LLVM 3.3,请查找R600后端。我不确切知道,但AMDGPU Backend的前名是R600 Backend。 (https://www.phoronix.com/scan.php?page=news_item&px=amd-r600-amdgpu-llvm