gpt4 book ai didi

c++ - OpenCV GpuMat 点积

转载 作者:行者123 更新时间:2023-11-28 04:56:27 25 4
gpt4 key购买 nike

我目前正在 Nvidia Jetson TX1/2 上进行开发。

我的代码中最慢的部分是(为便于阅读更改了变量名):

....
cv::Mat A, B;
GpuMat_A.download(A, Cuda_stream);
GpuMat_B.download(B, Cuda_stream);
double C = A.dot(B);

B = B.inv() * C;
GpuMat_B.upload(B, Cuda_stream);
....

我以前从未使用过 GpuMat,似乎点积和 inv() 函数不存在迫使我从 & 到 Gpu 再到 RAM 下载() 和上传()。

这些下载和上传需要 3 毫秒 ~ 但这是在迭代循环中重复的,然后在 55 毫秒的过程中花费了我 45 毫秒。

1) 我错过了文档中的内容吗? (invert & dot 是计算机视觉中的标准操作,所以我认为它们应该存在)。

2) 如果不是,那么在 Gpu 端执行这两项操作的最有效方法(如果可能)是什么?

更新:1) GpuMat 似乎没有“原生”点积。

所以这就是我想要做的:(现在只需获取 A 的第一行和 B 的第一列,然后进行 vector 点积)

void GpuMat_Dot(GpuMat& A, GpuMat& B, double& dot)
{
CV_ASSERT(A.type() == B.type() && A.rows == B.cols && A.cols == B.rows);
const double* Ptr_first_row = A.ptr(0); //const _Tp GpuMat::Ptr()
const double* Ptr_first_col = &B.ptr(0)[0]; //I couldn't find a equivalent of Ptr() that return the col address directly also this might be wrong
dot = cublasDdot((int)A.cols, Ptr_first_row, A.elemsize()/*1 ?*/, Ptr_first_col, B.elemsize()/*1 */);
}

它确实可以编译(可能存在因电话拼写错误而编辑),但结果不是它应该是的...

最佳答案

通过捕获 GPU 垫内的原始指针,通过 CUBLAS 尝试矩阵求逆,与点积相同。

请注意,反转大型矩阵远非直截了当,通常是一个迭代过程。

使用 GPU 的一种更典型的方法是通过“统一的”UMat 接口(interface)。

关于c++ - OpenCV GpuMat 点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47029305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com