最近研究Tensor Core结构化稀疏矩阵操作,跑一跑NVIDIA的程序。遇到一些Windows上编译链接的问题,查阅资料,收获了一些关于链接的常识。
NVIDIA/CUDALibrarySamples: CUDA Library Samples (github.com)
cuSPARSELt Downloads | NVIDIA Developer
总体过程
在Windows平台上,运行CMake,生成sln文件
用Visual Studio打开sln文件,打开工程,点击启动编译
问题
从CMakeLists中的各种`.so`看出,它是只面向Linux的。需要自己改写成Windows上的。
Windows上链接过程
CUDA cuSPARSELt库的lib文件夹提供了三个文件
为了方便,直接手动设置路径
静态链接
在编译链接时,指定链接库,这里静态链接,我们用`cusparseLt_static.lib`。值得注意的是,它的名字中含有`_static`,它的文件大小是三个文件中最大的。它存储了实际执行的代码。生成可执行文件之后,实际执行的代码被添加到了可执行文件中。这份可执行文件可以不依赖于dll文件直接执行。
在CMakeLists中指定链接库的方式如下
动态链接
我们用`cusparseLt.lib`,值得注意的是,它的名字中不含有`_static`,它的文件大小是三个文件中最小的。它不存储实际执行的代码,只存储符号及其在cusparseLt.dll中的位置。链接时指定`cusparseLt.lib`,生成可执行文件时,实际执行的代码没有添加到可执行文件中。
运行这份可执行文件时,系统查找依赖的dll文件,在需要时加载到内存中执行。为了让系统在需要时找到这些代码,需要把dll文件的位置添加到系统环境变量中。
在其他一些库中,dll文件一般存放在bin文件夹下,它是执行时用的,不是链接时用的。链接时只会用到`lib`文件。动态链接和静态链接用不同的`lib`文件。