Эффективное решение n линейных систем - PullRequest
0 голосов
/ 24 марта 2019

У меня есть n (очень большие) независимые линейные системы (Ax = b_i). Все они имеют одинаковый A, но b_i отличается для (i = 1, ..., n). Я хочу решить эти n систем параллельно в CUDA.

Я думал, что было бы наиболее эффективно выполнить факторизацию LU для A на хосте, а затем скопировать новый A в постоянную память графического процессора (потому что даже если я делаю LU в устройстве, должен выполнять только один поток) он и другие потоки будут простаивать. Кроме того, постоянная память быстрее). Есть ли лучший способ для этого?

Другая проблема состоит в том, что, хотя все потоки решают свою систему в одно и то же время по одному и тому же алгоритму, они все обращаются к одному и тому же месту памяти (A [i]) в одно и то же время, которое не объединено. Как я могу оптимизировать это?

Спасибо

1 Ответ

0 голосов
/ 24 марта 2019

(Предполагается, что A является стабильно -обратимой nxn-матрицей.)

Не решайте намного более сложную задачу только потому, что она лучше распараллеливается

Пусть B будет матрица, столбцы которой b_1 ... b_n.В соответствии с нашими предположениями об A, вам на самом деле нужно решить уравнение AX = B для матрицы переменных nxn, т.е. ваше решение - A ^ {- 1} B.

Таким образом, в основном у вас есть одна инверсия матрицы и однаумножение матриц.Это верно независимо от того, какое программное и аппаратное обеспечение вы собираетесь использовать.Для инверсии и умножения просто используйте CUBLAS, или cuSparse, или cuSOLVER, или ArrayFire, или что-то еще, что решает эти проблемы быстрее всего.

Полагаю, вы могли бы сделать их вместе, но я не уверен, чтоесть оптимизация для этого).

...