Главная » Просмотр файлов » Программирование на видеокартах GPGPU

Программирование на видеокартах GPGPU (1184391), страница 4

Файл №1184391 Программирование на видеокартах GPGPU (Программирование на видеокартах GPGPU) 4 страницаПрограммирование на видеокартах GPGPU (1184391) страница 42020-08-20СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 4)

Второйвариант: добавление сразу к общей сумме, находящейся в первом элементе.if (tid == 0) atomicAdd(g_odata, sdata[0]);Т.е., может использоваться одна из так называемых атомарных операций, гарантирующаякорректность выполнения операции в том случае, когда её пытаются выполнить многие нитиодновременно.133Умножение матрицПримером весьма часто используемого вычислительного алгоритма (но не очень хорошоподдающегося распараллеливанию) является алгоритм умножения матриц.Стандартный вид алгоритма для случая выполнения на одном процессоре таков:for(i = 0; i < M; i++)for(j = 0; j < N; j++)for(k = 0; k < K; k++)C[i][j] += A[i][k] * B[k][j];Таким образом, результирующая матрица формируется поэлементно (здесь порядок расчётаэлементов — вследствие коммутативности используемых операций — значения не имеет, покрайней мере — теоретически), каждый элемент вычисляется на основе одной строки левойматрицы и одного столбца правой матрицы.

Сами матрицы — для простоты — в этомиллюстративном примере адресуются как двумерные массивы, хотя на практике элементыматриц хранятся (чаще всего — по строкам) в одномерных массивах, указатели на которые вместес размерами матриц образуют структуры вроде такой:typedef struct {int width;int height;float* elements;} Matrix;Ниже приведена функция-ядро для реализации подобного «наивного» способа перемноженияматриц (C = A*B); предполагается, что матрицы расположены в глобальной памяти. Каждаянить считывает строку row из первой матрицы и столбец col из второй и вычисляет «свой»элемент матрицы (row,col):__global__ void MatMulKernel(Matrix A, Matrix B, Matrix C){// каждая нить вычисляет один элемент матрицы Cfloat Cvalue = 0;int row = blockIdx.y * blockDim.y + threadIdx.y;int col = blockIdx.x * blockDim.x + threadIdx.x;for (int e = 0; e < A.width; ++e)Cvalue += A.elements[row*A.width + e] * B.elements[e*B.width + col];C.elements[row*C.width + col] = Cvalue;}Подобная реализация выглядит привычно и несложно, однако, имеет один существенныйнедостаток: для формирования каждого элемента результирующей матрицы из глобальнойпамяти многократно читаются (и перечитываются) элементы отдельных строк и столбцов.Для того, чтобы уменьшить число загрузок элементов исходных матриц, имеет смысл этоделать порциями (скажем, квадратными блоками), которые могут быть временно — дляформирования произведения этих блоков — помещены из глобальной памяти в болеебыструю разделяемую память.

А поскольку теперь надо будет работать не только с исходнымиматрицами, но и блоками этих матриц, структуру описания отдельной матрицы следуетдополнить ещё одним параметром, содержащим ширину исходной матрицы (в приводимомдалее тексте это поле структуры именуется stride).14Иллюстрация алгоритма перемножения матриц из руководства NVIDIA.При использовании разделяемой (__shared__) памяти каждый блок нитей «занимается»вычислением квадратной подматрицы Csub (размера BLOCKSIZE на BLOCKSIZE), а каждаянить в этом блоке вычисляет один элемент подматрицы Csub. Подматрица Csub естьпроизведение двух прямоугольных матриц: подматрицы матрицы A (с размерами A.widthна BLOCKSIZE) и подматрицы матрицы B (с размерами BLOCKSIZE на B.height).Из-за ограниченного размера разделяемой памяти эти прямоугольные матрицы приходитсяразбивать на необходимое количество квадратных подматриц размера BLOCKSIZE иподматрица Csub вычисляется как сумма произведений этих квадратных матриц (этовозможно как следствие правила блочного перемножения матриц).Каждое из таких произведений вычисляется после загрузки двух соответствующих квадратныхматриц из глобальной памяти в разделяемую, причём сначала каждая нить загружает одинэлемент каждой матрицы, а затем вычисляет один элемент их произведения.

Отдельные нитиаккумулируют результат каждого из произведений в регистре, а по завершении записываютэтот результат в глобальную память.В реализации алгоритма используются три вспомогательные функции: GetElement(),SetElement() и GetSubMatrix(), предназначенные для работы в GPU (они помеченыспецификатором __device__ и по этой причине могут быть вызваны только из ядра).Надо сказать, что хотя — для удобства программирования — эти фрагменты кода и оформленыкак отдельные функции, на самом деле они просто «вставляются» в код, поскольку вызовы всистеме команд GPU обычно отсутствуют.Первая функция обеспечивает получение элемента из матрицы или подматрицы:__device__ float GetElement(const Matrix A, int row, int col){return A.elements[row*A.stride + col];}Вторая функция заносит заданное значение в элемент матрицы или подматрицы:__device__ void SetElement(Matrix A, int row, int col, float value){A.elements[row*A.stride + col] = value;}15Третья функция реализует извлечение подматрицы-блока из исходной матрицы:__device__ Matrix GetSubMatrix(Matrix A, int row, int col){Matrix ASub;ASub.width = BLOCK_SIZE;ASub.height = BLOCK_SIZE;ASub.stride = A.stride;ASub.elements = &A.elements[A.stride*BLOCK_SIZE*row + BLOCK_SIZE*col];return ASub;}А вот, собственно, и сам алгоритм такого блочного перемножения матриц (размеры которыхпредполагаются кратными размерам блока):__global__ void MatMulKernel(Matrix A, Matrix B, Matrix C){// Координаты блока в матрице (номер блока в строке и в столбце)int blockRow = blockIdx.y;int blockCol = blockIdx.x;// Каждый блок нитей вычисляет одну подматрицу Csub, при этом// каждая нить создаёт свой собственный дескриптор матрицы CsubMatrix Csub = GetSubMatrix(C, blockRow, blockCol);// Каждая нить вычисляет один элемент подматрицы Csubfloat Cvalue = 0;// thread row and col WITHIN CSUBint row = threadIdx.y;int col = threadIdx.x;// Цикл по всем подматрицам строки блоков A и столбца блоков B;// этот цикл необходим для вычисления всей подматрицы Csub.// Блочное умножение пары подматриц и аккумуляция результатаfor (int m = 0; m < (A.width / BLOCK_SIZE); ++m){// Формирование дескрипторов подматриц Asub и BsubMatrix Asub = GetSubMatrix(A, blockRow, m);Matrix Bsub = GetSubMatrix(B, m, blockCol);// Копирование элементов ASub и Bsub в разделяемую память// Каждая нить загружает один элемент ASub и один – Bsub// Обратите внимание: каждая нить объявляет матрицы As и Bs,// хотя блок нитей содержит только одну матрицу As и одну Bs__shared__ float As[BLOCK_SIZE][BLOCK_SIZE];__shared__ float Bs[BLOCK_SIZE][BLOCK_SIZE];As[row][col] = GetElement(Asub, row, col);Bs[row][col] = GetElement(Bsub, row, col);// Нити синхронизируются – чтобы убедиться, что всё прочитано__syncthreads();// Скалярное// формируютfor(int e=0;Cvalue +=произведение одной строки Asub и одного столбца Bsub(частично) один элемент результирующей подматрицыe<BLOCK_SIZE; ++e)As[row][e] * Bs[e][col];// Надо убедиться, что все Cvalues просуммированы до начала// считывания последующих блоков в разделяемые матрицы As, Bs__syncthreads();}// Запись Csub в глобальную память: каждая нить записывает «свой» элементSetElement(Csub, row , col, Cvalue);}164Алгоритм параллельной сортировки Bitonic SortСлово bitonic относится к последовательности сортируемых числовых величин и обозначает такуюпоследовательность, которая сначала монотонно возрастает, а затем монотонно убывает, илинаоборот (либо циклически приводимую к ней).

В дальнейшем предполагаем, что количествовеличин является степенью двойки.Если обменивать между собой соответствующие величины из первой и второй половин (в случаеих неправильного положения), мы придём к ситуации, где битоническими будут обе половины.Это так называемый шаг битонического расщепления. Проделаем аналогичные действия длякаждой из половин, затем для половин этих половин и т.д.

Обратите внимание, что на самомпервом шаге в первой половине удалось сосредоточить все величины, которые уже больше непридётся обменивать со второй половиной!Таким образом, битоническая сортировка использует свойство битонического расщепления:величины отсортированы для половин, а каждая половина является битонической. Повторноприменяя битоническое расщепление мы можем превратить битоническую последовательность вмонотонную (т.е., отсортированную), когда в каждой соседней паре величины располагаются в"правильном" порядке, а сами пары уже расположены "правильно".Для сортировки произвольной последовательности её сначала надо превратить в битоническую, азатем применять битоническое расщепление.

Характеристики

Тип файла
PDF-файл
Размер
1,54 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6510
Авторов
на СтудИзбе
302
Средний доход
с одного платного файла
Обучение Подробнее