Программирование графических процессоров Лабораторная 2

Состав работы

material.view.file_icon
material.view.file_icon
material.view.file_icon
material.view.file_icon
material.view.file_icon
material.view.file_icon .suo
material.view.file_icon Browse.VC.db
material.view.file_icon
material.view.file_icon
material.view.file_icon
material.view.file_icon KERNEL.ipch
material.view.file_icon
material.view.file_icon .suo
material.view.file_icon Browse.VC.db
material.view.file_icon kernel.cu
material.view.file_icon
material.view.file_icon kernel.cu
material.view.file_icon lab2.vcxproj
material.view.file_icon lab2.vcxproj.user
material.view.file_icon
material.view.file_icon
material.view.file_icon kernel.cu-830140883.deps
material.view.file_icon kernel.cu.cache
material.view.file_icon kernel.cu.obj
material.view.file_icon lab2.exe.recipe
material.view.file_icon lab2.ilk
material.view.file_icon lab2.log
material.view.file_icon
material.view.file_icon CudaCompile.read.1u.tlog
material.view.file_icon CudaCompile.write.1u.tlog
material.view.file_icon lab2.lastbuildstate
material.view.file_icon lab2.write.1u.tlog
material.view.file_icon link.command.1.tlog
material.view.file_icon link.read.1.tlog
material.view.file_icon link.write.1.tlog
material.view.file_icon vc142.pdb
material.view.file_icon lab2.exe
material.view.file_icon lab2.sln
material.view.file_icon
material.view.file_icon
material.view.file_icon lab2.exe
material.view.file_icon lab2.exp
material.view.file_icon lab2.lib
material.view.file_icon lab2.pdb
material.view.file_icon Документ Microsoft Word.docx
Работа представляет собой rar архив с файлами (распаковать онлайн), которые открываются в программах:
  • Microsoft Word

Описание

Задание
1. Прочитайте главу из теоретического материала "Разделяемая память" и ответьте на контрольные вопросы (ответы на контрольные вопросы не нужно включать в отчёт по лабораторной работе).
2. Оптимизируйте алгоритмы, реализованные в лабораторной работе №1 при помощи разделяемой памяти.
3. Постройте графики зависимости времени выполнения алгоритма от размера матрицы и вектора (Размеры матрицы 1000x500, 1000x1000, 1500x1000, 2000x1000, 2000x1500, 2500x1500, 2500x2000).
4. Проанализируйте, реализованные алгоритмы при помощи утилиты nvprof на эффективность доступа к глобальной памяти.
Методические указания по выполнению лабораторной работы
Разделяемая память – это своего рода кэш. Ускорения от использования разделяемой памяти можно достичь только если к каким-то данным происходит многократное обращение. Тогда переместив их в разделяемую память из глобальной можно сократить время затраченное на обращение в память за счёт высокой скорости разделяемой памяти.
Рассмотрим схему параллельного умножения матрицы на вектор.

Рис. 1 – схема умножения матрицы на вектор
Каждая нить берёт по одной строке матрицы и умножает попарно элементы строки на элементы вектора. Все нити используют один и тот же вектор. Скопировав вектор в разделяемую память можно получить ускорения выполнения алгоритма. Но проблема разделяемой памяти в том, что её объём очень мал по сравнению с объёмом глобальной памяти. Поэтому нужно предусмотреть ситуацию когда вектор полностью в память не помещается.
Учитывая, что разделяемой памяти может не хватить нужно модифицировать алгоритм таким образом чтобы часть вектора копировалась в разделяемую память. Нити умножали часть строки на часть вектора, расположенного в разделяемой памяти. Затем копировали следующую часть вектора в разделяемую память и умножали элементы следующей части строки и т.д. как показано на рисунке 2.

Рис. 2 – умножение нитью строки на вектор с копированием частей вектора в разделяемую память
Копирование частей вектора можно производить параллельно, каждая нить может копировать в разделяемую память один или несколько элементов. Таким образом псевдокод алгоритма будет выглядеть следующим образом:
//Выделяем разделяемую память
//Количество элементов будет равно количеству нитей в блоке.
__shared__ shared_vector[THREAD_PER_BLOCK];

//k - номер части вектора. +1 потому что M не обязательно делится нацело
for(k = 0; k < (M / THREAD_PER_BLOCK) + 1; ++k) {
//p - реальный номер элемента вектора
//который будет скопирован нитью в разделяемую память
p = threadIdx.x + THREAD_PER_BLOCK * k;
//Проверка на выход за пределы вектора
if(p < M) {
//Копирование из глобальной памяти в разделяемую
//Т.к. размер разделяемой памяти равен размеру блока
//Каждая нить может скопировать по одному элементу
 shared_vector[threadIdx.x] = V[threadIdx.x + THREAD_PER_BLOCK * k];
}
//Синхронизация. Нужно дождаться пока все нити скопируют свои элементы
//Потому что каждая нить использует скопированную часть вектора полностью
__syncthread();
//i - глобальный номер нити, N - количество строк в матрице
//Проверка не выходим ли за границы матрицы
if (i < N) {
//Умножение части вектора на часть строки
//j - порядковый номер элемента в части вектора или строки матрицы
//чтобы получить реальный номер элемента матрицы
//нужно прибавить j количеству полностью обработанных элементов
 for(j = 0; j < THREAD_PER_BLOCK; ++j) {
 C[i] += A[i][j + k * THREAD_PER_BLOCK] * shared_vector[j];
}
}
//Синхронизация нужна для того чтобы убедиться
//что все нити закончили работу с частью вектора
//потому что следующая операция - перезапись разделяемой памяти
__syncthread();
}
В данном коде можно сделать ещё одну оптимизацию – перенести операции над вектором C в разделяемую память. И скопировать результат в глобальную только после того как результат будет посчитан. С учётом этого алгоритм будет выглядеть следующим образом:
//Выделяем разделяемую память
//Количество элементов будет равно количеству нитей в блоке.
__shared__ shared_vector[THREAD_PER_BLOCK];
__shared__ shared_c[THREAD_PER_BLOCK];

shared_c[threadId.x] = 0;
__syncthread();

//k - номер части вектора. +1 потому что M не обязательно делится нацело
for(k = 0; k < (M / THREAD_PER_BLOCK) + 1; ++k) {
//p - реальный номер элемента вектора
//который будет скопирован нитью в разделяемую память
p = threadIdx.x + THREAD_PER_BLOCK * k;
//Проверка на выход за пределы вектора
if(p < M) {
//Копирование из глобальной памяти в разделяемую
//Т.к. размер разделяемой памяти равен размеру блока
//Каждая нить может скопировать по одному элементу
 shared_vector[threadIdx.x] = V[threadIdx.x + THREAD_PER_BLOCK * k];
}
//Синхронизация. Нужно дождаться пока все нити скопируют свои элементы
//Потому что каждая нить использует скопированную часть вектора полностью
__syncthread();
//i - глобальный номер нити, N - количество строк в матрице
//Проверка не выходим ли за границы матрицы
if (i < N) {
//Умножение части вектора на часть строки
//j - порядковый номер элемента в части вектора или строки матрицы
//чтобы получить реальный номер элемента матрицы
//нужно прибавить j количеству полностью обработанных элементов
 for(j = 0; j < THREAD_PER_BLOCK; ++j) {
 shared_c[threadIdx.x] += A[i][j + k * THREAD_PER_BLOCK] * shared_vector[j];
}
}
//Синхронизация нужна для того чтобы убедиться
//что все нити закончили работу с частью вектора
//потому что следующая операция - перезапись разделяемой памяти
__syncthread();
}
if ( i < N ) {
 С[i] = shared_c[threadId.x];
}
__syncthread();
Модификация кода хоста в этой лабораторной работе не требуется
Для анализа эффективности доступа к разделяемой памяти используйте утилиту nvprof. События для профилирования: shared_ld_bank_conflict – количество конфликтов банков памяти при считывании данных, shared_st_bank_conflict– количество конфликтов банков памяти при записи данных. И метрики: shared_efficiency – эффективность использования пропускной способности шины данных разделяемой памяти, shared_load_transactions_per_request – количество транзакций при каждом запросе к разделяемой памяти.
По аналогии оптимизируйте алгоритм

Дополнительная информация

зачет
Программирование графических процессоров. Лабораторная работа №2
Тема: Работа с разделяемой памятью Задание 1. Прочитайте главу из теоретического материала "Разделяемая память" и ответьте на контрольные вопросы (ответы на контрольные вопросы не нужно включать в отчёт по лабораторной работе). 2. Оптимизируйте алгоритмы, реализованные в лабораторной работе №1 при помощи разделяемой памяти. 3. Постройте графики зависимости времени выполнения алгоритма от размера матрицы и вектора (Размеры матрицы 1000x500, 1000x1000, 1500x1000, 2000x1000, 2000x1500, 2500x1500, 2
User pleze : 20 марта 2022
300 руб.
Лабораторная работа 2 Программирование графических процессоров Все варианты 2023 год
2023 год СибГУТИ Сибирский государственный университет телекоммуникаций и информатики Милешко Антон Владимирович Тема: Лабораторная работа 1 2 3 Программирование графических процессоров Все варианты 2023 год Задания Лабораторная работа №2 по курсу «Программирование графических процессоров» на тему «Работа с разделяемой памятью» Выполнение лабораторной работы поможет получить навыки требующиеся для выполнения второго и третьего заданий контрольной работы. Задание 1. Прочитайте главу из теоретич
User SibSUTTI : 1 сентября 2023
198 руб.
promo
Лабораторная работа 1 2 3 Программирование графических процессоров Все варианты 2023 год
Выполнение лабораторной работы поможет получить навыки, требующиеся для выполнения первого и третьего заданий контрольной работы. Задание 1. Прочитайте главы теоретического материала под названиями "Отличия GPU от CPU", "Первая программа на CUDA C", "Алгоритм сложения двух векторов на GPU", "События, обработка ошибок и получение информации об устройстве", "Глобальная, локальная и константная память". Ответьте на контрольные вопросы и выполните контрольные задания, предложенные в конце этих глав
User Alexey312451 : 16 марта 2024
400 руб.
Лабораторная работа 1 2 3 Программирование графических процессоров Все варианты 2023 год
2023 год СибГУТИ Сибирский государственный университет телекоммуникаций и информатики Милешко Антон Владимирович Тема: Лабораторная работа 1 2 3 Программирование графических процессоров Все варианты 2023 год Задания Лабораторная работа №1 по курсу «Программирование графических процессоров» на тему «Работа с глобальной памятью» Выполнение лабораторной работы поможет получить навыки, требующиеся для выполнения первого и третьего заданий контрольной работы. Задание 1. Прочитайте главы теоретическ
User SibSUTTI : 1 сентября 2023
498 руб.
promo
Лабораторная работа №2 "Работа с разделяемой памятью" по дисциплине "Программирование графических процессоров". Вариант общий
Выполнение лабораторной работы поможет получить навыки требующиеся для выполнения второго и третьего заданий контрольной работы. Задание 1. Прочитайте главу из теоретического материала "Разделяемая память" и ответьте на контрольные вопросы (ответы на контрольные вопросы не нужно включать в отчёт по лабораторной работе). 2. Оптимизируйте алгоритмы, реализованные в лабораторной работе №1 при помощи разделяемой памяти. 3. Постройте графики зависимости времени выполнения алгоритма от размера матрицы
User vpozyaikin : 1 марта 2021
500 руб.
Лабораторная работа 2 (Вариант 3) По дисциплине: Программирование графических процессоров. Тема: «Работа с разделяемой памятью».
Задание 1. Прочитайте главу из теоретического материала "Разделяемая память" и ответьте на контрольные вопросы (ответы на контрольные вопросы не нужно включать в отчёт по лабораторной работе). 2. Оптимизируйте алгоритмы, реализованные в лабораторной работе №1 при помощи разделяемой памяти. 3. Постройте графики зависимости времени выполнения алгоритма от размера матрицы и вектора (Размеры матрицы 1000x500, 1000x1000, 1500x1000, 2000x1000, 2000x1500, 2500x1500, 2500x2000). 4. Проанализируйте, реал
User alexadubinina : 21 ноября 2024
300 руб.
Отделитель жидкого аммиака-Чертеж-Графическая часть-Оборудование-Машины и механизмы-Агрегаты-Узлы-Детали-Курсовая работа-Дипломная работа
Отделитель жидкого аммиака-(Формат Компас-CDW, Autocad-DWG, Adobe-PDF, Picture-Jpeg)-Чертеж-Графическая часть-Оборудование-Машины и механизмы-Агрегаты-Узлы-Детали-Курсовая работа-Дипломная работа
276 руб.
Отделитель жидкого аммиака-Чертеж-Графическая часть-Оборудование-Машины и механизмы-Агрегаты-Узлы-Детали-Курсовая работа-Дипломная работа
Организация обслуживания физических лиц подразделением банка
Введение Актуальность темы исследования. В современных условиях развитие банковского сектора во многом осуществляется за счет увеличения доли услуг, предоставляемых коммерческими банками физическим лицам, или иными словами – розничных банковских услуг. Стремительный рост рынка розничных банковских услуг, наблюдающийся в настоящее время, обостряет межбанковскую конкуренцию, что требует от банков все большей ориентации на потребителей. В условиях кризисных явлений мировой финансовой системы для
User Lokard : 3 декабря 2013
10 руб.
Организация, нормирование и оплата труда, вариант № 1
Содержание 1.Цель работы 2.Исходные данные 3.Проектирование нормативной структуры затрат рабочего времени исполнителя 4. Анализ использования рабочего времени 5. Анализ хронометражных раядов 6. Расчет норм выработки 7. Определение эффективности внедрения проектируемых норм выработки 11 Заключение По результатам фотографий рабочего времени, проведенных за исполнителями различных профессий, в таблице 1 представлены средние фактические затраты времени за смену. Таблица 1. Фактическая стру
User тантал : 18 августа 2013
100 руб.
Управління оперативним фінансовим лізингом на підприємстві житлово комунального господарства
ПЛАН Вступ Сутність поняття лізингу. 1.1. Поняття та форми лізингу. 1.2. Укладання лізингового договору. Аналіз ефективності управління лізингом на підприємстві житлово-комунального господарства. 2.1 Економічна характеристика підприємства. 2.2 Аналіз ефективності оперативного лізингу. 2.3 Аналіз ефективності фінансового лізингу. Проблеми лізингових відносин, основні напрями їх покращення. Висновки Список використаної літератури. ВСТУП Перехід України до ринкової економіки і активне
User Qiwir : 27 октября 2013
10 руб.
up Наверх