nvcc:在运行时获取设备计算能力

Som*_*ing 3 cuda nvidia nvcc

我有一个使用 GPU 并在不同机器上运行的应用程序。-arch=compute_xx -code=sm_xx目前,我根据正在运行的计算机上安装的 GPU 型号,手动向 NVCC 指定参数。

我想编写一个自动化程序,能够从主机中提取这些值,这样我就不需要手动指定它们。有没有办法真正自动做到这一点?

Can*_*rop 5

使用 C++ CUDA 运行时 API,您可以执行以下操作来查找主要和次要 CUDA 计算能力版本:

cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, dev);
std::printf("%d.%d\n", deviceProp.major, deviceProp.minor);
Run Code Online (Sandbox Code Playgroud)

例如,这将在 Pascal 卡上打印“6.1”。

如果您的安装中有 CUDA 演示套件,则在extras/demo_suite目录中,deviceQuery其中的可执行文件使用此 API 来获取计算能力版本:

$ /path/to/cuda/extras/demo_suite/deviceQuery | grep 'CUDA Capability'
  CUDA Capability Major/Minor version number:    6.1
  CUDA Capability Major/Minor version number:    6.1
Run Code Online (Sandbox Code Playgroud)

然而,当构建旨在在许多可能的 GPU 上工作的 CUDA 程序时,处理此问题的最佳方法是为您想要的每个架构/计算能力构建 PTX/二进制设备代码,如下所示:

nvcc x.cu \
    --generate-code arch=compute_50,code=sm_50 \
    --generate-code arch=compute_50,code=sm_52 \
    --generate-code arch=compute_53,code=sm_53
Run Code Online (Sandbox Code Playgroud)

NVCC 文档对此进行了进一步描述。code=compute_XX另请注意,添加带有和 的条目code=sm_XX将包括程序中设备代码的可移植 PTX 代码,并将启用 JIT 编译并支持您尚未明确包含在编译中的较新架构。您可能会发现您所需要的只是-arch=compute_50 -code=compute_50与所有 Maxwell 卡和更新的卡一起使用,但不一定是某些更新的 GPU 的最佳代码。

  • @SomethingSomething:是的。正如我所做的那样。两次 (2认同)