PyCUDA: C/C++ 头文件吗?

5 投票
1 回答
711 浏览
提问于 2025-04-16 15:36

有一点在网上并没有被提到(至少我没看到),就是在内联CUDA内核中可以使用哪些库函数。

具体来说,我正在做一些小的、简单的矩阵乘法,这些操作其实不值得单独放到GPU上去处理,但我正在把一个更大的算法部分放到GPU上,其中包括了这些乘法。大家通常不喜欢自己写线性代数的函数,因为总有人写得更好。

总之,我想知道在PyCUDA的内联内核中,我可以使用哪些库?

1 个回答

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

对于我在内核中遇到的那些尺寸(2x2、3x3、4x4、8x8、9x9),这样做并让编译器处理这些事情,效果似乎和我尝试过的其他方法一样好。因为在线程级别,CUDA实际上是标量的,没有可以用来加速这些小操作的向量原语或其他东西。

撰写回答