7

我想编译一个使用 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 机器上,它也会从 /etc/OpenCL/vendors/nvidia 动态加载正确的 ICD。 icd,但我不确定这是否真的是可移植的,例如,目录是硬编码的。

4

0 回答 0