PyCUDA: C / C ++ включает в себя? - PullRequest
5 голосов
/ 13 апреля 2011

Что-то, что нигде не упоминается (по крайней мере, я вижу), это то, что библиотечные функции доступны встроенным ядрам CUDA.

В частности, я делаю маленькие / глупые умножения матриц, которые не заслуживают отдельной загрузки в GPU, но я разгружаю большую часть алгоритма, который включает это умножение. Никто никогда не любил использовать свои собственные функции linalg, так как кто-то всегда делал это лучше.

TLDR С какими библиотеками я могу играть, находясь во встроенных ядрах под PyCUDA?

1 Ответ

1 голос
/ 13 апреля 2011

Я не знаю ни одного, и я всегда думал, что было бы полезно иметь.

Для размера задач, с которыми я обычно работаю (небольшие матрицы и тензоры, возникающие в методе конечных элементов), я просто написал шаблоны C ++ для выполнения операций. Шаблонирование функций позволяет компилятору узнавать счетчики отключений во время компиляции, а также может развертывать циклы и сохранять результаты или промежуточные результаты в регистре, что, как правило, очень эффективно для пропускной способности ядра. Таким образом, матрично-матричный продукт объявляется как

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;
           }
     }
}

Для таких размеров, которые возникают в моих ядрах (2x2, 3x3, 4x4, 8x8, 9x9), выполнение вышеизложенного и возможность компиляции работают так же хорошо, как любой другой подход, который я пробовал. Поскольку на уровне потоков CUDA эффективно скалярен, нет никаких векторных примитивов или чего-то подобного, что можно использовать для ускорения такого рода небольших операций.

...