Уже несколько лет прошло, как выкладывал здесь свои примеры использования
OpenCL в Delphi:
https://delphisources.ru/forum/showthread.php?t=28188
https://delphisources.ru/forum/showthread.php?t=29311
Сейчас наконец-то появились драйверы и для карт
Nvidia, где взамен устаревшей версии OpenCL 1.2 идёт последняя версия
OpenCL 3.0. Кое-что из неё используется в новой Demo-программе, которая может распараллеливать расчёты на несколько GPU (хотя она идёт и на старой версии OpenCL 1.2). Например, используются при возможности
неоднородные рабочие группы.
===
Исходники для Delphi 10.2 (Tokyo) - здесь:
OpenCL_MultiGPU_2021 Tokyo 10.2.2
http://gofile.me/2Zesj/ZO2YWyyuy - можно скачать только это;
http://gofile.me/2Zesj/qZDKNrpU8 - вся папка с разными Demo-OpenCL.
===
Напомню (а лучше почитать старые описания по 2-м ссылкам выше):
===
1) Рядом с исполняемым файлом
Project_OpenCL_Demo2021_MultiGPU.exe должен лежать текстовый файл
ProgramPress.cpp
===
2) Расчёты выполняются с квадратной "матрицей" (их там всего 17 штук!), размер стороны которой
MatrixSize задаётся на основной форме. По умолчанию это 2500. Кол-во расчётных слоёв по 3-ей координате - это
Layers, по умолчанию это 8. При запуске выдаётся общий размер памяти, который требуется от всех
GPU. Если памяти железа не хватит - вылетим, и надо уменьшить кол-во слоёв либо размер матрицы.
===
Версия драйвера для
Nvidia, с которой тестировал:
472.12-desktop-win10-win11-64bit-international-whql
===
3) Тестировал с одной видеокартой
AMD и с парой
Nvidia 1080ti. Если у вас есть больше видеокарт в системе, либо пара
AMD - интересно будет обсудить результат.
===
4) Когда в системе несколько видеокарт, и вы задали работу "со всеми", вся расчётная область режется на куски по индексу
i, после каждой итерации - сшивание
GPU0 --> Host --> GPU1 (это быстро!) и наоборот - по границам нарезки с помощью "небольших" обновляемых при расчётах массивов
Connector. Сшивание можно отрубить, убрав галку на основной форме.
===
5) По окончании расчёта выдаётся форма, где видна погрешность расчёта
Pogr = (д.б. порядка 1E-7): она определяется по сравнению результатов расчёта на
CPU и на
GPUs.
===
6) Изначально исходные данные заполняются рандомно. При след. запуске результат м.б. иной. Главное, чтобы погрешность
Pogr была малой. Например, при отключении
Connector она сразу станет большой: но это когда несколько видеокарт.
===
7) Можете сравнить время расчётов на 1
GPU и на 2,3... Для 2-х своих
Nvidia 1080 ti (см. вложенный рисунок) я задавал
MatrixSize = 5400 и
Layers = 8 (что требует порядка
17Gb памяти на оба
GPU).