Параллельное матричное умножение с использованием нескольких графических процессоров
Я установил два графических процессора (2x Nvidia Quadro 410) в мою систему в разных слотах PCI. Чтобы решить умножение Martix на обоих этих графических процессорах, как я могу разделить входные матрицы так, чтобы каждый графический процессор обрабатывал / вычислял часть выходной матрицы и затем возвращал ее обратно. Например, для двух матриц A, B каждого порядка 10x10, а затем для вычисления выходной матрицы C= A x B, так что из 100 элементов (10 x 10) 50 элементов должны быть рассчитаны на 1-м графическом процессоре, а другая половина, т.е. от 50 до б вычисляется во 2-м графическом процессоре. Я пытаюсь реализовать это на OpenCL. Но приветствуется любой алгоритм, который поможет мне найти решение.
1 ответ
В общем, если у вас есть матрицы X
(размером a
Иксb
, строки в первую очередь) и Y (размером b
Иксc
),
X * Y = vcat(X[0:a/2,0:b] * Y, X[a/2:a,0:b] * Y)
В этом псевдокоде vcat
является вертикальной конкатенацией (размещение одной матрицы друг над другом, например, матрица 4x3, сцепленная с матрицей 2x3, создаст матрицу 6x3), :
обозначает диапазоны и []
индексирует.
Оба аргумента vcat
может быть вычислено на разных графических процессорах, и объединение может быть достигнуто просто путем направления вывода на разные подобласти выходного буфера (при условии, что у нас есть C-упорядоченные массивы). Начальное расщепление X
может быть достигнуто аналогичным образом, просто используя разные субрегионы (поскольку они разбиты по ряду).