CUBLAS - матричное сложение .. как? - PullRequest
3 голосов
/ 26 марта 2011

Я пытаюсь использовать CUBLAS для суммирования двух больших матриц неизвестного размера. Мне нужен полностью оптимизированный код (если это возможно), поэтому я решил не переписывать код добавления матрицы (простой), а использовать CUBLAS, в частности функцию cublasSgemm, которая позволяет суммировать A и C (если B - единичная матрица): * C = альфа * оп (A) * оп (B) + бета * с *

Проблема в том, что C и C ++ хранят матрицы в основном формате строки, cublasSgemm предназначен (для совместимости с фортраном) для работы в основном формате столбца. Вы можете указать, должны ли A и B быть транспонированы первыми, но вы НЕ можете указать, чтобы транспонировать C. Таким образом, я не могу завершить добавление моей матрицы ..

Я не могу самостоятельно транспонировать матрицу C, потому что она имеет максимальный размер 20000x20000.

Есть идеи, как решить, пожалуйста?

Ответы [ 2 ]

6 голосов
/ 26 сентября 2012

cublasgeam был добавлен в CUBLAS5.0. Он вычисляет взвешенную сумму 2 необязательно транспонированных матриц

5 голосов
/ 30 марта 2011

Если вы просто добавляете матрицы, это на самом деле не имеет значения.Вы даете ему альфа, Aij, бета и Cij.Он думает, что вы даете ему альфа, аджи, бета и Cji, и дает вам то, что он считает Cji = бета Cji + альфа Aji.Но это правильный Cij, насколько вы обеспокоены.Меня беспокоит, когда вы начинаете заниматься вещами, которые имеют значение, такими как матричные продукты.Там, скорее всего, не обойтись.

Но, более того, вы не хотите использовать GEMM для сложения матриц - вы делаете абсолютно бессмысленное умножение матриц (которое занимает ~20 000 3 операций и много проходов через память) для операции, для которой требуется только ~ 20 000 2 операций и один проход!Относитесь к матрицам как к 20000 ^ 2-длинным векторам и используйте saxpy.

Умножение матриц требует большой пропускной способности памяти, поэтому существует огромная (в 10 или 100 раз) разница в производительности между написанием кода самостоятельно и настроенной версией.В идеале вы должны изменить структуры в своем коде, чтобы они соответствовали библиотеке.Если вы не можете, в этом случае вы можете управлять просто используя линейные алгебраические тождества.Порядок C-vs-Fortran означает, что когда вы переходите в A, CUBLAS «видит» A T (транспонирование).Что хорошо, мы можем обойти это.Если то, что вы хотите, это C = AB, переходите в матрицы в обратном порядке, BA.Затем библиотека видит (B T . A T ) и вычисляет C T = (AB) T ;и затем, когда он проходит обратно C T , вы получаете (в вашем заказе) C. Проверьте его и посмотрите.

...