我试图向同事展示我可以用OpenCL做的花哨的东西,但是exec不会在她的电脑上运行。一些libopencl.so
(或类似)文件丢失(即她没有安装OpenCL)。所以我可能更基本的(Linux)问题是,如何包含所有必需的so
文件,我的小C
+ OpenCL
程序也将在没有OpenCL的机器上运行?
答案 0 :(得分:2)
正如Damon的评论已经指出的那样,这是不可能以一般方式进行的,因为每种设备都有自己的供应商,而且该供应商有自己的OpenCL实现。但是,如果您想要做的只是拥有可在大多数Linux计算机上运行的OpenCL应用程序的“可移植”副本,那么有一种方法可以实现这一目标。
下载AMD APP SDK(目前版本为2.4)。我将假设其64位版本,但它应该与32位或其他版本号完全相同,只需更改相应的字符串。
将SDK解压缩到应用程序可执行文件的子目录。因此,例如,如果应用程序位于$ HOME / myapp中,则SDK文件应位于$ HOME / myapp / AMD-APP-SDK-v2.4-lnx64中。
将icd-registration.tgz存档中的ICD文件解压缩到名为icd的文件夹中。所以我们应该有$ HOME / myapp / AMD-APP-SDK-v2.4-lnx64 / icd / amdocl32.icd(和amdocl64.icd)。
现在我们有了AMD APP SDK便携式安装的工作方式,它可以在大多数x86处理器上运行。我们只需要在启动应用程序之前设置适当的环境变量。由于我不是GNU / Linux人员,并且不太了解bash,因此我已经硬编码了可移植目录的路径。据推测,在某种程度上可以自动获取当前位置,这显然会更好。
#!/bin/bash
DIRECTORY=$HOME/myapp
export OPENCL_VENDOR_PATH=$DIRECTORY/AMD-APP-SDK-v2.4-lnx64/icd
export AMDAPPSDKROOT=$DIRECTORY/AMD-APP-SDK-v2.4-lnx64
export LD_LIBRARY_PATH=$AMDAPPSDKROOT/lib/x86_64:$LD_LIBRARY_PATH
./myapp
上述脚本应放在应用程序的根目录中,即$ HOME / myapp / scriptname。因此,我们可以通过./scriptname启动便携式应用程序。正如我所说的,因为我不太了解bash,上面的脚本当然可以更好,处理程序的参数并自动找出脚本位置。但它应该显示如何做到这一点的一般想法。