Параллельное матричное умножение с использованием нескольких графических процессоров

Я установил два графических процессора (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 может быть достигнуто аналогичным образом, просто используя разные субрегионы (поскольку они разбиты по ряду).

Другие вопросы по тегам