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

时间:2018-01-16 14:01:23

标签: cuda nvidia nvcc

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

我想编写一个能够从主机中提取这些值的自动化,这样我就不需要手动指定它了。有没有办法真正自动完成?

1 个答案:

答案 0 :(得分:2)

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

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

这将在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

但是,在构建旨在处理许多可能的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

NVCC docs进一步说明了这一点。另请注意,添加code=compute_XX以及code=sm_XX的条目将包含程序中设备代码的可移植PTX代码,并将启用JIT编译并支持您未明确包含的新架构你的编译。你可能会发现所有你需要的东西就像-arch=compute_50 -code=compute_50一样可以使用所有Maxwell卡和更新的,但不一定是一些新GPU的最佳代码。