Может ли ядро CUDA вызвать функцию cublas?
Я знаю, это звучит странно, но вот мой сценарий:
Мне нужно сделать матрично-матричное умножение (A (n * k) * B (k * n)), но мне нужны только диагональные элементы для вычисления выходной матрицы. Я искал библиотеку cublas и не нашел никаких функций уровня 2 или 3, которые могут это сделать.
Итак, я решил распределить каждую строку A и каждый столбец B в потоки CUDA. Для каждого потока (idx) мне нужно вычислить точечный продукт "A [idx,:] * B [:, idx]" и сохранить его как соответствующий диагональный вывод. Теперь, поскольку этот точечный продукт также занимает некоторое время, и я задаюсь вопросом, могу ли я как-то назвать функцию cublas здесь (например, cublasSdot), чтобы достичь этого.
Если я пропустил какую-то функцию cublas, которая может непосредственно достичь моей цели (только вычислить диагональные элементы для матрично-матричного умножения), этот вопрос можно отбросить.
Ответы
Ответ 1
Да, может.
"Интерфейс языка и API-интерфейс Runtime для приложений, доступных в CUDA C/С++, являются подмножеством API-интерфейса CUDA Runtime, доступного на узле. Синтаксис и семантика API-интерфейса CUDA Runtime были сохранены на устройстве, чтобы облегчить повторного использования кода для API-подпрограмм, которые могут выполняться как в среде хоста, так и в устройстве. Ядро также может напрямую обращаться к библиотекам GPU, таким как CUBLAS, без необходимости возврата к CPU." Источник
Здесь вы можете видеть и умножение матрицы-вектора с использованием cuda и функции библиотеки CUBLAS cublasSgemv.
Ответ 2
Убедитесь, что вы используете библиотеку устройств для вызова cublas. Вы не можете использовать ту же библиотеку, которую вы использовали для вызова ее с хоста; подробности об использовании библиотеки устройств cuda можно найти на инструментах cuda: http://docs.nvidia.com/cuda/cublas/index.html#device-api
Посмотрите на образцы cuda 5 под 7_CUDALibraries/.