PyCUDA: C/C++ 头文件吗?
有一点在网上并没有被提到(至少我没看到),就是在内联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实际上是标量的,没有可以用来加速这些小操作的向量原语或其他东西。