Как я могу получить количество ядер в устройстве cuda?

Я ищу функцию, которая подсчитывает количество ячеек моего устройства 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;
}

Ответ 1

Сердечники на мультипроцессор являются единственной "отсутствующей" частью данных. Эти данные не представлены непосредственно в структуре cudaDeviceProp, но можно сделать вывод на основе опубликованных данных и больше опубликованных данных из записей devProp.major и devProp.minor, которые вместе составляют вычислительную способность CUDA устройства.

Что-то вроде этого должно работать:

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) cores = mp * 128;
      else if (devProp.minor == 0) cores = mp * 64;
      else printf("Unknown device type\n");
      break;
     case 7: // Volta
      if (devProp.minor == 0) cores = mp * 64;
      else printf("Unknown device type\n");
      break;
     default:
      printf("Unknown device type\n"); 
      break;
      }
    return cores;
}

(закодирован в браузере)

"ядра" - это немного маркетинговый термин. На мой взгляд, наиболее распространенным коннотацией является приравнивание его к единицам SP в SM. Это то значение, которое я продемонстрировал здесь. Я также опустил cc 1.x устройства, поскольку эти типы устройств больше не поддерживаются в CUDA 7.0 и CUDA 7.5

Ответ 2

Возможно, это может помочь немного больше.

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 " - из сообщения.

Ответ 3

В Linux вы можете запустить следующую команду, чтобы получить количество ядер CUDA:

nvidia-settings -q CUDACores -t

Чтобы получить вывод этой команды в C, используйте функцию popen.