我正在尝试加载我用clang+llvm 6.0.1创建的SPIR二进制文件。
创建了几个不同的文件:
clang -target spir-unknown-unknown -cl-std=CL1.2 -c -emit-llvm -Xclang -finclude-default-header OCLkernel.cl
clang -target amdgcn-amd-amdhsa -cl-std=CL1.2 -c -emit-llvm -Xclang -finclude-default-header OCLkernel.cl
clang -cc1 -emit-llvm-bc -triple spir-unknown-unknown -cl-std=CL1.2 -include "include\opencl-c.h" OCLkernel.cl这一切都发生在windows上,安装了AMD应用SDK 3和肾上腺素18.6.1驱动程序。
在此之后,我尝试从二进制文件创建一个程序:
clCreateProgramWithBinary(context, 1, &device, &programSrcSize, (const unsigned char**)&programSrc, 0 , &status)这一切都进行得很好,我在这里没有任何错误,但是当我尝试构建它之后:
clBuildProgram(program, 1, &device, " –x spir -spir-std=1.2", NULL, NULL);我得到的错误是:
调用错误CL_INVALID_COMPILER_OPTIONS时clBuildProgram
我试过不用"-x spir.“也是,但我只得到了一个:
错误:无效值(生产者:'LLVM6.0.1‘阅读器:'LLVM 3.9.0svn')
编辑:
CL_DEVICE_NAME: gfx900
CL_DEVICE_VERSION: OpenCL 2.0AMD-APP (2580.6)
CL_DEVICE_OPENCL_C_VERSION: OpenCL C2.0
CL_DRIVER_VERSION: 2580.6 (PAL,HSAIL)
CL_DEVICE_SPIR_VERSIONS: 1.2
运行clCreateProgramWithBinary后,我使用clGetProgramBuildInfo查询设备并获取:
CL_PROGRAM_BINARY_TYPE = CL_PROGRAM_BINARY_TYPE_INTERMEDIATE
所以这应该意味着二进制被识别,否则我猜它会返回CL_PROGRAM_BINARY_TYPE_NONE。
EDIT2:
我认为clang并不是在创建一个“好”二进制,而是如何创建它呢?
感谢你的帮助!
发布于 2019-04-06 09:25:37
不幸的是,对SPIR的支持已从AMD驱动程序中悄然移除,请参阅AMD社区论坛的这个线程中的dipak答案:
https://community.amd.com/thread/232093
关于您的第二个问题:通用clang+LLVM (不是由AMD调优的秘密版本,并包含在它们的专有驱动程序中)仍然不能产生与通用Windows驱动程序兼容的二进制文件,但是对于Linux:所有新的AMD的ROCm,AMD和Mesa3D运行时都包括在内来说是可能的。
LLVM AMDGPU后端开发人员为什么不优先为Windows驱动程序生成二进制文件,这对我来说是个谜,因为有几个GCN汇编程序项目通过Windows OpenCL接口提供了这样的功能:CLRadeonExtender、ASM4GCN、HepPas等等。此外,我知道一个clang+LLVM的无证叉 (正如它的作者所述)会生成这样的OpenCL二进制文件!“霍雷肖,天地万物比你的哲学所梦想的还要多。”
https://stackoverflow.com/questions/52334122
复制相似问题