7

クローズドソースであるclAmdFFT、AMDsOpenCLFFTを使用する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

あるマシンでは、次のようなバージョン情報を含むlibOpenCL.soに付属しているAMDドライバーを使用しています。

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

このマシンではすべて問題ありません。

別のマシンでは、次のようなバージョン情報を含まないlibOpenCL.soに付属するnVidiaドライバーを使用しています。

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.soclAmdFftはタグ付けされたシンボルにリンクしたいので、プログラムとのリンクはここでは失敗します。

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ドライバーはOpenCL1.1を実装し、AmdFFTは1.0しか必要としないので、私がそれを納得させることができれば、それは機能するはずですBase = OPENCL_1.0。それは可能ですか?

libOpenCLはlibGLのようにドライバーの一部であるため、nVidiaユーザーに別のバージョンをインストールするように強制することはできません。


とのリンクは--unresolved-symbols=ignore-in-shared-libs成功しますが、結果のバイナリはFFTライブラリを検出しなくなります。


OpenCLはデバイスに依存する部分をICDライブラリに分割するため AMDドライバーからlibOpenCL.soを指定すると、/ etc / OpenCL / vendors/nvidiaから正しいICDを動的にロードするnVidiaマシンでも機能します。 icdですが、これが実際に移植可能かどうかはわかりません。たとえば、ディレクトリはハードコーディングされています。

4

0 に答える 0