На этом шаге мы рассмотрим небольшой пример приложения с использованием технологии CUDA.
Создадим приложение, которое получает информацию о всех видеокартах компании NVIDIA, имеющихся на компьютере.Для этого откроем NVIDIA Nsight Eclipse Edition Release 6.5. Появится следующее окно:
Рис. 1. Установка рабочей директории
В этом окне нужно задать место расположения рабочей директории, в которой будет находиться папка нашего будущего проекта. Для примера мы выберем значение по умолчанию, после чего откроется среда программирования:
Рис. 2. Среда программирования NVIDIA Nsight Eclipse Edition Release 6.5
Создадим проект. Для этого нажмем сочетание клавиш Shift + Alt + N. Откроется окно, в котором выберем CUDA C/C++ Project.
Появится следующее окно:
Рис. 3. Создание пустого проекта
В поле Project name зададим имя проекта. Пусть имя проекта будет firstProject.
Далее нажмем кнопку Next>. Потом нажмем кнопку Finish. После этого у нас будет пустой проект.
В левой части среды программирования располагается дерево каталогов нашего проекта.
Рис. 4. Дерево каталогов проекта
Добавим к проекту файл, в котором будет находиться текст программы. Для этого щелкнем правой клавишей мыши на имени папки firstProject. Далее выберем New -> File. Пусть имя нашего файла будет main.cu. Далее нажимаем кнопку Finish.
Теперь все готово для работы. Напишем следующую программу:
#include <cstdio> #include <cuda.h> #include <cuda_runtime.h> int main(){ int deviceCount = 0; cudaDeviceProp devProp; cudaGetDeviceCount(&deviceCount); printf("Найдено устройств: %d\n", deviceCount); for(int i = 0; i < deviceCount; ++i){ cudaGetDeviceProperties(&devProp, i); printf("Устройство %d\n", i+1); printf("Compute Capability: %d.%d\n", devProp.major, devProp.minor); printf("Имя: %s\n", devProp.name); printf("Общая глобальная память: %d\n", devProp.totalGlobalMem); printf("Разделяемая память на блок: %d\n", devProp.sharedMemPerBlock); printf("Количество регистров на блок: %d\n", devProp.regsPerBlock); printf("Общая константная память: %d\n", devProp.totalConstMem); printf("Максимальное количество нитей на блоке: %d\n", devProp.maxThreadsPerBlock); printf("Максимальное количество нитей в сетке: %d %d %d\n", devProp.maxThreadsDim[0],devProp.maxThreadsDim[1],devProp.maxThreadsDim[2]); printf("Максимальный размер сетки: %d %d %d\n", devProp.maxGridSize[0],devProp.maxGridSize[1],devProp.maxGridSize[2]); printf("Размер wrap-a: %d\n", devProp.warpSize); } return 0; }
Проект можно взять здесь.
Для того, чтобы скомпилировать проект нужно сначала нажать Ctrl+B, потом Ctrl+F11, потом OK. Если все было сделано без ошибок, то в нижней части среды программирования появится информация об имеющихся GPU.
Рис. 5. Окно консоли
На следующем шаге мы рассмотрим спецификаторы доступа.