问题描述
|
库功能公开给内联CUDA内核的地方(至少我可以看到)并没有真正提到。
具体来说,我正在做小的/愚蠢的矩阵乘法,不应该单独卸载到GPU,但要卸载算法的较大部分,其中包括该乘法。没有人喜欢使用自己的linalg函数,因为有人总是做得更好。
TLDR在PyCUDA下的嵌入式内核中可以使用哪些库?
解决方法
我什么都不知道,我一直认为拥有它会很有用。
对于我通常处理的问题的大小(有限元方法中出现的小矩阵和张量),我只是编写了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,l)] = dotprod;
}
}
}
对于出现在我的内核中的各种大小(2x2、3x3、4x4、8x8、9x9),执行上述操作并让编译工作完成似乎和我尝试过的任何其他方法一样好。因为在线程级别CUDA实际上是标量,所以没有像矢量这样的矢量原语或东西可以用来加速这类小型操作。