Мне было интересно, каков самый быстрый способ вычисления разреженного произведения матрица-вектор y = Ax в CUDA на нескольких (скажем, n) графических процессорах.
Мой наивный подход заключался в том, чтобы разделить вектор x и y на n фрагментов, по 1 фрагменту на каждом графическом процессоре. Затем также разделите матрицу A на меньшие n ^ 2 блоков A_ij и вычислите
y_i = \sum_j A_{i,j} x_j, // GPU j stores A_{i,j} and x_j, result is copied
// to and summed up on GPU i
на разных графических процессорах j = 1..n с, скажем, cuSPARSE. Это сработает? С унифицированной архитектурой памяти, в принципе, все графические процессоры должны иметь доступ к глобальной памяти.
Будет ли передача памяти между графическими процессорами невероятно медленной? Я не ожидаю большого ускорения, но мне было интересно, будет ли оно медленнее, чем умножение матрицы на вектор на одном графическом процессоре.