
- •1 Обзор cuda
- •1.2 Введение в cuda
- •1.3 Терминология cuda
- •1.4 Модель программирования cuda
- •1.5 Версии вычислительных возможностей cuda и программного обеспечения cuda Toolkit
- •1.6 Cuda Toolkit версии 5 и версия вычислительных возможностей 3
- •1.7 Полезные ссылки
- •2 Технология jcuda
- •2.1 Введение в jcuda
- •2.2 Требования к техническому и программному обеспечению для jcuda-программ
- •2.3 Настройка jcuda для среды разработки Eclipse
- •2.4 Решение возможных проблем при работе с cuda и jcuda
- •2.5 Определение параметров cuda-устройства и системных параметров в Java-программе
- •2.6 Подключение cuda модулей и выполнение их на cuda-устройстве из Java-программы
- •2.7 Создание ‘.Cu‘ файла
- •2.8 Сборка программы
- •3 Изучение особенностей jcuda на примере
- •3.1 Пример jcuda-программы
- •3.2 Скорость выполнения программы
- •3.3 Размер блока
- •3.4 Отклонения в результатах вычислений и двойная точность
2.3 Настройка jcuda для среды разработки Eclipse
После скачивания файлов JCUDA и файла jcudaUtils, необходимо поместить файлы в корневую папку проекта Java и подключить их к проекту в Eclipse (рисунок 2.2). Обязательны для копирования в проект ‘.jar‘ файлы ‘jcuda‘ и ‘jcudaUtils‘ и ‘.dll‘ файлы ‘JCudaDriver‘ и ‘JCudaRuntime‘. Остальные ‘.jar‘ файлы-библиотеки и соответствующие им ‘.dll‘ файлы можно не включать в проект, если их не использовать в программах. Этапы подключения файлов к проекту в Eclipse:
- 1 - после создания проекта необходимо в навигаторе проекта (Project Explorer) выбрать корень проекта и нажать правой кнопкой мыши;
- 2 - в выпавшем меню необходимо выбрать пункт ‘Properties‘;
- 3 - в появившемся окне в списке слева выбрать ‘Java Build Path‘;
- 4 - в том же окне справа нажать кнопку ‘Add JARs...‘;
- 5 - появится окно, в котором необходимо указать ‘.jar‘ файл из библиотеки JCUDA и нажать ‘ОК‘. Таким образом необходимо добавить все требуемые ‘.jar‘ файлы. Затем необходимо нажать кнопку справа ‘Add Library...‘, в появившемся окне выбрать ‘User Library‘;
- 6 - в следующем окне нажать ‘User Libraries...‘, в следующем окне нажать ‘New‘ и ввести название библиотеки. Затем необходимо вернуться на ‘User Library‘, где выбрать созданную библиотеку и нажать ‘Finish‘;
- 7 - затем в окне свойств проекта необходимо раскрыть дерево добавленной библиотеки, в котором выбрать ‘Native Library Location: (None)‘ и нажать кнопку справа ‘Edit...‘;
- 8 - в появившемся окне нажать кнопку ‘Workspace‘, в котором выбрать название проекта (то есть выбирается местоположение ‘.dll‘ файлов) и нажать ‘ОК‘;
- 9 - в окне свойств проекта нажать ‘ОК‘. Таким образом будет завершена настройка JCUDA.
Рисунок 2.2 - Настройка JCUDA в Eclipse
2.4 Решение возможных проблем при работе с cuda и jcuda
Ошибка CUDA_ERROR_LAUNCH_TIMEOUT при выполнении JCUDA-программы связана с превышением интервала ожидания GPU. Интервал ожидания для ОС WindowsXP обычно равен 20 секунд, для ОС Windows7 - 5 секунд. Данная ошибка означает, что GPU не может проводить расчеты дольше установленного интервала ожидания без ответа в основную часть JCUDA-программы. Для разрешения проблемы необходимо открыть редактор реестра ‘Пуск‘->‘Выполнить‘(‘regedit‘). В редакторе реестра найти папку ‘GraphicsDrivers‘ и добавить в нее и в папку ‘DCI‘ (вложенную в ‘GraphicsDrivers‘) параметр ‘TdrLevel‘ со значением 0 (рисунок 2.3).
Рисунок 2.3 - Добавление параметра ‘TdrLevel‘ в реестр Windows
2.5 Определение параметров cuda-устройства и системных параметров в Java-программе
При запуске программы полезно делать проверку на наличие CUDA-устройства:
if(cudaGetDeviceCount(new int[1])!=cudaSuccess) System.out.println("Устройство с поддержкой CUDA отсутствует!"); |
Получение количества CUDA-устройств:
int deviceCountArray[] = new int[1]; cudaGetDeviceCount(deviceCountArray); String cudaDeviceCount="CUDA устройств подключено: "+deviceCountArray[0]; |
Для получения параметров CUDA-устройства необходимо создать объект класса ‘cudaDeviceProp‘ и получить параметры методом ‘cudaGetDeviceProperties‘, вторым параметром которого указывается порядковый номер CUDA-устройства (при наличии одного CUDA-устройства его порядковый номер равен 0, для следующего - 1 и т.д.):
cudaDeviceProp deviceProp = new cudaDeviceProp(); cudaGetDeviceProperties(deviceProp, 0); |
Затем с помощью ‘deviceProp‘ можно получить параметры CUDA-устройства:
"Видеокарта: "+new String(deviceProp.name).substring(0, new String(deviceProp.name).indexOf(0)); |
"Число ядер: "+deviceProp.multiProcessorCount*8+" (может быть неверным)"; |
"Глобальная память: "+new BigDecimal((float)(deviceProp.totalGlobalMem)/ 1048576).setScale(0,RoundingMode.UP).floatValue()+" Мбайт"; |
"Максимальное число потоков на блок: "+deviceProp.maxThreadsPerBlock; |
"Максимальный размер блока: "+deviceProp.maxThreadsDim[0]+"x"+ deviceProp.maxThreadsDim[1]+"x"+deviceProp.maxThreadsDim[2]; |
"Максимальный размер сетки: "+deviceProp.maxGridSize[0]+ "x"+deviceProp. maxGridSize[1]+"x"+deviceProp.maxGridSize[2]; |
"Частота: "+new BigDecimal((float)(deviceProp.clockRate)/1000000).setScale (2, RoundingMode.UP).floatValue()+" ГГц"; |
"Лимит времени выполнения: "+(deviceProp.kernelExecTimeoutEnabled!= 0?"Yes":"No"); |
Получение ‘CUDA Driver Version‘ и ‘CUDA Runtime Version‘:
int driverVersionArray[] = new int[1]; cudaDriverGetVersion(driverVersionArray); int runtimeVersionArray[] = new int[1]; cudaRuntimeGetVersion(runtimeVersionArray); "CUDA Driver Version: "+(driverVersionArray[0]/1000)+"."+ (driverVersionArray[0]%100); "CUDA Runtime Version: "+(runtimeVersionArray[0]/1000)+"."+ (runtimeVersionArray[0]%100); |
Параметры ОС и другие параметры можно определить с помощью метода ‘System.getProperty‘:
"Операционная система: "+System.getProperty("os.name"); "Архитектура ОС: "+System.getProperty("os.arch"); "Версия ОС: "+System.getProperty("os.version"); |