На этом шаге мы рассмотрим получение информации об имеющихся GPU и их возможностей.
Прежде чем начать работу с GPU, бывает важно получить максимально полную информацию обо всех имеющихся GPU (CUDA может работать сразу с несколькими GPU, если только они не соединены через SLI - Scalable Link Interface) и об их возможностях.
Для этого можно воспользоваться CUDA runtime API, который предоставляет простой способ получить информацию об имеющихся GPU, которые могут быть использованы CUDA, и обо всех их возможностях. Информация о возможностях GPU возвращается в виде структуры cudaDeviceProp:
struct cudaDeviceProp ( char name [256]; // Название устройства. size_t totalGlobalMem; // Полный объем глобальной памяти в байтах. size_t sharedHemPerBlock; // Объем разделяемой памяти в блоке в байтах. int regsPerBlock; // Количество 32-битовых регистров в блоке. int warpSize; // Размер waip'a. size_t memPitch; // Максимальный pitch в байтах, допустимый функциями // копирования памяти, выделенной // через cudaMallocPitch int maxThreadsPerBlock; // Максилальное число активных нитей в блоке. int maxThreadsDim [3]; // Максимальный размер блока по каждому измерению. int maxGridSize [3]; // Максимальный размер сетки по каждому измерению. size_t totalConstMem; // Объем константной памяти в байтах. int major; // Compute Capability, старший номер. int minor; // Compute Capability, младший номер. int clockRate; // Частота в килогерцах. size_t textureAlignment; // Выравнивание памяти для текстур. int deviceOverlap; // Можно ли осуществлять копирование параллельно // с вычислениями. int multiProcessorCount; // Количество мультипроцессоров в GPU. int kernelExecTimeoutEnables; // 1, если есть ограничение на время выполнения ядра int integrated; // 1, если GPU встроено в материнскую плату int canMapHostMemory; // 1, если можно отображать память CPU в память // CUDA. Для использования функциями cudaHostAlloc, // cudaHostGetDevicePointer int computeMode; // Режим, в котором находится GPU. // Возможные значения: // cudaComputeModeDefault, // cudaComputeModeExclusive - только одна нить может // звать cudaSetDevice для данного GPU, // cudaComputeModeProhibited - ни одна нить не может // звать cudaSetDevice для данного GPU. }
Для обозначения возможностей GPU CUDA использует понятие Compute Capability. Это пара целых чисел - major.minor, где major - обозначает глобальную архитектурную версию, а minor - небольшие изменения.
На следующем шаге мы рассмотрим пример получения информации об имеющихся GPU.