
- •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.8 Сборка программы
Созданный Java-проект можно экспортировать в запускаемый ‘.jar‘ файл. Для этого в навигаторе проекта (Project Explorer) необходимо нажать правой кнопкой мыши и в выпавшем меню выбрать пункт ‘Export‘. В открывшемся окне в разделе ‘Java‘ необходимо выбрать пункт ‘Runnable JAR file‘. В следующем окне в поле ‘Launch configuration‘ указывается Java-класс, с которого начинается выполнение программы, в поле ‘Export destination‘ указывается месторасположение экспортируемого файла, в ‘Library handling‘ выбирается пункт ‘Extract required libraries into generated JAR‘.
Созданный ‘.jar‘ файл помещается в отдельную папку, в которую также необходимо поместить ‘.dll‘ файлы JCUDA-библиотек. Можно поместить ‘.dll‘ файлы для различных версий ОС, чтобы повысить платформонезависимость программы.
В созданную папку помещаются ‘.cu‘ и ‘.ptx‘ файлы с учетом относительных путей размещения этих файлов, прописанных в программе (рисунок 2.4). Можно поместить ‘.cu‘ и ‘.ptx‘ файлы для различных версий ОС. В таком случае имена файлов должны отличаться, а написанная программа должна определять, какой ‘.cu‘ файл подключать для компьютера, на котором данная программа запускается (в зависимости от операционной системы и разрядности).
Рисунок 2.4 - Созданная программа, совместимая с 32-bit(х86) и 64-bit(х86_64) ОС Windows
3 Изучение особенностей jcuda на примере
3.1 Пример jcuda-программы
В программе рассматривается движение сгустка из N частиц. Сгусток частиц движется в течении некоторого периода времени, который разбит на временные отрезки. Для каждой частицы рассчитываются ее координаты для всех временных отрезков (рисунок 3.1) [10].
Рисунок 3.1 - Схема алгоритма расчета координат частиц для одного шага по времени
Входными данными являются: число частиц N, индексы частиц β и α, количество временных интервалов τ_number, интервал изменения положений частиц во времени Δτ, длина L, на которой частицы располагаются равномерно в начальный момент (0 < ξ <= L). Выходными данными являются два двухмерных массива vβ и ξβ - с координатами V и ξ для каждого момента времени (тип данных - float) и для каждой частицы.
Программа последовательно проводит расчеты сначала на языке Java, затем те же расчеты на JCUDA. Результаты выводятся в виде графика, также идет сравнение результатов и определение отклонений. Скорость выполнения программы зависит от числа частиц и количества временных интервалов.
Код вычислений на Java:
two_pi=2*Math.PI; for(int β=0;β<N;β++){//в начальный момент времени ξβ[β][0]=L*(β+1)/(N); vβ[β][0]=0; } for(int τ=1;τ<τ_number;τ++){//для всех моментов времени кроме начального for(int β=0;β<N;β++){ sum=0; for(int α=0;α<N;α++) if(ξβ[α][τ-1]>=ξβ[β][τ-1]) sum+=cos(two_pi*(ξβ[β][τ-1]-ξβ[α][τ-1]))); E_ξβ=(-2*sum)/N; dvβ[β]=E_ξβ*Δτ; dξβ[β]=vβ[β][τ-1]*Δτ; vβ[β][τ]=vβ[β][τ-1]+dvβ[β]; ξβ[β][τ]=ξβ[β][τ-1]+dξβ[β]; } } |
При расчете на JCUDA не все вычисления выполняются на GPU. На CPU выполняется расчет координат V и ξ для начального момента времени и обработка полученных на GPU результатов вычислений. Тем не менее, основное время затрачивается именно на вычисления на GPU (рисунок 3.2). Например, при 100 тысячах частиц и 50 временных интервалах время вычисления на GPU составляет 99,79% от времени, затраченного на расчеты, и при увеличении числа частиц время вычисления на GPU будет стремится к 100%. Это показывает, что в созданном алгоритме расчета на JCUDA не имеется резервов для повышения скорости выполнения программы путем переноса вычислений на GPU.
Рисунок 3.2 - Доля времени расчета на GPU от общего времени вычислений в зависимости от числа частиц