CUDA工具包库再分发:
CUDA工具包的最终用户许可协议(EULA)允许在特定条款和条件下重新分配许多CUDA库。 这允许依赖于这些库的应用程序重新分配构建和测试的库的确切版本,从而避免为可能安装了不同版本的CUDA Toolkit(或者根本不可能)的最终用户带来麻烦 他们的机器。 详情请参阅EULA。
这不适用于NVIDIA驱动程序; 最终用户仍然必须下载并安装适合其GPU和操作系统的NVIDIA驱动程序。
要重新分配哪些文件:
重新分配一个或多个CUDA库的动态链接版本时,识别需要重新分配的确切文件非常重要。 以下示例使用CUDA Toolkit 5.5中的cuBLAS库作为示例:
Linux:
在Linux上的共享库中,有一个名为SONAME的字符串字段,它指示库的二进制兼容级别。 构建应用程序的库的SONAME必须与应用程序重新分发的库的文件名匹配。
例如,在标准的CUDA工具包安装中,文件libcublas.so和libcublas.so.5.5都是指向特定版本的cuBLAS的符号链接,其名称类似于libcublas.so.5.5.x,其中x是内部版本号 (例如,libcublas.so.5.5.17)。 但是,该库的SONAME以“libcublas.so.5.5”的形式给出:
$ objdump -p /usr/local/cuda/lib64/libcublas.so | grep SONAME
SONAME libcublas.so.5.5
因此,即使在链接应用程序时使用-lcublas(没有指定版本号),链接时发现的SONAME意味着“libcublas.so.5.5”是动态加载程序将查找的文件的名称 当加载应用程序时,因此必须是与应用程序重新分发的文件名(或符号链接)。
ldd工具对于识别应用程序期望在运行时期望找到的库的确切文件名以及动态加载器在加载给定当前库的应用程序时将选择的该库副本的路径(如果有的话)很有用 搜索路径:
$ ldd a.out | grep libcublas
libcublas.so.5.5 => /usr/local/cuda/lib64/libcublas.so.5.5
M
Mac:
在Mac OS X上的共享库中,有一个名为“安装名称”的字段,用于指示库的预期安装路径和文件名; CUDA库也使用这个文件名来表示二进制兼容性。 该字段的值将传播到针对库构建的应用程序中,并用于在运行时查找正确版本的库。
要查看库的安装名称,请使用otool -L命令:
$ otool - L a.out
a.out:
@rpath/libcublas.5.5.dylib(...)
Windows:
Windows上的CUDA库的二进制兼容版本被指定为文件名的一部分。
例如,链接到cuBLAS 5.5的64位应用程序将在运行时查找cublas64_55.dll,因此即使cublas.lib是该应用程序链接的文件,该文件也应该与该应用程序重新分发。 对于32位应用程序,该文件将是cublas32_55.dll。
要验证应用程序在运行时期望找到的确切DLL文件名,请使用Visual Studio命令提示符下的dumpbin工具:
$ dumpbin / IMPORTS a.exe
Microsoft(R) COFF / PE Dumper Version 10.00.40219.01
Copyright(C) Microsoft Corporation.All rights reserved.
Dump of file a.exe
File Type : EXECUTABLE IMAGE
Section contains the following imports :
...
cublas64_55.dll