Перемножение матриц (Matrix multiplication) CUDA
-
IvanLis
- guru
- Сообщения: 5526
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 32 раза
- Поблагодарили: 98 раз
Перемножение матриц (Matrix multiplication) CUDA
Задача первая: Перемножение матриц
Необходимо умножить матрицу A на матрицу B, порядок вычислений и ограничения можно посмотреть например тут: http://www.mathprofi.ru/deistviya_s_matricami.html
Работать будем с типом данных DBL. На сайте BLAS, смотрим описание функций, нам подходит функция DGEMM - matrix matrix multiply. В GPU Analysis Toolkit ей соответствует функция xGEMM: http://zone.ni.com/reference/en-XX/help ... gpu_xgemm/ , функция подстраивается под предопределенный тип данных.
Ну и не забываем, что для корректного умножения, необходимо соблюдать правило: количество строк первой матрицы = количеству столбцов второй.
Сразу не пугайтесь, кубиков много на BD, но все понятно Здесь:
1. Инициализация GPU.
2. Инициализация библиотеки cuBLAS.
3, 4. Резервирование области памяти GPU и загрузка в нее значений переменных A и B.
5. Резервирование области памяти GPU под результат расчетов, туда будет сохранены значения C.
6. Собственно, передаем команду на вычисление. Функция xGEMM выполняет вычисления по формуле aAB+bC. По этому для перемножения задаем значения a=1, b=0. Так же передаются значения m, n, k - размерность матриц.
7. Выгрузка результатов вычислений из GPU -матрица C.
8, 9, 10. Очистка памяти GPU.
11, 12. Отключение библиотеки и GPU.
Все логично и понятно.
Все что не вошло в квадраты, нацелено на вычисление размерности матриц и инициализации матрицы C.
Необходимо умножить матрицу A на матрицу B, порядок вычислений и ограничения можно посмотреть например тут: http://www.mathprofi.ru/deistviya_s_matricami.html
Работать будем с типом данных DBL. На сайте BLAS, смотрим описание функций, нам подходит функция DGEMM - matrix matrix multiply. В GPU Analysis Toolkit ей соответствует функция xGEMM: http://zone.ni.com/reference/en-XX/help ... gpu_xgemm/ , функция подстраивается под предопределенный тип данных.
Ну и не забываем, что для корректного умножения, необходимо соблюдать правило: количество строк первой матрицы = количеству столбцов второй.
Сразу не пугайтесь, кубиков много на BD, но все понятно Здесь:
1. Инициализация GPU.
2. Инициализация библиотеки cuBLAS.
3, 4. Резервирование области памяти GPU и загрузка в нее значений переменных A и B.
5. Резервирование области памяти GPU под результат расчетов, туда будет сохранены значения C.
6. Собственно, передаем команду на вычисление. Функция xGEMM выполняет вычисления по формуле aAB+bC. По этому для перемножения задаем значения a=1, b=0. Так же передаются значения m, n, k - размерность матриц.
7. Выгрузка результатов вычислений из GPU -матрица C.
8, 9, 10. Очистка памяти GPU.
11, 12. Отключение библиотеки и GPU.
Все логично и понятно.
Все что не вошло в квадраты, нацелено на вычисление размерности матриц и инициализации матрицы C.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
- kapusta1986
- assistant
- Сообщения: 103
- Зарегистрирован: 14 июн 2014, 13:56
- Версия LabVIEW: 2014, 2015
- Откуда: Караганда
- Контактная информация:
Re: Перемножение матриц (Matrix multiplication) CUDA
А где в промышленности можно использовать такое чудо?
-
dadreamer
- professor
- Сообщения: 3957
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2024
- Благодарил (а): 12 раз
- Поблагодарили: 138 раз
- Контактная информация:
Re: Перемножение матриц (Matrix multiplication) CUDA
IvanLis, наблюдаю с интересом за обоими темами... Накопились кое какие вопросы, но целиком весь список пока озвучивать не буду, ведь вроде бы материал ещё не закончен (?). Пока только один вопрос задам: сравнивали ли быстродействие на обычном ЦП и на CUDA между собой? Какие получаются времена, какой расход памяти, когда уместнее одно, а когда другое... А так, материал весьма полезный.
-
IvanLis
- guru
- Сообщения: 5526
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 32 раза
- Поблагодарили: 98 раз
Re: Перемножение матриц (Matrix multiplication) CUDA
Все работает, все замечательно, но стоит ли заморачиваться с CUDA, если в LabVIEW перемножение матриц выглядит:
Тестировалось на стареньком ПК с параметрами: Параметры видео GeForce GT 610:
Windows XP, по этому и драйвер старенький и DirectX не последней версии. Да и сама видеокарта лежит в самом низу CUDA GPU (http://www.geforce.com/hardware/compare-buy-gpus).
Результаты тестирования: Перемножение квадратных матриц CUDA начинает выигрывать при количестве элементов более 1.5 мл.
Однако при перемножении прямоугольных матриц результат следующий Выигрыш начинается уже при 0.8 мл., возможно это связано с использованием быстрых алгоритмов при перемножении квадратных матриц.
Однако не логично каждый раз инициализировать GPU и cuBLAS, по этому мы их вынесем из функции. В принципе при реальных вычислениях более правильно и переменные инициализировать один раз. Вот результаты тестирования, когда инициализация вынесена за пределы функции:
Для квадратных матриц - пересечение 0.8 мл. Для прямоугольных матриц - пересечение 0.5 мл.
значительно проще, чем постом выше .Тестировалось на стареньком ПК с параметрами: Параметры видео GeForce GT 610:
Код: Выделить всё
Версия DirectX: 9.0
Версия драйвера: 340.62
Поддержка DirectX: 9
Ядра CUDA: 48
Тактовая частота ядра: 810 МГц
Тактовая частота шейдера: 1620 МГц
Скорость передачи данных памяти: 1070 МГц
Интерфейс памяти: 64 бит
Память: 2048 МБ
Тип памяти: DDR3
Версия BIOS видео: 75.19.56.00.00
IRQ: 16
Шина: PCI Express x16
Результаты тестирования: Перемножение квадратных матриц CUDA начинает выигрывать при количестве элементов более 1.5 мл.
Однако при перемножении прямоугольных матриц результат следующий Выигрыш начинается уже при 0.8 мл., возможно это связано с использованием быстрых алгоритмов при перемножении квадратных матриц.
Однако не логично каждый раз инициализировать GPU и cuBLAS, по этому мы их вынесем из функции. В принципе при реальных вычислениях более правильно и переменные инициализировать один раз. Вот результаты тестирования, когда инициализация вынесена за пределы функции:
Для квадратных матриц - пересечение 0.8 мл. Для прямоугольных матриц - пересечение 0.5 мл.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
IvanLis
- guru
- Сообщения: 5526
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 32 раза
- Поблагодарили: 98 раз
Re: Перемножение матриц (Matrix multiplication) CUDA
Долго писал пост, по этому вопросы возникли раньше его окончания.dadreamer писал(а):ведь вроде бы материал ещё не закончен (?). Пока только один вопрос задам: сравнивали ли быстродействие на обычном ЦП и на CUDA между собой? Какие получаются времена, какой расход памяти, когда уместнее одно, а когда другое...
Без сравнения конечно не интересно, иначе для чего все это
По поводу памяти, сразу не посмотрел, теперь отпишусь только после праздников.
Прогнал только по времени, но исходя из того, что при расчете на GPU задействуются его память и ресурсы, а в это время CPU простаивает, а ОЗУ используется только для хранения массивов, то выигрыш предсказуем.
Но это только предположение, результаты позже.
Если буду располагать временем, то попытаюсь реализовать на функциях более низкого уровня. Сейчас используется xGEMM - LEVEL 3 и выполняется вычисление aAB+bC. Исходя из логики AB должно работать быстрее. Но опять, все предположения, опыта не имею, можно сказать изучаю вместе с Вами .
Думаю на такой GPU (http://www.nvidia.ru/object/tesla-server-gpus-ru.html), результаты были бы иные
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
dadreamer
- professor
- Сообщения: 3957
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2024
- Благодарил (а): 12 раз
- Поблагодарили: 138 раз
- Контактная информация:
Re: Перемножение матриц (Matrix multiplication) CUDA
Ну да, скорее всего, загрузку памяти можно не смотреть вовсе. Из того, что я вижу, использовать CUDA имеет смысл только при работе с очень большими объемами данных или при очень трудоемких мат. операциях. Не даром же большинство брутфорсеров и хэш-крякалок используют именно этот механизм. Получается быстрее, нежели на обычном ЦП, так как графических ядер много, а на каждое ядро можно определить один или множество потоков, и запустить всё это хозяйство параллельно.
И это, кстати, не менее интересная задача: как выбрать в конкретное ядро ГП и определить для него поток. Что-то сходу не удалось найти ответ на такой вопрос. Может, плохо искал. Нашёл только в статье http://www.ni.com/white-paper/14077/en/ вот это:
Однако времени на эксперименты мало, к сожалению.
P.S.: весьма полезная статья в плане программирования: http://docs.nvidia.com/cuda/cuda-c-programming-guide/
И это, кстати, не менее интересная задача: как выбрать в конкретное ядро ГП и определить для него поток. Что-то сходу не удалось найти ответ на такой вопрос. Может, плохо искал. Нашёл только в статье http://www.ni.com/white-paper/14077/en/ вот это:
Подозреваю, что нужно писать библиотеку с пользовательскими функциями и в ней выполнятьNI писал(а):Note that the toolkit will not compile LabVIEW code for use on a GPU, but rather it enables wrapped CUDA functions or user-defined CUDA kernels to be used in LabVIEW. By handling both CUDA kernel operations and their parameters using a unique device execution environment, known as a CUDA context, advanced user-defined kernels can be safely called during LabVIEW execution. This context also ensures that all GPU resource and function requests are properly managed.
Код: Выделить всё
kernel<<< blocks, threadsPerBlock >>>( ... );
P.S.: весьма полезная статья в плане программирования: http://docs.nvidia.com/cuda/cuda-c-programming-guide/
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: Перемножение матриц (Matrix multiplication) CUDA
Механизм || да! Но там GPU не справляется совсем Ламеры используют FPGA, а бывалые исключительно ASIC Была идея у товарища ПЛИСоферму забубенить в университете. Дома дорого электричество жечь. Только тсссс...dadreamer писал(а):CUDA имеет смысл только при работе с очень большими объемами данных...брутфорсеров и хэш-крякалок используют именно этот механизм
GPU с поддержкой CUDA у нас применяли в университете для обработки изображений, например(но делали не в LabVIEW...на Си+SDK соответствующий). Алгоритм хорошо паралелился и работа с матрицей. CUDA GPU - SIMD-технология. Одна инструкция на все ядра заходит за милую душу. Получали выигрыш по сравнению с CPU порядка 30-40% в среднем(отнюдь были некоторые операции и в 10% разницы, а некоторые в 70%). А затем всё равно переносили на FPGA.
CUDA очень востребована при обработке медицинских изображений в real-time. Видеокарта значительно дешевле, чем хорошая ПЛИС. А при необходимости можно поставить 2 видеокарты.
Иван, молодец что начал эту ветку! С удовольствием присоединюсь к обучению.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
IvanLis
- guru
- Сообщения: 5526
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 32 раза
- Поблагодарили: 98 раз
Re: Перемножение матриц (Matrix multiplication) CUDA
Это именно обертка на CUDA SDK.dadreamer писал(а):И это, кстати, не менее интересная задача: как выбрать в конкретное ядро ГП и определить для него поток. Что-то сходу не удалось найти ответ на такой вопрос. Может, плохо искал.
На сколько я понял в это сделать нельзя. Но если залезть в SDK, то там это можно сделать. Я начал с него смотреть, но знаний не хватает, на быстрый StartUp.
Вообще хотел сделать нечто обертки - wrapper (конечно моя задача немного преувеличена ), на необходимые мне функции и/или написать небольшие функции, а уже их вызывать в LabVIEW. Т.к. нужно это сделать в Linux, в котором данная приблуда не работает.
Если получится, то обязательно поделюсь результатами.
Обрабатывать планируется именно изображения, что удобно делать используя матричные вычисления.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
dadreamer
- professor
- Сообщения: 3957
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2024
- Благодарил (а): 12 раз
- Поблагодарили: 138 раз
- Контактная информация:
Re: Перемножение матриц (Matrix multiplication) CUDA
IvanLis, ну вот, хотя бы это сделать:
Написано здесь. Выборочно полистал хэлп на , но там ничего такого нет.For advanced users, the toolkit contains documentation on calling your custom GPU code from LabVIEW applications
-
IvanLis
- guru
- Сообщения: 5526
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 32 раза
- Поблагодарили: 98 раз
Re: Перемножение матриц (Matrix multiplication) CUDA
Нужно копать в низшего уровня, наверняка на них даже описания документированного нет. Там возможно и будет такая возможность.dadreamer писал(а):Выборочно полистал хэлп на , но там ничего такого нет.
У меня на на работе все установлено, можно посмотреть потроха функции инициализации GPU, если есть, то наверняка там.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
alerm
- leader
- Сообщения: 687
- Зарегистрирован: 02 май 2012, 21:28
- Награды: 1
- Версия LabVIEW: 20
- Благодарил (а): 61 раз
- Поблагодарили: 11 раз
- Контактная информация:
Re: Перемножение матриц (Matrix multiplication) CUDA
Так, я очень сильно опозорился, как оказалось, я не перемножал матрицы, а вообще не пойми что делал.
Итак Get Version Information.vi выдает следующую информацию:
CUDA Build version 4.1
CUDA Driver version 11.7
CUDA Runtime version 11.7
Initialize Device.vi выдает: CUDA Version 11.7
а вот Initialize Library.vi выдает: CUBLAS Version 0.0 и итоговая матрица остается пустой Прошу указать на мою ошибку и направить на верный путь.
Итак Get Version Information.vi выдает следующую информацию:
CUDA Build version 4.1
CUDA Driver version 11.7
CUDA Runtime version 11.7
Initialize Device.vi выдает: CUDA Version 11.7
а вот Initialize Library.vi выдает: CUBLAS Version 0.0 и итоговая матрица остается пустой Прошу указать на мою ошибку и направить на верный путь.
-
IvanLis
- guru
- Сообщения: 5526
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 32 раза
- Поблагодарили: 98 раз
Re: Перемножение матриц (Matrix multiplication) CUDA
Сейчас нет настроенной системы.
Но чисто ментально.... проверьте, что разрядности LV и CUBLAS совпадают.
Наверняка CUBLAS х64, то по идее и LabVIEW должна быть x64.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
alerm
- leader
- Сообщения: 687
- Зарегистрирован: 02 май 2012, 21:28
- Награды: 1
- Версия LabVIEW: 20
- Благодарил (а): 61 раз
- Поблагодарили: 11 раз
- Контактная информация:
Re: Перемножение матриц (Matrix multiplication) CUDA
Иногда если что-то сразу не получается, то дальнейшие потуги в этом направлении не принесут решений, либо просто я выкинул 1 на удачу. То есть с одной стороны у меня не цепляется библиотека от NVIDIA, так как была 32-битная, а теперь я не могу использовать LabVIEW GPU Toolkit на 64-битной ?
-
IvanLis
- guru
- Сообщения: 5526
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 32 раза
- Поблагодарили: 98 раз
Re: Перемножение матриц (Matrix multiplication) CUDA
А видеокарта поддерживается? Посмотрите по списку: https://ru.wikipedia.org/wiki/CUDA, но там версии перестали обновлять. Нужно по документации копать.alerm писал(а): ↑02 сен 2022, 15:31 Иногда если что-то сразу не получается, то дальнейшие потуги в этом направлении не принесут решений, либо просто я выкинул 1 на удачу. То есть с одной стороны у меня не цепляется библиотека от NVIDIA, так как была 32-битная, а теперь я не могу использовать LabVIEW GPU Toolkit на 64-битной ?
Если есть в списке, то можно попробовать откатиться на 32bit и установить более старую версию драйвера (https://developer.nvidia.com/cuda-toolkit-archive), но нужно проверять совместимость с системой.
Там много заморочек, я тогда специально искал поддерживаемый GPU.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
alerm
- leader
- Сообщения: 687
- Зарегистрирован: 02 май 2012, 21:28
- Награды: 1
- Версия LabVIEW: 20
- Благодарил (а): 61 раз
- Поблагодарили: 11 раз
- Контактная информация:
Re: Перемножение матриц (Matrix multiplication) CUDA
Итак:
1) огромнейшее спасибо Ивану
2) уж не знаю почему, но дома не находило 64-битную версию тулкита (на работе на прошлой неделе тоже);
3) кому надо:
https://mega.nz/file/zEEmTBCB#_UObtekiL ... xY06uFGxQM – ni_gpu_analysis_toolkit_32
https://mega.nz/file/7MElzbKQ#ZFItBpm8n ... GPBCN0WnKQ – ni_gpu_analysis_toolkit_64
(они вроде и так почти в свободном доступе, думаю нет проблем, что я ссылки прикрепил);
4) пришлось ставить 64-битную;
5) cuda_11.7.1 с сайта nvidia;
6) 7)
1) огромнейшее спасибо Ивану
2) уж не знаю почему, но дома не находило 64-битную версию тулкита (на работе на прошлой неделе тоже);
3) кому надо:
https://mega.nz/file/zEEmTBCB#_UObtekiL ... xY06uFGxQM – ni_gpu_analysis_toolkit_32
https://mega.nz/file/7MElzbKQ#ZFItBpm8n ... GPBCN0WnKQ – ni_gpu_analysis_toolkit_64
(они вроде и так почти в свободном доступе, думаю нет проблем, что я ссылки прикрепил);
4) пришлось ставить 64-битную;
5) cuda_11.7.1 с сайта nvidia;
6) 7)