【发布时间】:2015-04-22 20:12:08
【问题描述】:
有没有办法将之前分配的 CUDA 设备数据直接复制到 OpenCV GPU Mat 中?我想将之前由 CUDA 初始化和填充的数据复制到 OpenCV GPU 垫中。我想这样做是因为我想通过使用 OpenCV 计算矩阵 A 的逆来求解线性方程组 Ax = B。
我想做的是这样的:
float *dPtr;
gpuErrchk( cudaMalloc( (void**) &dPtr, sizeof(float) * height * width));
gpuErrchk( cudaMemset(dPtr, 0, sizeof(float) * height * width));
// modify dPtr in some way on the GPU
modify_dPtr();
// copy previously allocated and modified dPtr into OpenCV GPU mat?
// process GPU mat later - e.x. do a matrix inversion operation.
// extract raw pointer from GPU mat
编辑:
OpenCV documentation 提供了一个 GPU upload 函数。
可以将设备指针作为参数传递给该函数吗?如果没有,是否没有其他方法可以进行此类数据传输?我不想在主机和设备内存之间来回复制数据,在普通的 OpenCV Mat 容器上进行计算,然后将结果复制回来;我的应用程序是实时的。我假设由于GPU Mat 没有.at() 函数,就像在普通的OpenCV Mat 中一样,没有办法访问矩阵中特定位置的元素?此外,GPU Mat 是否存在显式矩阵求逆运算?该文档不提供 GPU Mat inv() 函数。
【问题讨论】:
-
@Downvoter:为什么要投反对票?我在提出问题方面进行了研究,我的问题是一个有效的问题,因为我的 CUDA 算法在 GPU 上运行。我想将 OpenCV 的 GPU 模块与我的代码连接;这样,我就不必浪费时间在设备和主机内存之间来回复制。没有明确的接口可以将先前分配的 CUDA 设备内存复制到 OpenCV GPU Mat 容器,这与使用 CUDA 的 OpenCV Mat 容器的一般易用性形成对比。我发布这个问题是因为其他知识渊博的人可能知道我的问题的答案。
-
无论 OpenCV 能不能做到(我猜不能),通过显式计算逆来求解一组线性方程几乎总是错误的做法。
-
stackoverflow.com/questions/25512354/… 我认为这与 openCV->CUDA 正好相反,但它可能是一个开始的地方。
-
@talonmies 我同意,但他没有要求一个好的线性求解器方法。只是如何实现一个低效的。
-
不,我的意思是用你的指针实例化一个 GpuMat。查看标题定义,我相信你会找到一个构造函数