У меня есть игрушечный код, позаимствованный у NVidia simpleTensorCoreGEMM.cu . Я поменял их случайное генерирование матриц на функцию, которая считывает матрицы из файлов.
Использование этого игрушечного кода и умножение двух матриц размера [2000 x 10000] * [10000 x 3008]
прекрасно работает. Вывод соответствует ожидаемому.
Когда я пытаюсь сделать намного большее умножение [20000 x 10000] * [10000 x 30000]
, вывод идет ужасно неправильно, и 2/3 строк равны 0.
Я убежден, что это результат того, что я не понимаю строки кода:
// blockDim.x must be a multple of warpSize
// 128x4 means we have 16 warps and a block computes a 64x64 output tile
blockDim.x = 128;
blockDim.y = 4;
gridDim.x = (MATRIX_M + (WMMA_M * blockDim.x / 32 - 1)) / (WMMA_M * blockDim.x / 32);
gridDim.y = (MATRIX_N + WMMA_N * blockDim.y - 1) / (WMMA_N * blockDim.y);
Даже если это не источник моей ошибки, я все равно должен понимать, что он делает. Я понимаю настройку blockDim.*
На основу приходится 32 потока, 128 * 4/32 = 16 основ.
ВОПРОС: Может ли кто-нибудь объяснить мне логику значений и вычислений gridDim.x
и gridDim.y
? Правильное использование тензорных ядер, кажется, очень чувствительно к использованию правильных значений для gridDim.*
.