我想编译一个使用clAmdFFT,AMD OpenCL FFT的OpenCL程序,它是封闭源代码。
$ objdump -x libclAmdFft.Runtime.so
Dynamic Section:
NEEDED libOpenCL.so.1
Version References:
required from libOpenCL.so.1:
0x028568b0 0x00 05 OPENCL_1.0
在一台机器上,我使用的是AMD驱动程序,它附带了一个包含版本信息的libOpenCL.so,如下所示:
a$ objdump -T /opt/AMDAPP/lib/x86_64/libOpenCL.so
0000000000002610 g DF .text 0000000000000018 OPENCL_1.0 clGetSamplerInfo
00000000000032e0 g DF .text 0000000000000018 OPENCL_1.1 clSetEventCallback
0000000000002350 g DF .text 0000000000000018 OPENCL_1.2 clCreateSubDevices
这台机器上的一切都很好。
在另一台机器上,我使用的是nVidia驱动程序,它带有一个不包含版本信息的libOpenCL.so,如下所示:
b$ objdump -T /usr/lib/libOpenCL.so # -> /usr/lib/nvidia-current/libOpenCL.so
00000000000021f0 g DF .text 0000000000000018 Base clGetSamplerInfo
0000000000002a40 g DF .text 0000000000000018 Base clSetEventCallback
将程序与-llibOpenCL.so -llibclAmdFft.Runtime.so
相关联在此处失败,因为clAmdFft想要链接到带标记的符号:
libclAmdFftRuntime.so: undefinded reference to `clCreateBuffer@OPENCL_1.0`
动态链接器也会产生此投诉:
b$ ldd libclAmdFft.Runtime.so
libclAmdFft.Runtime.so: …/libOpenCL.so.1: no version information available …
由于nVidia驱动程序实现OpenCL 1.1并且AmdFFT只需要1.0,因此如果我可以说服它Base = OPENCL_1.0
,它应该可以工作。这可能吗?
我不能强迫nVidia用户安装另一个版本,因为libOpenCL是驱动程序的一部分,比如libGL。
与--unresolved-symbols=ignore-in-shared-libs
的链接成功,但生成的二进制文件不再找到FFT库。
由于OpenCL将依赖于设备的部分拆分为ICD库,如果我从AMD驱动程序提供libOpenCL.so,即使在nVidia机器上动态加载正确的ICD, 也会工作来自/etc/OpenCL/vendors/nvidia.icd,但我不确定这是否实际上是可移植的,例如该目录是硬编码的。