如何获得 cuda 设备中的核心数?
How can I get number of Cores in cuda device?
我正在寻找一个计算我的 cuda 设备核心数的函数。我知道每个微处理器都有特定的内核,我的 cuda 设备有 2 个微处理器。
我搜索了很多,想找到一个 属性 函数来计算每个微处理器的核心数,但我找不到。我使用下面的代码,但我仍然需要核心数?
- cuda 7.0
- 程序语言C
- visual studio 2013
代码:
void printDevProp(cudaDeviceProp devProp)
{ printf("%s\n", devProp.name);
printf("Major revision number: %d\n", devProp.major);
printf("Minor revision number: %d\n", devProp.minor);
printf("Total global memory: %u", devProp.totalGlobalMem);
printf(" bytes\n");
printf("Number of multiprocessors: %d\n", devProp.multiProcessorCount);
printf("Total amount of shared memory per block: %u\n",devProp.sharedMemPerBlock);
printf("Total registers per block: %d\n", devProp.regsPerBlock);
printf("Warp size: %d\n", devProp.warpSize);
printf("Maximum memory pitch: %u\n", devProp.memPitch);
printf("Total amount of constant memory: %u\n", devProp.totalConstMem);
return;
}
每个多处理器的内核数是唯一“缺失”的数据。该数据未直接在 cudaDeviceProp
结构中提供,但可以根据 published data and more published data 从 devProp.major
和 devProp.minor
条目中推断出来,它们共同构成了 CUDA 设备的计算能力。
像这样的东西应该可以工作:
#include "cuda_runtime_api.h"
// you must first call the cudaGetDeviceProperties() function, then pass
// the devProp structure returned to this function:
int getSPcores(cudaDeviceProp devProp)
{
int cores = 0;
int mp = devProp.multiProcessorCount;
switch (devProp.major){
case 2: // Fermi
if (devProp.minor == 1) cores = mp * 48;
else cores = mp * 32;
break;
case 3: // Kepler
cores = mp * 192;
break;
case 5: // Maxwell
cores = mp * 128;
break;
case 6: // Pascal
if ((devProp.minor == 1) || (devProp.minor == 2)) cores = mp * 128;
else if (devProp.minor == 0) cores = mp * 64;
else printf("Unknown device type\n");
break;
case 7: // Volta and Turing
if ((devProp.minor == 0) || (devProp.minor == 5)) cores = mp * 64;
else printf("Unknown device type\n");
break;
case 8: // Ampere
if (devProp.minor == 0) cores = mp * 64;
else if (devProp.minor == 6) cores = mp * 128;
else printf("Unknown device type\n");
break;
default:
printf("Unknown device type\n");
break;
}
return cores;
}
(在浏览器中编码)
“核心”是一个营销术语。我认为最常见的含义是将其等同于SM中的SP单位。这就是我在这里展示的意思。我还从中省略了 cc 1.x 设备,因为 CUDA 7.0 和 CUDA 7.5
不再支持这些设备类型
Pythonic 版本是
也许这会有所帮助。
"有一个库 helper_cuda.h 其中包含一个例程
_ConvertSMVer2Cores(int major, int minor) 计算能力级别
GPU 的数量和 returns 每个 SM 或 SMX 中的核心(流处理器)数量”
- 来自 post.
在linux中可以运行以下命令获取CUDA核心数:
nvidia-settings -q CUDACores -t
要在 C 中获取此命令的输出,请使用 popen 函数。
正如 Vraj Pandya 所说,在 nvidia 的 cuda-samples github repository 上的 Common/helper_cuda.h 文件中有一个函数 (_ConvertSMVer2Cores
) 提供了此功能。您只需将其结果乘以来自 GPU 的多处理器数量。
只是想提供一个电流link。
#include <cuda.h>
#include <cuda_runtime.h>
#include <helper_cuda.h> // You need to place this file somewhere where it can be
// found by the linker.
// The file itself seems to also require the
// `helper_string.h` file (in the same folder as
// `helper_cuda.h`).
int deviceID;
cudaDeviceProp props;
cudaGetDevice(&deviceID);
cudaGetDeviceProperties(&props, deviceID);
int CUDACores = _ConvertSMVer2Cores(props.major, props.minor) * props.multiProcessorCount;
我正在寻找一个计算我的 cuda 设备核心数的函数。我知道每个微处理器都有特定的内核,我的 cuda 设备有 2 个微处理器。
我搜索了很多,想找到一个 属性 函数来计算每个微处理器的核心数,但我找不到。我使用下面的代码,但我仍然需要核心数?
- cuda 7.0
- 程序语言C
- visual studio 2013
代码:
void printDevProp(cudaDeviceProp devProp)
{ printf("%s\n", devProp.name);
printf("Major revision number: %d\n", devProp.major);
printf("Minor revision number: %d\n", devProp.minor);
printf("Total global memory: %u", devProp.totalGlobalMem);
printf(" bytes\n");
printf("Number of multiprocessors: %d\n", devProp.multiProcessorCount);
printf("Total amount of shared memory per block: %u\n",devProp.sharedMemPerBlock);
printf("Total registers per block: %d\n", devProp.regsPerBlock);
printf("Warp size: %d\n", devProp.warpSize);
printf("Maximum memory pitch: %u\n", devProp.memPitch);
printf("Total amount of constant memory: %u\n", devProp.totalConstMem);
return;
}
每个多处理器的内核数是唯一“缺失”的数据。该数据未直接在 cudaDeviceProp
结构中提供,但可以根据 published data and more published data 从 devProp.major
和 devProp.minor
条目中推断出来,它们共同构成了 CUDA 设备的计算能力。
像这样的东西应该可以工作:
#include "cuda_runtime_api.h"
// you must first call the cudaGetDeviceProperties() function, then pass
// the devProp structure returned to this function:
int getSPcores(cudaDeviceProp devProp)
{
int cores = 0;
int mp = devProp.multiProcessorCount;
switch (devProp.major){
case 2: // Fermi
if (devProp.minor == 1) cores = mp * 48;
else cores = mp * 32;
break;
case 3: // Kepler
cores = mp * 192;
break;
case 5: // Maxwell
cores = mp * 128;
break;
case 6: // Pascal
if ((devProp.minor == 1) || (devProp.minor == 2)) cores = mp * 128;
else if (devProp.minor == 0) cores = mp * 64;
else printf("Unknown device type\n");
break;
case 7: // Volta and Turing
if ((devProp.minor == 0) || (devProp.minor == 5)) cores = mp * 64;
else printf("Unknown device type\n");
break;
case 8: // Ampere
if (devProp.minor == 0) cores = mp * 64;
else if (devProp.minor == 6) cores = mp * 128;
else printf("Unknown device type\n");
break;
default:
printf("Unknown device type\n");
break;
}
return cores;
}
(在浏览器中编码)
“核心”是一个营销术语。我认为最常见的含义是将其等同于SM中的SP单位。这就是我在这里展示的意思。我还从中省略了 cc 1.x 设备,因为 CUDA 7.0 和 CUDA 7.5
不再支持这些设备类型Pythonic 版本是
也许这会有所帮助。
"有一个库 helper_cuda.h 其中包含一个例程 _ConvertSMVer2Cores(int major, int minor) 计算能力级别 GPU 的数量和 returns 每个 SM 或 SMX 中的核心(流处理器)数量” - 来自 post.
在linux中可以运行以下命令获取CUDA核心数:
nvidia-settings -q CUDACores -t
要在 C 中获取此命令的输出,请使用 popen 函数。
正如 Vraj Pandya 所说,在 nvidia 的 cuda-samples github repository 上的 Common/helper_cuda.h 文件中有一个函数 (_ConvertSMVer2Cores
) 提供了此功能。您只需将其结果乘以来自 GPU 的多处理器数量。
只是想提供一个电流link。
#include <cuda.h>
#include <cuda_runtime.h>
#include <helper_cuda.h> // You need to place this file somewhere where it can be
// found by the linker.
// The file itself seems to also require the
// `helper_string.h` file (in the same folder as
// `helper_cuda.h`).
int deviceID;
cudaDeviceProp props;
cudaGetDevice(&deviceID);
cudaGetDeviceProperties(&props, deviceID);
int CUDACores = _ConvertSMVer2Cores(props.major, props.minor) * props.multiProcessorCount;