通过引用CUDA指针实现CUDA矩阵反转

CUDA matrix inversion by referencing CUDA-pointer

本文关键字:CUDA 指针 引用 实现      更新时间:2023-10-16

目前我只是试图实现基于CUDA的cuBLAS矩阵形式的简单线性回归算法。矩阵的乘法和转置处理cublasSgemm函数效果良好。

问题开始于矩阵逆,基于cublas<t>getrfBatched()cublas<t>getriBatched()函数(见这里)。

可以看到,这些函数的输入参数——指向矩阵的指针数组。想象一下,由于之前的计算,我已经在GPU上为(A^T * A)矩阵分配了内存:

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

是否可以运行分解(反转)

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

没有额外的HOST <-> GPU内存复制(参见矩阵的反向数组的工作示例)和分配数组与单个元素,但只是得到GPU引用到GPU指针?

没有办法绕过您通过的阵列在设备地址空间中的要求,并且您在问题中发布的内容将不起作用。你真的只有两种可能:

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

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

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