Лабораторная работа №3 "Работа с потоками CUDA" по дисциплине "Программирование графических процессоров". Вариант общий
Состав работы
|
|
|
|
Необходимые программы
Работа представляет собой rar архив с файлами (распаковать онлайн), которые открываются в программах:
- Adobe Acrobat Reader
Описание
Выполнение лабораторной работы поможет получить навыки требующиеся для выполнения третьего задания контрольной работы.
Задание
1. Прочитайте главы теоретического материала под названиями "Pinned memory" и "Потоки (streams) в CUDA". Ответьте на контрольные вопросы в конце глав (ответы на контрольные вопросы не нужно включать в отчёт по лабораторной работе).
2. Примените потоки для алгоритмов реализованные в лабораторной работе №1.
3. Определите оптимальное количество потоков для матрицы размером 2500x2500 элементов и вектора размером 2500 элементов.
Методические указания
Для выполнения лабораторной работы требуется модифицировать код, выполняемый на хосте таким образом, чтобы данные передавались на устройство частями асинхронно, после этого выполнялось функция-ядро над переданной частью, после завершения вычислений часть ответа асинхронно должна копироваться на хост.
На хосте создайте и проинициализируйте матрицу и вектор, которые будут умножаться. Затем выделите память на хосте под результирующий вектор и проинициализируйте его нулями. Выделите память под матрицу и вектора на устройстве, создайте нужное количество потоков (начните с двух потоков).
Теперь нужно определиться какие части данных передавать в каждый поток. Разделение нужно произвести таким образом, чтобы результатом работы функции-ядра была часть конечного результата, не требующая дальнейшей обработки. В таком случае имеет смысл в каждом потоке передавать на устройство часть строк матрицы, а вектор передать сразу полностью, потому что для вычислений, каждой нитью используется одна строка из матрицы и вектор. Результатом работы нити будет один элемент результирующего вектора.
Для того чтобы определить размер порции данных нужно количество строк матрицы поделить на количество потоков, и результат умножить на длину строки. После этого полностью скопируйте значения вектора на устройство. И для каждого потока асинхронно скопируйте часть данных на устройство, используя функцию cudaMemcpyAsync, запустите вычисления над порцией данных, асинхронно скопируйте результат на хост. В конце синхронизируйте все потоки вызовом функции cudaDeviceSynchronize() – эта функция будет ожидать завершения всех запущенных потоков.
Проведите исследование зависимости времени работы алгоритма от количества потоков. Начните с двух потоков и увеличивайте их количество до тех пор, пока время, затраченное на вычисления, не перестанет уменьшаться. Замеры времени следует проводить, включая асинхронные пересылки данных.
Псевдокод алгоритма выглядит следующим образом:
//Создание объектов потоков
//NUM_STREAM - количество потоков
for(i = 0; i < NUM_STREAM; ++i) {
CreateStream(stream[i]);
}
//N - количество строк в матрице
//M - размер строки в матрице
//Строки матрицы делятся на части по количеству созданных потоков
//Размер каждой порции равен количеству строк в порции умноженное на размер строки
SIZE_CHUNK = (N / NUM_STREAM) * M;
//Вектор копируется на устройство полностью, его разбивать на части не имеет смысла
Memcpy(devPtrVector, hostPtrVector, M, HostToDevice);
//Для каждого потока асинхронно копируется несколько строк матрицы на устройство
//Затем выполняется функция-ядро
//после этого результат асинхронно копируется на хост
//SIZE_CHUNK - размер части данных с которым работает функция-ядро
//devPtr - адрес памяти, выделенной на устройстве под матрицу, куда копируются данные с хоста
//hostPtr - адрес памяти на хосте под матрицу откуда копируются данные
//---в этой точке нужно измерить время
for(i = 0; i < NUM_STREAM; ++i) {
MemcpyAsync(devPtr + i * SIZE_CHUNK, hostPtr + i * SIZE_CHUNK, SIZE_CHUNK, HostToDevice, stream[i]);
//Количество блоков теперь зависит не от общего размера данных
//а от размера порции данных
//devPtrResultVector - адрес результирующего вектора на устройстве
MulMatrixVector<<<SIZE_CHUNK / THREADS_PER_BLOCK + 1, THREADS_PER_BLOCK, stream[i]>>>(devPtr + i * SIZE_CHUNK, devPtrVector + i * SIZE_CHUNK, devPtrResultVector + i * SIZE_CHUNK);
MemcpyAsync(hostPtrResultVector + i * SIZE_CHUNK, devPtrResultVector + i * SIZE_CHUNK, SIZE_CHUNK, DeviceToHost, stream[i]);
}
DeviceSynchronize();
//---в этой точке нужно повторно измерить время
//разность между временем второй и первой точки измерения времени будет временем работы вычислений
Задание
1. Прочитайте главы теоретического материала под названиями "Pinned memory" и "Потоки (streams) в CUDA". Ответьте на контрольные вопросы в конце глав (ответы на контрольные вопросы не нужно включать в отчёт по лабораторной работе).
2. Примените потоки для алгоритмов реализованные в лабораторной работе №1.
3. Определите оптимальное количество потоков для матрицы размером 2500x2500 элементов и вектора размером 2500 элементов.
Методические указания
Для выполнения лабораторной работы требуется модифицировать код, выполняемый на хосте таким образом, чтобы данные передавались на устройство частями асинхронно, после этого выполнялось функция-ядро над переданной частью, после завершения вычислений часть ответа асинхронно должна копироваться на хост.
На хосте создайте и проинициализируйте матрицу и вектор, которые будут умножаться. Затем выделите память на хосте под результирующий вектор и проинициализируйте его нулями. Выделите память под матрицу и вектора на устройстве, создайте нужное количество потоков (начните с двух потоков).
Теперь нужно определиться какие части данных передавать в каждый поток. Разделение нужно произвести таким образом, чтобы результатом работы функции-ядра была часть конечного результата, не требующая дальнейшей обработки. В таком случае имеет смысл в каждом потоке передавать на устройство часть строк матрицы, а вектор передать сразу полностью, потому что для вычислений, каждой нитью используется одна строка из матрицы и вектор. Результатом работы нити будет один элемент результирующего вектора.
Для того чтобы определить размер порции данных нужно количество строк матрицы поделить на количество потоков, и результат умножить на длину строки. После этого полностью скопируйте значения вектора на устройство. И для каждого потока асинхронно скопируйте часть данных на устройство, используя функцию cudaMemcpyAsync, запустите вычисления над порцией данных, асинхронно скопируйте результат на хост. В конце синхронизируйте все потоки вызовом функции cudaDeviceSynchronize() – эта функция будет ожидать завершения всех запущенных потоков.
Проведите исследование зависимости времени работы алгоритма от количества потоков. Начните с двух потоков и увеличивайте их количество до тех пор, пока время, затраченное на вычисления, не перестанет уменьшаться. Замеры времени следует проводить, включая асинхронные пересылки данных.
Псевдокод алгоритма выглядит следующим образом:
//Создание объектов потоков
//NUM_STREAM - количество потоков
for(i = 0; i < NUM_STREAM; ++i) {
CreateStream(stream[i]);
}
//N - количество строк в матрице
//M - размер строки в матрице
//Строки матрицы делятся на части по количеству созданных потоков
//Размер каждой порции равен количеству строк в порции умноженное на размер строки
SIZE_CHUNK = (N / NUM_STREAM) * M;
//Вектор копируется на устройство полностью, его разбивать на части не имеет смысла
Memcpy(devPtrVector, hostPtrVector, M, HostToDevice);
//Для каждого потока асинхронно копируется несколько строк матрицы на устройство
//Затем выполняется функция-ядро
//после этого результат асинхронно копируется на хост
//SIZE_CHUNK - размер части данных с которым работает функция-ядро
//devPtr - адрес памяти, выделенной на устройстве под матрицу, куда копируются данные с хоста
//hostPtr - адрес памяти на хосте под матрицу откуда копируются данные
//---в этой точке нужно измерить время
for(i = 0; i < NUM_STREAM; ++i) {
MemcpyAsync(devPtr + i * SIZE_CHUNK, hostPtr + i * SIZE_CHUNK, SIZE_CHUNK, HostToDevice, stream[i]);
//Количество блоков теперь зависит не от общего размера данных
//а от размера порции данных
//devPtrResultVector - адрес результирующего вектора на устройстве
MulMatrixVector<<<SIZE_CHUNK / THREADS_PER_BLOCK + 1, THREADS_PER_BLOCK, stream[i]>>>(devPtr + i * SIZE_CHUNK, devPtrVector + i * SIZE_CHUNK, devPtrResultVector + i * SIZE_CHUNK);
MemcpyAsync(hostPtrResultVector + i * SIZE_CHUNK, devPtrResultVector + i * SIZE_CHUNK, SIZE_CHUNK, DeviceToHost, stream[i]);
}
DeviceSynchronize();
//---в этой точке нужно повторно измерить время
//разность между временем второй и первой точки измерения времени будет временем работы вычислений
Дополнительная информация
Уважаемый студент дистанционного обучения,
Оценена Ваша работа по предмету: Программирование графических процессоров
Вид работы: Лабораторная работа 3
Оценка:Зачет
Дата оценки: 27.02.2021
Рецензия:Уважаемый
Ваша работа зачтена.
Милешко Антон Владимирович
Оценена Ваша работа по предмету: Программирование графических процессоров
Вид работы: Лабораторная работа 3
Оценка:Зачет
Дата оценки: 27.02.2021
Рецензия:Уважаемый
Ваша работа зачтена.
Милешко Антон Владимирович
Похожие материалы
Лабораторная работа 3 (Вариант 3) По дисциплине: Программирование графических процессоров. Тема: «Работа с потоками CUDA».
alexadubinina
: 21 ноября 2024
Задание
1. Прочитайте главы теоретического материала под названиями "Pinned memory" и "Потоки (streams) в CUDA". Ответьте на контрольные вопросы в конце глав (ответы на контрольные вопросы не нужно включать в отчёт по лабораторной работе).
2. Примените потоки для алгоритмов реализованные в лабораторной работе №1.
3. Определите оптимальное количество потоков для матрицы размером 2500x2500 элементов и вектора размером 2500 элементов.
300 руб.
Языки программирования. Вариант общий
SibGOODy
: 12 мая 2020
Контрольная работа
«Разработка динамических страниц на ЯП Python»
Цель работы: создание динамических страниц на языке высокого уровня Python при помощи CGI-скриптов.
CGI-скрипты – это исполняемые файлы, которые выполняются веб-сервером, когда в URL запрашивается соответствующий скрипт.
Методика выполнения работы включает следующие этапы:
1. Настройка локального сервера.
2. Написание и отладка CGI-скриптов.
3. Написание и отладка CGI-скриптов: получение данных.
600 руб.
Персональный менеджмент. Вариант общий
rmn77
: 19 марта 2020
Контрольная работа. Персональный менеджмент. Вариант общий
Задание 1
Цель работы – отразить результаты работы по самоанализу своей деятельности, целеполаганию и формированию плана профессиональной карьеры.
Примерная структура работы включает:
1. Мои профессиональные цели.
2. Ситуация на рынке труда. Обзор требований работодателей к соискателям. Самоанализ.
Задание 2 (УК-6.2)
ЗАДАНИЕ (тип эссе)
Руководствуясь личностным подходом к персональному менеджменту, выполните SWOT-анализ личных и пр
120 руб.
Онлайн ТЕСТ Философия Вариант общий
sibguti-help
: 5 ноября 2024
Вопрос №1
Тип культуры не подразумевает этнического единства, развиваясь как комплекс отдельных народов и государств. Экспансивные устремления способствовали подвижности её географических границ:
культура восточная
культура западная
культура национальная
Вопрос №2
Перечислите античные философские школы в порядке их возникновения?
Пифагореизм
Платоновская Академия
Ликей Аристотеля
Неоплатонизм
Вопрос №3
Компетенция человека, действующего в сфере свободного предпринимательства, основанная на з
450 руб.
Онлайн ТЕСТ Философия Вариант общий
sibguti-help
: 28 октября 2024
Вопрос №1
Интенсивное сближение цивилизаций, выражающееся во взаимопроникновении, конвергенции передовых технологий, массовой культуры, религий, идей, связанных с отношением к личности:
диалог культур
новации
традиции
Вопрос №2
Ф.Аквинский, решая вопрос об отношении веры и разума, исходил из того, что
Религия возвышается над философией
Религия и философия одним и тем же способом приходят к истине
Религия не может быть совершенно автономной по отношению к философии
Философия возвышается над ре
450 руб.
Отчет по ознакомительной практике (вариант общий)
Учеба "Под ключ"
: 9 сентября 2022
Задание на ознакомительную практику состоит из четырех мини-рефератов:
Схему из файла читать сверху-вниз. Каждому блоку схемы соответствует список тем.
мини-реферат 1: Из базовой секции выбрать одну тему
мини-реферат 2 и 3: Из секции специализации выбрать две темы (из разных разделов), которые по схеме исходят из блока 1
мини-реферат 4. Из секции углублённой специализации выбрать одну тему, которая по схеме следует из блоков 2 или 3 секции специализации
Важно: Каждый последующий блок тем до
800 руб.
"Социология и право". Вариант общий. ДО СИБГУТИ
Ivannsk97
: 14 июня 2021
Тема: "Нищенство как социальная проблема"
Темы рефератов по модулю «Социология»
1. Социологическое воображение в представлениях Ч.Миллса
2. З.Бауман: «мыслить социологически» - что это значит?
3. Социальное действие в концепциях М.Вебера и Т.Парсонса: сравнительный анализ
4. Социальное взаимодействие как обмен
5. Социальная природа юмора
6. Драматургический анализ: «самопрезентация» (И.Гофман)
7.Социальныйконтроль над девиантностью в современной России
8.Проблемабюрократии в современных
100 руб.
Общая теория связи, Лабораторная работа, Вариант общий
artinjeti
: 13 ноября 2018
Лабораторная работа №1
«Исследование помехоустойчивости дискретных видов модуляции»
Цель работы: изучение и экспериментальное исследование влияния вида модуляции (AM, ЧМ, ФМ) на помехоустойчивость системы передачи дискретных сообщений, изучение методики экспериментального измерения вероятности ошибки.
Лабораторная работа №2
«Исследование помехоустойчивости методов передачи и приема дискретных сигналов на автоматизированном рабочем месте СПИ»
Цель работы: изучение методов обработки дискретных с
20 руб.
Другие работы
Презентация: Очистка сточных вод
Никита115
: 22 августа 2017
Цель:
Изучить методы очистки сточных вод.
Задачи:
1) Механический метод;
2) Химический метод;
3) Физико-химический метод;
4) Биологический метод;
5) Дезинфекция, примеры;
6) Показать где находятся очистные сооружения в Новосибирске.
34 слайда
10 руб.
Контрольная работа по дисциплине: Стандартизация и сертификация. Вариант №13
IT-STUDHELP
: 10 августа 2019
ЧАСТЬ 1 АВТОМАТИЗАЦИЯ РАСЧЕТА ТЕХНИКО-ЭКОНОМИЧЕСКОГО ОБОСНОВАНИЯ ПРОЕКТА
Цель работы: изучить структуру технико-экономического обоснования эффективности проекта по разработке автоматизированной информационной системы на основе сравнения с аналогом и автоматизировать процесс расчета ТЭО.
Задание
1. Выбрав инструментальную среду программирования, автоматизировать весь расчетный процесс технико-экономического обоснования, создав удобный пользовательский интерфейс, позволяющий проводить параметриче
900 руб.
Модернизация установки скважинного электроцентробежного насоса. Дипломный проект-Оборудование для добычи и подготовки нефти и газа
https://vk.com/aleksey.nakonechnyy27
: 15 марта 2016
РЕФЕРАТ
В данном дипломном проекте рассматривается модернизация установки скважинного электроцентробежного насоса. Предлагается установка дополнительного оборудования (забойного фильтра или центробежного сепаратора) для предотвращения засорения насоса абразивами (пропант после гидравлического разрыва пласта и песок) которые негативно влияют на наработки установок погружных электроцентробежных насосов. Дает возможность производить очистку забоя скважины от механических примесей и позволяет защит
3485 руб.
Курсовая работа по дисциплине: Электроника. Вариант 16
Roma967
: 16 августа 2019
РАЗРАБОТКА ИНТЕГРАЛЬНОГО АНАЛОГОВОГО УСТРОЙСТВА
Содержание
Задание на курсовую работу 3
Введение 4
1. Разработка структурной схемы 5
2. Разработка принципиальной схемы 6
Расчет второго каскада: 8
3. Разработка интегральной микросхемы 13
3.1. Выбор навесных элементов и расчет конфигурации пленочных элементов 13
3.2. Разработка топологии 15
3.3. Этапы изготовления устройства в виде гибридной интегральной микросхемы 17
Заключение 19
Список литературы 20
Задание на курсовую работу
Разработать прин
1000 руб.