首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCV图形处理器库用于矩阵操作有多好?

OpenCV图形处理器库用于矩阵操作有多好?
EN

Stack Overflow用户
提问于 2012-06-29 12:40:44
回答 2查看 6.4K关注 0票数 7

我正在使用OpenCV作为计算机视觉的应用程序。我想加速GPU上的一些矩阵运算(矩阵是相当大的),如果可能的话,我希望避免直接在CUDA C中编码。OpenCV 2.4.1具有许多GPU加速功能。他们在你的经验中表现如何?我最好还是用另一个库(例如推力)来代替?

编辑示例应用程序:GPU上平方欧氏距离矩阵的计算。目前,我的GPU加速(和矢量化)实现在Matlab中使用并行计算工具箱(PCT)大约比我的C++实现的OpenCV快5-10倍。

Matlab实现:

代码语言:javascript
运行
复制
function K = sqEuclideanDist(P_cpu,Q_cpu)
% Vectorized method to compute pairwise squared Euclidean distance on GPU
% Returns K(i,j) = (P(i,:) - Q(j,:))'*(P(i,:) - Q(j,:))

P_gpu = gpuArray(P_cpu);
Q_gpu = gpuArray(Q_cpu);

[nP, d] = size(P_gpu);
[nQ, d] = size(Q_gpu);

pmag = sum(P_gpu .* P_gpu, 2);
qmag = sum(Q_gpu .* Q_gpu, 2);

% note that K is on GPU
K = ones(nP,1)*qmag' + pmag*ones(1,nQ) - 2*P_gpu*Q_gpu';

end

UPDATE这里是另一个Matlab实现,它实现了同样的功能(多亏了https://stackoverflow.com/a/7774323/1121420)。但是它只在CPU上运行,因为PCT不支持bsxfun。不过,仍在寻找C++的替代方案。

代码语言:javascript
运行
复制
function K = sqEuclideanDist(P_cpu,Q_cpu)
% Returns K(i,j) = (P(i,:) - Q(j,:))'*(P(i,:) - Q(j,:))
% Runs on CPU only.

K = bsxfun(@plus,sum(p.^2,2),sum(q.^2,2)') - 2*(p*q');

end
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-29 13:57:07

我发现ArrayFire要快得多,并且已经开始使用它代替OpenCV中的GPU内核来进行图像处理。下面是我发现的一些基准,我发现将ArrayFire (以前在一个不同的接口称为LibJacket)与OpenCV进行比较,在我的基准测试中也确实发现,ArrayFire比OpenCV中的GPU函数快2-4倍。据我所知,NVIDIA并没有用OpenCV编写GPU内核,而是将这些内核外包给了某个人,这可能就是它们如此缓慢的原因。因为我只使用一个GPU,所以我可以免费使用ArrayFire。

更新,考虑到@Alex:发布的新MATLAB代码,我在我的系统上运行了该代码的基准测试。我了解到并行计算工具箱gpuArray比CPU慢,但是Jacket和ArrayFire的速度很慢。卫生保健标准是:

代码语言:javascript
运行
复制
Intel(R) Xeon(R) CPU X5660  @ 2.80GHz
NVIDIA Tesla M2090

使用并行计算工具箱gpuArray (完全热身)的CPU和GPU的结果。CPU比PCT gpuArray快。

代码语言:javascript
运行
复制
>> tic; sqEuclideanDist(gpuArray(rand(1581,3)),gpuArray(rand(189,3))); toc;
Elapsed time is 0.006859 seconds.
>> tic; sqEuclideanDist(rand(1581,3),rand(189,3)); toc;
Elapsed time is 0.005712 seconds.

CPU与GPU的结果使用夹克(完全热身)。夹克比PCT gpuArray高3.7倍,比CPU高3X

代码语言:javascript
运行
复制
>> tic; sqEuclideanDist(gdouble(rand(1581,3)),gdouble(rand(189,3))); toc;
Elapsed time is 0.001876 seconds.

下面是修改过的代码,让我们轻松地运行这些代码:

代码语言:javascript
运行
复制
function K = sqEuclideanDist(P,Q)
% Vectorized method to compute pairwise squared Euclidean distance on GPU
% Returns K(i,j) = (P(i,:) - Q(j,:))'*(P(i,:) - Q(j,:))

[nP, d] = size(P);
[nQ, d] = size(Q);

pmag = sum(P .* P, 2);
qmag = sum(Q .* Q, 2);

K = ones(nP,1)*qmag' + pmag*ones(1,nQ) - 2*P*Q';

end

在GPU上,夹克衫确实支持BSXFUN,它确实在一定程度上提高了速度:

代码语言:javascript
运行
复制
>> tic; sqEuclideanDist(gdouble(rand(1581,3)),gdouble(rand(189,3))); toc;
Elapsed time is 0.001420 seconds.

请注意,这里使用的大小非常小,所以大多数试图在这些小尺寸上运行的CUDA代码的性能可能很差。这就是为什么我喜欢使用AccelerEyes的东西,因为那些家伙优化了GPU,不像PCT,推力,OpenCV,每一个我在过去都尝试过。

以下是ArrayFire免费C++结果:

代码语言:javascript
运行
复制
Time:  0.0003577 seconds
Speedups:  19.2X faster than PCT gpuArray, 16X faster than the CPU, 5.2X faster
than Jacket in MATLAB original version, 4X faster than Jacket in MATLAB using
BSXFUN

下面是我为此编写的ArrayFire代码:

代码语言:javascript
运行
复制
static array SqEuclideanDist(array P, array Q)
{
    // 0 based indexing
    array pmag = sum(P * P, 1);
    array qmag = sum(Q * Q, 1);

    int np = P.dims(0);
    int nq = Q.dims(0);

    array K = tile(qmag.T(), np, 1) + tile(pmag, 1, nq) - 2 * matmul(P, Q.T());
    return K;
}

int main(int argc, char **argv)
{
    double *P_cpu = new double[1581 * 3];
    double *Q_cpu = new double[189 * 3];

    array P = array(1581, 3, P_cpu);
    array Q = array(189 , 3, Q_cpu);
    af::sync();

    int iter = 1000;

    timer::tic();
    for (int i = 0; i < iter; i++) {
        array K = SqEuclideanDist(P, Q);
        af::eval(K);
    }

    af::sync();
    printf("Time taken: %2.4lfms\n", (1000 * timer::toc()) / iter);

    delete[] P_cpu;
    delete[] Q_cpu;
}
票数 5
EN

Stack Overflow用户

发布于 2012-06-29 12:51:34

它们是由NVidia贡献的,所以在CUDA兼容卡上也有很好的性能。真正的性能取决于卡本身和您正在使用的功能。

在我的经验中,只有cvRotate和cvResize比普通的Intel具有更好的性能。(注:我只对与图像有关的功能感兴趣)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11261969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档