Если вы просто добавляете матрицы, это на самом деле не имеет значения.Вы даете ему альфа, 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. Проверьте его и посмотрите.