Date Редакция Категория comp Теги cuda / Cpp

Софт: Windows 7, 64bit; CUDA Toolkit 6.0; Microsoft Visual Studio 2008

Начал осваивать CUDA с чтения книги:

Сандерс Дж., Кэндрот Э. Технология CUDA в примерах. Введение в программирование графических процессоров. — М.: ДМК Пресс, 2013. — 232 с.: ил. — ISBN: 978-5-94074-504-4.

Что необходимо для работы с CUDA

Для работы с CUDA необходимо иметь:

  1. графический процессор (видеокарту), поддерживающий архитектуру CUDA;
  2. драйвер для этого устройства от NVIDIA;
  3. компилятор языка C;
  4. комплект средств разработки CUDA (CUDA Toolkit).

Пункты 1-3 у меня были, включая компилятор из набора Visual Studio 2008.

CUDA Toolkit можно скачать здесь. Вместе с ним поставляются многочисленные примеры, которые находятся в папке

C:\ProgramData\NVIDIA Corporation\CUDA Samples\v6.0

В папке 0_Simple\template находится заготовка для стандартного CUDA-проекта.

Как создавать проекты CUDA в Visual Studio и запускать примеры из книги

В VS при создании нового проекта выбираем тип NVIDIA/CUDA 6.0 и из шаблонов: CUDA Runtime 6.0.

После этого VS формирует заготовку проекта, содержащую единственный исходный файл kernel.cu. Он нам не нужен. Вместо него вставляем пример из книги:

//hello.cu, п.3.2
#include <iostream>

__global__ void kernel( void ) { 
}

int main( void ) {
    kernel<<<1,1>>>();
    printf( "Hello, World!\n" );

    return 0; 
}

Расширение файла .CU имеет значение! Только в таких файлах можно пользоваться CUDA-расширениями языка C++.

Чтобы настроить подсветку синтаксиса в файлах .CU как в C++, нужно в окне Tools -> Options -> Text Editor -> File Extension указать расширение .cu и в списке Editor:Microsoft Visual C++. После перезапуска VS получим подсветку синтаксиса.

Сообщения об ошибках

В примере из Главы 4 "Вычисление фрактала Джулиа на GPU" (который, вообще говоря, называется множество Жюлиа){rel="nofollow"}, при компиляции появляются сообщения вида:

julia_gpu.cu(42): error: calling a host function("cuComplex::cuComplex") from a __device__/__global__ function("julia") is not allowed
...

Для исправления нужно добавить квалификатор __device__ в конструктор структуры:

__device__ cuComplex( float a, float b ) : r(a), i(b)  {}

Решение проблемы "Видеодрайвер nVidia перестал отвечать и был успешно восстановлен"

Такое сообщение появилось у меня при выполнении примера "Вычисление фрактала Джулиа на GPU" (глава 4). Драйвер видеокарты стоял самый новый, конфликтов с предыдущими версиями драйвера не обнаружилось. Видеокарта работала штатно и не была перегрета. Тем не менее сообщение появлялось.

Обзор возможных способов решения этой проблемы приведен здесь. В моем случае помог следующий рецепт.

Необходимо настроить в системном реестре два параметра:

  • TdrLevel – управляет восстановлением. По умолчанию равен "3", что означает „TdrLevelRecover – Recover on timeout”, т. е. автоматическое восстановление по истечению времени задержки (TdrDelay). Значение "0" соответствует „TdrLevelOff – Detection disabled”, т. е. отключению детектирования ошибок драйвера.
  • TdrDelay – время задержки (в секундах), иначе: время реагирования на бездействие драйвера. Значение по умолчанию равно "2". При отключении детектирования ошибок (TdrLevel = 0) значение TdrDelay игнорируется.

Желательно не отключать проверку ошибок, а увеличить время задержки, установив его равным 3-м или более секундам. Значение подбирается экспериментально: можно начать с 10, и постепенно уменьшать время задержки.

Ключи TdrLevel и TdrDelay устанавливаются в редакторе реестра, в ветке HKLM\System\CurrentControlSet\Control\GraphicsDrivers. Возможно, что их придется создать. Ключи имеют тип REG_DWORD, не забудьте указать галочку «десятичная система счисления» при редактировании параметра.

Изменения в реестре вступят в силу после перезагрузки системы.

В результате получим:

Множество Жюлиа (Джулиа)



Комментарии

comments powered by Disqus