Программирование графических процессоров

Рассмотрение примеров программ обработки массивов данных. Выполнение вычислений общего характера в графическом процессоре. Анализ производительности работы программ в зависимости от размера массивов. Изучение архитектуры параллельных вычислений CUDA.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 05.03.2015
Размер файла 266,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Московский Авиационный Институт

(Национальный Исследовательский Университет)

Курсовая работа

Программирование графических процессоров

Содержание

Введение

1. Постановка задачи

2. Реализация

3. Результат

4. Сравнение производительности приложения на CPU и GPU

Выводы

Список литературы

Введение

Известно, что вычислительные задачи требуют значительного количества операций, а значит, и ресурсов. Долгое время одним из основных методов повышения производительности было увеличение тактовой частоты процессора. Однако, из-за фундаментальных ограничений при производстве интегральных схем (ограничения на потребляемую мощность и на тепловыделение, физический предел размера транзистора), рассчитывать на увеличение производительности за счет увеличения тактовой частоты процессора в дальнейшем не приходится.

Таким образом, столкнувшись с очевидной проблемой повышения быстродействия, производители начали предлагать процессоры с несколькими вычислительными ядрами вместо одного. Но и многоядерные процессоры, если все сводится к размещению большего числа классических простых ядер на одной подложке, нельзя воспринимать как решение всех проблем. Их чрезвычайно сложно программировать, и они могут быть эффективны только на приложениях, обладающих естественной многопоточностью. Кроме того, если все ядра подключены к общей шине, каждый процессор должен «видеть» целый и корректный образ памяти, что неизбежно ведет к необходимости для каждого процессора отслеживать обращения к памяти всех остальных процессоров для поддержания актуальности своих кешей. Подобная задача имеет квадратичную сложность от числа процессоров.

Наконец, оптимальным решением при написании вычислительных программ для обработки массивов данных явилось задействование вычислительных ресурсов видеокарт. По сравнению с традиционным конвейером обработки данных в центральном процессоре, выполнение вычислений общего характера в графическом процессоре дает существенные преимущества. Разработанная компанией NVIDIA архитектура параллельных вычислений CUDA предлагает сотни ядер, способных обрабатывать параллельные потоки, что позволяет обеспечить невероятную производительность целому спектру вычислительных приложений.

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

1. Постановка задачи

массив графический процессор

Написать программу, которая должна выполнять вычисления для массива данных, и произвести оценку производительности работы программы при вычислениях на CPU и GPU.

Программа 1: инвертировать массив. Программа 2: вычислить квадраты элементов массива. Программа 3: вычислить функцию экспоненты.

Вычисление по каждой программе будет включать следующие последовательные этапы: Определение массива, Выделение памяти на GPU, Копирование данных из памяти CPU в выделенную память GPU, Осуществление запуска ядра (вычисление функции на GPU), Копирование результатов вычислений в память на CPU, Вычисление функции на CPU, Освобождение памяти, выделенной GPU, Вывод результатов работы программы на CPU и GPU

2. Реализация

Ниже для заданий представлены функции GPU

Инвертирование массива

__global__ void invArray(int* a, int* b, int count)

{

int id = blockIdx.x * blockDim.x + threadIdx.x;

if (id < count)

{

b[id] = a[count-1-id];

}

}

Вычисление квадратов элементов массива

__global__ void multArray(float* a, float*b, int count)

{

int id = blockIdx.x * blockDim.x + threadIdx.x;

if (id < count)

{

b[id] = a[id]*a[id];

}

}

Вычисление функции экспоненты

__global__ void expArray(float* a, float*b, int count)

{

int id = blockIdx.x * blockDim.x + threadIdx.x;

if (id < count)

{

b[id] = exp(a[id]);

}

}

3. Результат

Программа инвертирования массива

#include "cuda_runtime.h"

#include "device_launch_parameters.h"

#include <iostream>

#include <helper_timer.h>

#include <fstream>

#include <string>

#include <stdio.h>

using namespace std;

__global__ void invArray(int* a, int* b, int count)

{

int id = blockIdx.x * blockDim.x + threadIdx.x;

if (id < count)

{

b[id] = a[count-1-id];

}

}

void invarrayCPU(int* datainput, int* dataoutput, int count )

{

for (int i = 0; i < count; i++)

{

dataoutput [i] = datainput [count-1-i];

}

}

int main()

{

int count = 1000;

int* data = new int [count];

int* res = new int[count];

int* dataGPU;

int* resGPU;

float time_gpu = 0, time_cpu = 0;

cudaEvent_t start, stop;

cudaEventCreate(&start);

cudaEventCreate(&stop);

for(int i = 0; i < count; ++i)

{

data[i]=i;

}

//GPU

cudaMalloc((void**)&dataGPU, count*sizeof(int));

cudaMalloc((void**)&resGPU, count*sizeof(int));

cudaMemcpy(dataGPU, data, count*sizeof(int), cudaMemcpyHostToDevice);

cudaEventRecord(start, 0);

invArray<<<1024, 1024>>>(dataGPU, resGPU, count);

cudaEventRecord(stop, 0);

cudaEventSynchronize(stop);

cudaEventElapsedTime(&time_gpu, start, stop);

cudaMemcpy(res, resGPU, count*sizeof(float), cudaMemcpyDeviceToHost);

cudaFree(dataGPU);

cudaFree(resGPU);

int* res1 = new int[count];

StopWatchInterface *timer = NULL;

sdkCreateTimer(&timer);

sdkStartTimer(&timer);

invarrayCPU(data, res1, count);

sdkStopTimer(&timer);

time_cpu=sdkGetTimerValue(&timer);

std::cout<<"\n\ntime_cpu = "<<time_cpu<<"\ntime_gpu = "<<time_gpu<<'\n';

cin.get();

cudaDeviceReset();

return 0;

}

Программа вычисления квадратов элементов массива

#include "cuda_runtime.h"

#include "device_launch_parameters.h"

#include <iostream>

#include <helper_timer.h>

#include <fstream>

#include <string>

#include <stdio.h>

using namespace std;

__global__ void multArray(float* a, float*b, int count)

{

int id = blockIdx.x * blockDim.x + threadIdx.x;

if (id < count)

{

b[id] = a[id]*a[id];

}

}

void multarrayCPU(float* datainput, float *dataoutput, int count )

{

for (int i = 0; i < count; i++)

{

dataoutput [i] = datainput [i] * datainput[i];

}

}

int main()

{

int count = 10;

float* data = new float [count];

float* res = new float[count];

float* dataGPU;

float* resGPU;

float time_gpu = 0, time_cpu = 0;

cudaEvent_t start, stop;

cudaEventCreate(&start);

cudaEventCreate(&stop);

for(int i = 0; i < count; i++)

{

data[i]=float(i)*0.01f;

}

//GPU

cudaMalloc((void**)&dataGPU, count*sizeof(float));

cudaMalloc((void**)&resGPU, count*sizeof(float));

cudaMemcpy(dataGPU, data, count*sizeof(float), cudaMemcpyHostToDevice);

cudaEventRecord(start, 0);

multArray<<<1024,1024>>>(dataGPU, resGPU, count);

cudaEventRecord(stop, 0);

cudaEventSynchronize(stop);

cudaEventElapsedTime(&time_gpu, start, stop);

cudaMemcpy(res, resGPU, count*sizeof(float), cudaMemcpyDeviceToHost);

cudaFree(dataGPU);

float* res1 = new float[count];

StopWatchInterface *timer = NULL;

sdkCreateTimer(&timer);

sdkStartTimer(&timer);

multarrayCPU(data, res1, count);

sdkStopTimer(&timer);

time_cpu=sdkGetTimerValue(&timer);

std::cout<<"\n\ntime_cpu = "<<time_cpu<<"\ntime_gpu = "<<time_gpu<<'\n';

cin.get();

cudaDeviceReset();

return 0;

}

Программа вычисления функции экспоненты

#include "cuda_runtime.h"

#include "device_launch_parameters.h"

#include <iostream>

#include <helper_timer.h>

#include <fstream>

#include <string>

#include <stdio.h>

using namespace std;

__global__ void expArray(float* a, float*b, int count)

{

int id = blockIdx.x * blockDim.x + threadIdx.x;

if (id < count)

{

b[id] = exp(a[id]);

}

}

void exparrayCPU(float* datainput, float *dataoutput, int count )

{

for (int i = 0; i < count; i++)

{

dataoutput [i] = exp(datainput[i]);

}

}

int main()

{

int count = 1000000;

float* data = new float [count];

float* res = new float[count];

float* dataGPU;

float* resGPU;

float step = 0.01f;

cudaDeviceProp devProp;

cudaGetDeviceProperties(&devProp,0);

size_t maxThreads = devProp.maxThreadsPerBlock;

float time_gpu = 0, time_cpu = 0;

cudaEvent_t start, stop;

cudaEventCreate(&start);

cudaEventCreate(&stop);

for(int i = 0; i < count; i++)

{

data[i]=float(i)*step;

}

//GPU

cudaMalloc((void**)&dataGPU, count*sizeof(float));

cudaMalloc((void**)&resGPU, count*sizeof(float));

cudaMemcpy(dataGPU, data, count*sizeof(float), cudaMemcpyHostToDevice);

cudaEventRecord(start, 0);

expArray<<<1024,1024>>>(dataGPU, resGPU, count);

cudaEventRecord(stop, 0);

cudaEventSynchronize(stop);

cudaEventElapsedTime(&time_gpu, start, stop);

cudaMemcpy(res, resGPU, count*sizeof(float), cudaMemcpyDeviceToHost);

cudaFree(dataGPU);

float* res1 = new float[count];

StopWatchInterface *timer = NULL;

sdkCreateTimer(&timer);

sdkStartTimer(&timer);

exparrayCPU(data, res1, count);

sdkStopTimer(&timer);

time_cpu=sdkGetTimerValue(&timer);

std::cout<<"\n\ntime_cpu = "<<time_cpu<<"\ntime_gpu = "<<time_gpu<<'\n';

std::cout << maxThreads << '\n';

cin.get();

cudaDeviceReset();

return 0;

}

4. Сравнение производительности приложения на CPU и GPU

Вычисление осуществлялось на системах

CPU: IntelCore(TM) i7-3770 CPU @ 3.40 GHz, 16 GB

GPU: NVIDIA Quadro 4000, GDDR5, 2 GB

CPU: Intel(R) Xeon® CPU E5-2650.@ 2.00GHz, 128 GB

GPU: Tesla M2075 Dual-Slot GDDR5, 6GB

Ниже приведены результаты производительности (в миллисекундах, в зависимости от размера массива):

для программы инвертирования массива

Количество элементов

CPU Intel i7

GPU NVIDIA Quadro

CPU Intel Xeon

GPU Tesla

10

0,000301858

0,182176

0

0,056352

1 000

0,00241487

0,181824

0,06

0,056672

10 000

0,0220357

0,179552

0,047

0,056352

100 000

0,221866

0,191424

0,495

0,059424

1 000 000

2,22953

0,2984

6,404

0,120224

Размещено на http://www.allbest.ru/

для программы вычисления квадратов элементов массива

Количество элементов

CPU Intel i7

GPU NVIDIA Quadro

CPU Intel Xeon

GPU Tesla

10

0,000301858

0,18112

0,001

0,09072

1 000

0,00271673

0,181152

0,006

0,092512

10 000

0,0250542

0,181856

0,053

0,088992

100 000

0,246316

0,191616

0,557

0,060256

1 000 000

2,34212

0,31034

6,753

0,125312

Размещено на http://www.allbest.ru/

для программы вычисления функции экспоненты

Количество элементов

CPU Intel i7

GPU NVIDIA Quadro

CPU Intel Xeon

GPU Tesla

10

0,00241487

0,213664

0,3

0,056704

1 000

0,0187152

0,211488

0,388

0,087232

10 000

0,330535

0,214656

3,309

0,09712

100 000

26,9412

0,265152

5,868

0,063424

1 000 000

59,4936

0,789152

33,24

0,139232

Размещено на http://www.allbest.ru/

Выводы

Технология CUDA -- это программно-аппаратная архитектура, которая позволяет производить вычисления с использованием графических процессоров NVIDIA. Данная технология основана на расширении языка С и дает возможность организовывать доступ к набору инструкций графического ускорителя и управлять его памятью, а также разработать на нем сложные параллельные вычисления.

Как видно из результатов тестирования, одна и та же задача с разным временем решается на вычислительных системах. В любом случае, на малых объемах вычислений преимущество расчета на CPU неоспоримо: время расчета минимально. По мере усложнения задачи, что проявляется как в увеличении объема вычислений (при увеличении количества элементов массива), так и усложнении операций вычисления (см. пример вычисления функции экспоненты), выполнение расчета с использованием многоядерной архитектуры видеоадаптера становится намного эффективнее. Таким образом, вычислительные системы с архитектурой CUDA не заменимы для решения ресурсоемких задач и могут быть использованы для научных и технических вычислений.

Литература

1. Боресков А.В., Харламов А.В. Основы работы с технологией CUDA. - Изд-во: ДМК Пресс, 2010.

Размещено на Allbest.ru

...

Подобные документы

  • Сравнение центрального и графического процессора компьютера в параллельных расчётах. Пример применения технологии CUDA для неграфических вычислений. Вычисление интеграла и сложение векторов. Технические характеристики ПК, применяемого для вычислений.

    курсовая работа [735,9 K], добавлен 12.07.2015

  • Анализ работы параллельных вычислений на видеокарте GeForce GT 540M с использованием текстурной памяти. Рассмотрение специфических особенностей по адресации текстурной памяти. Изучение основ чтения и записи данных. Описание примеров данных программ.

    лабораторная работа [3,1 M], добавлен 04.12.2014

  • Преимущества архитектуры CUDA по сравнению с традиционным подходом к организации вычислений общего назначения посредством возможностей графических API. Создание CUDA проекта. Код программы расчёта числа PI и суммирования вектора CPU, ее технический вывод.

    курсовая работа [1,4 M], добавлен 12.12.2012

  • Разработка программ на языке Turbo Pascal на основе использования массивов данных. Особенности хранения данных, способы объявления переменных, действия над элементами массивов, их ввод и вывод. Практическое применение одномерных и многомерных массивов.

    методичка [17,8 K], добавлен 25.11.2010

  • Понятие массива и правила описания массивов в программах на языке С. Рассмотрение основных алгоритмов обработки одномерных массивов. Примеры программ на языке С для всех рассмотренных алгоритмов. Примеры решения задач по обработке одномерных массивов.

    учебное пособие [1,1 M], добавлен 22.02.2011

  • Создание и компиляция программ на ассемблере. Структура программ, использование специальных директив резервирования и инициализации данных. Организация ввода-вывода на ассемблере и организация вычислений. Команды передачи управления и обработки строк.

    методичка [104,8 K], добавлен 02.12.2009

  • Области применения быстрых вычислений. Проблемы эффективности последовательных и параллельных программ. Отображение циклов с условными операторами на асинхронные архитектуры. Рассмотрение исследовательских университетских распараллеливающих систем.

    презентация [833,3 K], добавлен 07.08.2015

  • Разработка простейших линейных алгоритмов (составление логических выражений), программ с ветвлениями, циклических программ и составление их блок-схем. Практическое выполнение обработки массивов на примере вычисления элементов квадратной матрицы.

    контрольная работа [173,3 K], добавлен 01.03.2010

  • Использование математических функций для алгоритмизации задач и отладки программ. Операторы сравнения и логические функции; реализация циклического процесса. Организация и обработка данных при помощи массивов. Функции преобразования и работы со строками.

    методичка [135,5 K], добавлен 24.10.2012

  • Основные модели вычислений. Оценки эффективности параллельных алгоритмов, их коммуникационная трудоемкость. Последовательный алгоритм, каскадная схема и способы ее улучшения. Модифицированная каскадная схема. Передача данных, классификация операций.

    презентация [1,3 M], добавлен 10.02.2014

  • Знакомство с историей развития многопроцессорных комплексов и параллельных вычислений. Персональные компьютеры как распространенные однопроцессорные системы на платформе Intel или AMD, работающие под управлением однопользовательских операционных систем.

    презентация [1,1 M], добавлен 22.02.2016

  • Показатели эффективности параллельного алгоритма: ускорение, эффективность использования процессоров, стоимость вычислений. Оценка максимально достижимого параллелизма. Закон Амдала, Закон Густафсона. Анализ масштабируемости параллельного алгоритма.

    презентация [493,0 K], добавлен 11.10.2014

  • Обработка текстовых данных, хранящихся в файле. Задачи и алгоритмы обработки больших массивов действительных и натуральных чисел. Практические задачи по алгоритмам обработки данных. Решение задачи о пяти ферзях. Программа, которая реализует сортировку Шел

    курсовая работа [29,2 K], добавлен 09.02.2011

  • Микропроцессорные системы обработки данных. Специальные алгоритмы-планировщики для распределения операторов параллельных алгоритмов по процессорам вычислительной сети. Алгоритм построения и уплотнения нитей. Интерфейс программы, результаты работы.

    курсовая работа [1,8 M], добавлен 22.02.2011

  • Параллельная машина как процессоров, памяти и некоторые методы коммуникации между ними, сферы применения. Рассмотрение особенностей организации параллельности вычислений. Анализ типовых схем коммуникации в многопроцессорных вычислительных системах.

    курсовая работа [669,3 K], добавлен 07.09.2015

  • Изучение методов создания диалоговой оболочки отладчика MPI-программ, который войдет в состав системы автоматизации разработки параллельных программ (DVM-системы). Основные подходы к параллельному программированию и созданию пользовательского интерфейса.

    курсовая работа [1,5 M], добавлен 14.10.2010

  • Математическая основа параллельных вычислений. Свойства Parallel Computing Toolbox. Разработка параллельных приложений в Matlab. Примеры программирования параллельных задач. Вычисление определенного интеграла. Последовательное и параллельное перемножение.

    курсовая работа [1,1 M], добавлен 15.12.2010

  • Реализация различных методов сортировки. Алгоритмические языки программирования. Обработка большого числа единообразно организованных данных. Алгоритмы сортировки массивов. Анализ проблем реализации и использования различных видов сортировок массивов.

    курсовая работа [640,3 K], добавлен 07.07.2011

  • Работа с массивами, их ввод и вывод, организация программ циклической структуры. Способы описания и использования массивов, алгоритмы их сортировки, сортировка выбором и вставками. Алгоритмы поиска элемента в неупорядоченном и упорядоченном массивах.

    лабораторная работа [14,2 K], добавлен 03.10.2010

  • Программно-аппаратный комплекс производства компании Nvidia. Код для сложения векторов, представленный в CUDA. Вычислительная схема СPU с несколькими ядрами SMP. Выделение памяти на видеокарте. Проведение синхронизации работы основной и GPU программ.

    презентация [392,5 K], добавлен 14.12.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.