2015-08-21 31 views
1

目前我只是试图在基于curabas和CUDA的矩阵形式中实现简单的线性回归算法。矩阵乘法和换位与cublasSgemm函数一起工作良好。通过引用CUDA指针进行CUDA矩阵反转

问题从矩阵求逆开始,基于cublas<t>getrfBatched()cublas<t>getriBatched()函数(请参见here)。

可以看出,这些函数的输入参数 - 指向矩阵的指针数组。想象一下,我已经在GPU上分配的内存(A^T * A)矩阵先前计算的结果:

float* dProdATA; 
cudaStat = cudaMalloc((void **)&dProdATA, n*n*sizeof(*dProdATA)); 

是否有可能运行分解(反转)

cublasSgetrfBatched(handle, n, &dProdATA, lda, P, INFO, mybatch); 

无需额外的HOST <→GPU存储器复制(请参阅working example of inverting array of matrices)并分配单个元素的阵列,但仅获得GPU参考GPU指针?

回答

1

没有办法解决您传递的数组在设备地址空间中的问题,以及您在问题中发布的内容不起作用。您真的只有两种可能性:

  1. 在设备上分配指针数组并执行内存传输(您不想使用的解决方案)。
  2. 使用零拷贝或托管主机内存来存储批阵列

与管理内存后一种情况下,这样的事情应该工作(没有经过充分测试,在风险自负):

float ** batch; 
cudaMallocManaged((&batch, sizeof(float *)); 
*batch = dProdATA; 
cublasSgetrfBatched(handle, n, batch, lda, P, INFO, mybatch); 
+0

谢谢!但恐怕使用托管内存可能是计算速度下降的原因。 –