通过引用CUDA指针实现CUDA矩阵反转
CUDA matrix inversion by referencing CUDA-pointer
目前我只是试图实现基于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指针?
没有办法绕过您通过的阵列在设备地址空间中的要求,并且您在问题中发布的内容将不起作用。你真的只有两种可能:
- 在设备上分配指针数组并进行内存传输(您不想使用的解决方案)。
- 使用零复制或托管主机内存来存储批处理数组
对于后一种情况下的托管内存,像这样的东西应该可以工作(完全未经测试,使用自担风险):
float ** batch;
cudaMallocManaged((&batch, sizeof(float *));
*batch = dProdATA;
cublasSgetrfBatched(handle, n, batch, lda, P, INFO, mybatch);
相关文章:
- CUDA:统一内存和指针地址的更改
- 如何在 cuda 中将结构的指针变量从主机复制到设备
- 从CUDA中的指针加载图像并导出dll
- CUDA设备指针丢失
- 我如何将设备内存分配给我在CUDA中的指针
- 功能指针(到其他内核)作为CUDA中的内核Arg
- cuda推力:检查空指针
- CUDA中设备函数指针的分配(来自主机函数指针)
- 结构中的 CUDA 设备功能指针,没有静态指针或符号副本
- 设备类中的设备指针(Cuda C++)
- 指向 CUDA 中共享内存的本地指针
- CUDA 内存管理/类问题中的指针
- 在 CUDA 中使用指针复制类
- CUDA内核,带有函数指针和可变模板
- 可以使用Cuda设备指针来代替cl::Buffer
- CUDA中的函数指针出现故障
- 如何分配指针数组并为cuda中的多个内核调用保留它们
- CUDA在使用函数指针时启动主机函数作为内核
- Cuda推力::device_vector从特定范围获取指针
- 通过引用CUDA指针实现CUDA矩阵反转