簡體   English   中英

如何獲得 cuda 設備中的核心數?

[英]How can I get number of Cores in cuda device?

我正在尋找一個計算我的 cuda 設備核心數的函數。 我知道每個微處理器都有特定的內核,而我的 cuda 設備有 2 個微處理器。

我進行了大量搜索以找到一個計算每個微處理器內核數的屬性函數,但我找不到。 我使用下面的代碼,但我仍然需要內核數?

  • CUDA 7.0
  • 程序語言 C
  • 視覺工作室 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結構中提供,但可以根據已發布的數據以及來自devProp.majordevProp.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版本在這里

在 linux 中,您可以運行以下命令來獲取 CUDA 核心數:

nvidia-settings -q CUDACores -t

要在 C 中獲取此命令的輸出,請使用popen函數。

正如 Vraj Pandya 已經說過的,在 nvidia 的 cuda-samples github 存儲庫的 Common/helper_cuda.h 文件中有一個函數 ( _ConvertSMVer2Cores ),它提供了這個功能。 您只需要將其結果與來自 GPU 的多處理器數量相乘。

只是想提供一個當前鏈接。

#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;

也許這可能會有所幫助。

https://devtalk.nvidia.com/default/topic/470848/cuda-programming-and-performance/what-39-s-the-proper-way-to-detect-sp-cuda-cores-count-per- sm-/post/4414371/#4414371

“有一個庫 helper_cuda.h,其中包含一個例程 _ConvertSMVer2Cores(int major, int minor),它獲取 GPU 的計算能力級別並返回每個 SM 或 SMX 中的內核(流處理器)數量”-來自帖子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM