通过引用 CUDA 指针进行 CUDA 矩阵求逆

CUDA matrix inversion by referencing CUDA-pointer

目前我只是在尝试基于带有 CUDA 的 cuBLAS 以矩阵形式实现简单的线性回归算法。矩阵乘法和转置适用于 cublasSgemm 函数。

问题从矩阵求逆开始,基于 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 引用?

无法绕过要求您传递的数组位于设备地址 space 中的要求,并且您在问题中发布的内容将不起作用。你真的只有两种可能:

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

在后一种使用托管内存的情况下,像这样的东西应该可以工作(完全未经测试,使用风险自负):

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