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