Перемножение матриц (Matrix multiplication) CUDA

LabVIEW GPU Analysis Toolkit
Ответить
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Перемножение матриц (Matrix multiplication) CUDA

Сообщение IvanLis »

Задача первая: Перемножение матриц

Необходимо умножить матрицу 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, но все понятно :wink:
CUDA_MatrixMult(xGEMM).png
Здесь:
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.
CUDA MatrixMult.zip
lv2014
(418.75 КБ) 333 скачивания
Аватара пользователя
kapusta1986
assistant
assistant
Сообщения: 103
Зарегистрирован: 14 июн 2014, 13:56
Версия LabVIEW: 2014, 2015
Откуда: Караганда
Контактная информация:

Re: Перемножение матриц (Matrix multiplication) CUDA

Сообщение kapusta1986 »

:super: А где в промышленности можно использовать такое чудо?
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Перемножение матриц (Matrix multiplication) CUDA

Сообщение dadreamer »

IvanLis, наблюдаю с интересом за обоими темами... Накопились кое какие вопросы, но целиком весь список пока озвучивать не буду, ведь вроде бы материал ещё не закончен (?). Пока только один вопрос задам: сравнивали ли быстродействие на обычном ЦП и на CUDA между собой? Какие получаются времена, какой расход памяти, когда уместнее одно, а когда другое... А так, материал весьма полезный. :super:
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Перемножение матриц (Matrix multiplication) CUDA

Сообщение IvanLis »

Все работает, все замечательно, но стоит ли заморачиваться с CUDA, если в LabVIEW перемножение матриц выглядит:
LV_MatrixMult.png
LV_MatrixMult.png (15.82 КБ) 12984 просмотра
значительно проще, чем постом выше :crazy: .

Тестировалось на стареньком ПК с параметрами:
ПК.png
Параметры видео 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
Windows XP, по этому и драйвер старенький и DirectX не последней версии. Да и сама видеокарта лежит в самом низу CUDA GPU (http://www.geforce.com/hardware/compare-buy-gpus).

Результаты тестирования:
Test_MatrixMult.png
Перемножение квадратных матриц
Test-2.png
CUDA начинает выигрывать при количестве элементов более 1.5 мл.
Однако при перемножении прямоугольных матриц результат следующий
Test-3.png
Выигрыш начинается уже при 0.8 мл., возможно это связано с использованием быстрых алгоритмов при перемножении квадратных матриц.

Однако не логично каждый раз инициализировать GPU и cuBLAS, по этому мы их вынесем из функции. В принципе при реальных вычислениях более правильно и переменные инициализировать один раз.
Test_MatrixMult_NotInit.png
Вот результаты тестирования, когда инициализация вынесена за пределы функции:
Для квадратных матриц - пересечение 0.8 мл.
Test-4.png
Для прямоугольных матриц - пересечение 0.5 мл.
Test-5.png
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Перемножение матриц (Matrix multiplication) CUDA

Сообщение IvanLis »

dadreamer писал(а):ведь вроде бы материал ещё не закончен (?). Пока только один вопрос задам: сравнивали ли быстродействие на обычном ЦП и на CUDA между собой? Какие получаются времена, какой расход памяти, когда уместнее одно, а когда другое...
Долго писал пост, по этому вопросы возникли раньше его окончания.
Без сравнения конечно не интересно, иначе для чего все это :wink:

По поводу памяти, сразу не посмотрел, теперь отпишусь только после праздников.
Прогнал только по времени, но исходя из того, что при расчете на GPU задействуются его память и ресурсы, а в это время CPU простаивает, а ОЗУ используется только для хранения массивов, то выигрыш предсказуем.
Но это только предположение, результаты позже.

Если буду располагать временем, то попытаюсь реализовать на функциях более низкого уровня. Сейчас используется xGEMM - LEVEL 3 и выполняется вычисление aAB+bC. Исходя из логики AB должно работать быстрее. Но опять, все предположения, опыта не имею, можно сказать изучаю вместе с Вами :D .

Думаю на такой GPU (http://www.nvidia.ru/object/tesla-server-gpus-ru.html), результаты были бы иные :crazy:
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Перемножение матриц (Matrix multiplication) CUDA

Сообщение dadreamer »

Ну да, скорее всего, загрузку памяти можно не смотреть вовсе. Из того, что я вижу, использовать CUDA имеет смысл только при работе с очень большими объемами данных или при очень трудоемких мат. операциях. Не даром же большинство брутфорсеров и хэш-крякалок используют именно этот механизм. Получается быстрее, нежели на обычном ЦП, так как графических ядер много, а на каждое ядро можно определить один или множество потоков, и запустить всё это хозяйство параллельно.
И это, кстати, не менее интересная задача: как выбрать в :labview: конкретное ядро ГП и определить для него поток. Что-то сходу не удалось найти ответ на такой вопрос. Может, плохо искал. Нашёл только в статье 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 >>>( ... );
Однако времени на эксперименты мало, к сожалению. :cry:

P.S.: весьма полезная статья в плане программирования: http://docs.nvidia.com/cuda/cuda-c-programming-guide/
Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1100
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

Re: Перемножение матриц (Matrix multiplication) CUDA

Сообщение Vitekkz88 »

dadreamer писал(а):CUDA имеет смысл только при работе с очень большими объемами данных...брутфорсеров и хэш-крякалок используют именно этот механизм
Механизм || да! Но там GPU не справляется совсем :cry: Ламеры используют FPGA, а бывалые исключительно ASIC :cool: Была идея у товарища ПЛИСоферму забубенить в университете. Дома дорого электричество жечь. Только тсссс...
GPU с поддержкой CUDA у нас применяли в университете для обработки изображений, например(но делали не в LabVIEW...на Си+SDK соответствующий). Алгоритм хорошо паралелился и работа с матрицей. CUDA GPU - SIMD-технология. Одна инструкция на все ядра заходит за милую душу. Получали выигрыш по сравнению с CPU порядка 30-40% в среднем(отнюдь были некоторые операции и в 10% разницы, а некоторые в 70%). А затем всё равно переносили на FPGA.
CUDA очень востребована при обработке медицинских изображений в real-time. Видеокарта значительно дешевле, чем хорошая ПЛИС. А при необходимости можно поставить 2 видеокарты.
Иван, молодец что начал эту ветку! С удовольствием присоединюсь к обучению.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Перемножение матриц (Matrix multiplication) CUDA

Сообщение IvanLis »

dadreamer писал(а):И это, кстати, не менее интересная задача: как выбрать в :labview: конкретное ядро ГП и определить для него поток. Что-то сходу не удалось найти ответ на такой вопрос. Может, плохо искал.
Это именно обертка на CUDA SDK.
На сколько я понял в :labview: это сделать нельзя. Но если залезть в SDK, то там это можно сделать. Я начал с него смотреть, но знаний не хватает, на быстрый StartUp.
Вообще хотел сделать нечто обертки - wrapper (конечно моя задача немного преувеличена :wink: ), на необходимые мне функции и/или написать небольшие функции, а уже их вызывать в LabVIEW. Т.к. нужно это сделать в Linux, в котором данная приблуда не работает.

Если получится, то обязательно поделюсь результатами.
Обрабатывать планируется именно изображения, что удобно делать используя матричные вычисления.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Перемножение матриц (Matrix multiplication) CUDA

Сообщение dadreamer »

IvanLis, ну вот, хотя бы это сделать:
For advanced users, the toolkit contains documentation on calling your custom GPU code from LabVIEW applications
Написано здесь. Выборочно полистал хэлп на :vi: , но там ничего такого нет.
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Перемножение матриц (Matrix multiplication) CUDA

Сообщение IvanLis »

dadreamer писал(а):Выборочно полистал хэлп на :vi: , но там ничего такого нет.
Нужно копать в :vi: низшего уровня, наверняка на них даже описания документированного нет. Там возможно и будет такая возможность.

У меня на на работе все установлено, можно посмотреть потроха функции инициализации GPU, если есть, то наверняка там.
Аватара пользователя
alerm

Activity
leader
leader
Сообщения: 682
Зарегистрирован: 02 май 2012, 21:28
Награды: 1
Версия LabVIEW: 20
Благодарил (а): 57 раз
Поблагодарили: 9 раз
Контактная информация:

Re: Перемножение матриц (Matrix multiplication) CUDA

Сообщение alerm »

Так, я очень сильно опозорился, как оказалось, я не перемножал матрицы, а вообще не пойми что делал.

Итак 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
из программы CUDA_MatrixMult(xGEMM).vi
из программы CUDA_MatrixMult(xGEMM).vi
2.png (4.79 КБ) 2066 просмотров
и итоговая матрица остается пустой
1.png
Прошу указать на мою ошибку и направить на верный путь.
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Перемножение матриц (Matrix multiplication) CUDA

Сообщение IvanLis »

alerm писал(а): 01 сен 2022, 17:17 Прошу указать на мою ошибку и направить на верный путь.
Сейчас нет настроенной системы.
Но чисто ментально.... проверьте, что разрядности LV и CUBLAS совпадают.
Наверняка CUBLAS х64, то по идее и LabVIEW должна быть x64.
Аватара пользователя
alerm

Activity
leader
leader
Сообщения: 682
Зарегистрирован: 02 май 2012, 21:28
Награды: 1
Версия LabVIEW: 20
Благодарил (а): 57 раз
Поблагодарили: 9 раз
Контактная информация:

Re: Перемножение матриц (Matrix multiplication) CUDA

Сообщение alerm »

IvanLis писал(а): 01 сен 2022, 22:17 то по идее и LabVIEW должна быть x64.
теперь всё так
теперь всё так
логично
логично
2.png (3.94 КБ) 2013 просмотров
другого просто нет
другого просто нет
хотя и пишут, что для всех разрядов
хотя и пишут, что для всех разрядов
Иногда если что-то сразу не получается, то дальнейшие потуги в этом направлении не принесут решений, либо просто я выкинул 1 на удачу. То есть с одной стороны у меня не цепляется библиотека от NVIDIA, так как :labview: была 32-битная, а теперь я не могу использовать LabVIEW GPU Toolkit на 64-битной :labview: ?
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Перемножение матриц (Matrix multiplication) CUDA

Сообщение IvanLis »

alerm писал(а): 02 сен 2022, 15:31 Иногда если что-то сразу не получается, то дальнейшие потуги в этом направлении не принесут решений, либо просто я выкинул 1 на удачу. То есть с одной стороны у меня не цепляется библиотека от NVIDIA, так как :labview: была 32-битная, а теперь я не могу использовать LabVIEW GPU Toolkit на 64-битной :labview: ?
А видеокарта поддерживается? Посмотрите по списку: https://ru.wikipedia.org/wiki/CUDA, но там версии перестали обновлять. Нужно по документации копать.
Если есть в списке, то можно попробовать откатиться на 32bit и установить более старую версию драйвера (https://developer.nvidia.com/cuda-toolkit-archive), но нужно проверять совместимость с системой.
Там много заморочек, я тогда специально искал поддерживаемый GPU.
Аватара пользователя
alerm

Activity
leader
leader
Сообщения: 682
Зарегистрирован: 02 май 2012, 21:28
Награды: 1
Версия LabVIEW: 20
Благодарил (а): 57 раз
Поблагодарили: 9 раз
Контактная информация:

Re: Перемножение матриц (Matrix multiplication) CUDA

Сообщение alerm »

Итак:
1) огромнейшее спасибо Ивану :drink:
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) :labview: пришлось ставить 64-битную;
5) cuda_11.7.1 с сайта nvidia;
6)
arbeiten.png
7)
programm.png
Ответить

Вернуться в «GPU Analysis Toolkit»