nvcc:在运行时获取设备计算能力
nvcc: get device compute capability in runtime
我有一个使用 GPU 并在不同机器上运行的应用程序。我目前手动给 NVCC 指定参数 -arch=compute_xx -code=sm_xx
,根据我 运行 机器上安装的 GPU 型号。
我想编写一个能够从主机提取这些值的自动化程序,这样我就不需要手动指定它了。有没有办法真正自动做到这一点?
使用 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 的最佳代码。
我有一个使用 GPU 并在不同机器上运行的应用程序。我目前手动给 NVCC 指定参数 -arch=compute_xx -code=sm_xx
,根据我 运行 机器上安装的 GPU 型号。
我想编写一个能够从主机提取这些值的自动化程序,这样我就不需要手动指定它了。有没有办法真正自动做到这一点?
使用 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 的最佳代码。