通过引用 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 中的要求,并且您在问题中发布的内容将不起作用。你真的只有两种可能:
- 在设备上分配一个指针数组并进行内存传输(您不想使用的解决方案)。
- 使用零拷贝或托管主机内存来存储批处理数组
在后一种使用托管内存的情况下,像这样的东西应该可以工作(完全未经测试,使用风险自负):
float ** batch;
cudaMallocManaged((&batch, sizeof(float *));
*batch = dProdATA;
cublasSgetrfBatched(handle, n, batch, lda, P, INFO, mybatch);
目前我只是在尝试基于带有 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 中的要求,并且您在问题中发布的内容将不起作用。你真的只有两种可能:
- 在设备上分配一个指针数组并进行内存传输(您不想使用的解决方案)。
- 使用零拷贝或托管主机内存来存储批处理数组
在后一种使用托管内存的情况下,像这样的东西应该可以工作(完全未经测试,使用风险自负):
float ** batch;
cudaMallocManaged((&batch, sizeof(float *));
*batch = dProdATA;
cublasSgetrfBatched(handle, n, batch, lda, P, INFO, mybatch);