#python #cuda #gpgpu #inline-code #pycuda
#python #cuda #gpgpu #встроенный код #pycuda
Вопрос:
Что-то, что на самом деле нигде не упоминается (по крайней мере, я вижу), это то, какие библиотечные функции доступны встроенным ядрам CUDA.
В частности, я выполняю небольшие / глупые матричные умножения, которые не заслуживают индивидуальной загрузки на графический процессор, но я выгружаю большую часть алгоритма, которая включает это умножение. Никому никогда не нравилось использовать свои собственные функции linalg, поскольку кто-то всегда делал это лучше.
TLDR С какими библиотеками я могу играть во встроенных ядрах под PyCUDA?
Ответ №1:
Я не знаю ни одного, и я всегда думал, что было бы полезно иметь.
Для решения проблем, с которыми я обычно работаю (небольшие матрицы и тензоры, возникающие в методе конечных элементов), я просто написал шаблоны C для выполнения операций. Создание шаблонов функций позволяет компилятору знать количество отключений во время компиляции, и он может разворачивать циклы и сохранять результаты или промежуточные результаты в регистре, что, как правило, очень эффективно для пропускной способности ядра. Итак, продукт matrix-matrix объявляется как
template < typename Real, unsigned int l, unsigned int m, unsigned int n >
__device__ __host__
void matmul(const Real *a,
const Real *b,
Real *c)
{
for(int i=0; i<l; i ) {
for(int j=0; j<n; j ) {
Real dotprod = Real(0);
for(int k=0; k<m; k ) {
dotprod = a[idx2c(i,k,l)] * b[idx2c(k,j,m)];
}
c[idx2c(i,j,l)] = dotprod;
}
}
}
Для тех размеров, которые возникают в моих ядрах (2×2, 3×3, 4×4, 8×8, 9×9), выполнение вышеуказанного и разрешение компиляции работать, похоже, так же хорошо, как и любой другой подход, который я пробовал. Поскольку на уровне потока CUDA эффективно скалярна, не существует никаких векторных примитивов или чего-то подобного, что можно использовать для ускорения такого рода небольших операций.
Комментарии:
1. У вас случайно нет такого удобного фрагмента для решений Ax = B, не так ли? 😛 Спасибо за всю вашу помощь.
2. @Andrew Bolster: Я полагаю, вы действительно имеете в виду Ax = b, и это связано с вашим другим вопросом? Возможно, мы могли бы перенести это туда…