PyCUDA:C/C++包括?

Bol*_*ter 5 python cuda gpgpu inline-code pycuda

在任何地方都没有提到的东西(至少我可以看到)是库函数暴露给内联CUDA内核的东西.

具体来说,我正在进行小/愚蠢的矩阵乘法,这些乘法不值得单独卸载到GPU,而是卸载包含此乘法的算法的更大部分.没有人喜欢使用他们自己的linalg功能,因为有人总是做得更好.

TLDR在PyCUDA下的内联内核中我可以使用哪些库?

tal*_*ies 1

我什么都不知道,但我一直认为拥有它会很有用。

对于我通常处理的问题的大小(有限元方法中出现的小矩阵和张量),我只是编写 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;
           }
     }
}
Run Code Online (Sandbox Code Playgroud)

对于我的内核中出现的那种大小(2x2、3x3、4x4、8x8、9x9),执行上述操作并让编译解决问题似乎与我尝试过的任何其他方法一样好。因为在线程级别 CUDA 实际上是标量,所以没有任何矢量基元或类似的东西可用于加速此类小型操作。