旧GPU环境下仅调用CUDA API/库时无需指定-arch的疑问
问题解答
1. 仅调用CUDA Runtime API无需指定-arch的原因
- 像
cudaMalloc、cudaFree这类Runtime API属于主机端(CPU)调用的接口,本身不包含需要在GPU上执行的CUDA内核代码。nvcc编译这类代码时,本质是按普通C++代码处理,仅链接CUDA Runtime库即可。 - 这些API的实现已在CUDA Runtime库(
libcudart.so/cudart.lib)中预编译完成,库本身已针对不同GPU架构做了适配,你的代码只是调用预编译好的函数,不需要生成特定GPU架构的二进制指令。 -arch参数的作用是指定自定义GPU内核代码对应的目标架构,只有代码中包含__global__或__device__函数时,该参数才会影响生成的GPU二进制指令。如果没有自定义内核,这个参数不会对编译结果产生影响,自然不指定也能正常运行。
2. 调用预编译CUDA库无需指定-arch的合理性
你的观察是正确的,原因如下:
- 官方CUDA库(如cuBLAS、cuSPARSE)以及CUDA-aware MPI这类第三方CUDA支持库,都是预先针对多种GPU架构编译完成的。它们的二进制文件包含多个不同
sm_xx架构的代码版本(即"fat binary"),或会在运行时根据当前GPU架构动态加载对应优化版本。 - 你的代码调用这些库的接口时,实际执行的GPU内核是库中预编译好的部分,代码本身不包含需要编译的GPU内核。因此编译代码时不需要指定
-arch参数,只需确保链接正确的库文件,架构适配工作由库本身完成。
对CUDA官方库的适用性
完全适用,举例说明:
- 链接
-lcublas调用cuBLAS接口时,cuBLAS库内部已包含针对各种GPU架构优化的内核实现,你的代码仅发起主机端调用,无需自行编译GPU内核,因此无需指定-arch。 - 同理,cuSPARSE、cuFFT等所有官方CUDA库都是如此,只要代码没有自定义GPU内核,仅调用库的主机端API,编译时就不需要指定
-arch参数。
内容的提问来源于stack exchange,提问作者md657
相关产品推荐
相关产品推荐

