Это не очень понятный вопрос, поэтому этот ответ является неким предположением, основанным на том, что вы ранее задавали в нескольких довольно похожих вопросах ранее.
Хорошая отправная точка для понимания того, как выполнять операции такого рода, - вернуться к началу и подумать о проблеме умножения матрицы на матрицу из первых принципов. Вас интересует код для вычисления точечного произведения двух матриц, C = AB . У вас есть ограничение: ядро, которое вы используете, может вычислять только произведения матриц, которые кратны некоторому внутреннему размеру блока. Так что вы можете сделать?
Один из способов взглянуть на проблему - представить, что матрицы A и B были блочными матрицами . Матрицу умножения можно записать так:
и полученная матрица C могут быть затем образованы комбинациями произведений восьми подматриц в A и B :
Может быть не сразу очевидно, как это помогает решить проблему, но давайте рассмотрим конкретный пример:
- У вас есть оптимальное ядро умножения матриц, которое использует внутренний размер блока 32 и является правильным, только если матрицы представляют собой круглые кратные этому размеру блока.
- У вас есть пара матриц 1000x1000 для умножения.
Из этих первых фактов следует, что ваше ядро может корректно решать только продукт 1024x1024 или продукт 992x992, но не необходимую операцию 1000x1000.
Если вы решите использовать продукт 1024x1024, вы можете использовать идею декомпозиции блока, чтобы сформулировать проблему следующим образом:
, где O nn обозначает матрицу подходящих размеров нулей. Теперь у вас есть пара 1024x1024
матриц, и их произведение приведет к
т. верхний блок слева представляет собой матрицу 1000x1000, содержащую AB . Это фактически заполнение нулями для достижения правильного результата. В этом примере это означает, что выполняется примерно на 7% больше вычислений, чем требуется. Чем это важно или нет, вероятно, зависит от приложения.
Второй подход состоит в том, чтобы использовать базовое ядро для вычисления продукта 992x992, а затем выработать стратегию для работы с другими семью продуктами в разложенной на блоки версии расчета, что-то вроде этого:
с A 11 и B 11 , являющимися матрицами 992x992, и O nn - нулевые матрицы, как и раньше. При первом осмотре это не выглядит очень полезным, но стоит помнить, что все вычисления, чтобы сделать правую матрицу, содержат только около 1,2% всех вычислений, необходимых для вычисления продукта матрицы. Их можно легко сделать на центральном процессоре, пока графический процессор выполняет основные вычисления, а затем добавить к результату графического процессора для формирования окончательной матрицы. Поскольку CUDA API является асинхронным, большая часть вычислений хоста может быть полностью скрыта и фактически бесплатна.
Этот ответ содержит две стратегии для выполнения того, о чем вы просите без изменения более чем одной строки вашего текущего кода ядра . Очевидно, существует третий способ, который заключается в более радикальной модификации самого ядра, но это то, что вы должны сначала попробовать сами, а затем обратиться за помощью, если ваше решение не работает.