相当于Matlab在CUDA中的find命令

时间:2012-08-25 00:54:28

标签: matlab cuda find jacket

我想尽快找到矩阵的非零元素。考虑到CUDA \ Jacket,我了解到这比Matlab找到的“常规”CPU版本要慢得多,可能是由于内存分配问题,因为在find函数之前,输出的大小是未知的。但是,使用bwlabelregionpropsJacket中都支持)可以有效地生成有关非零元素的信息,并且比Matlab内置的图像处理快得多工具箱功能。有没有办法利用这个来获得非零元素?是否有办法对使用bwlabel

找到的每个标记对象进行处理

2 个答案:

答案 0 :(得分:2)

根据我的经验,Jacket支持的FIND实现非常快,至少对于大于300x300左右的矩阵而言。我在笔记本电脑上对此进行了测试,并在下面分享结果。我的硬件规格是:

>> ginfo
Jacket v2.2 (build 77be88c) by AccelerEyes (64-bit Windows)
License: Standalone (C:\Program Files\AccelerEyes\Jacket\2.2\engine\jlicense.dat)
Addons: MGL16, JMC, SDK, DLA, SLA
CUDA toolkit 4.2, driver 4.2 (296.10)
GPU1 GeForce GT 540M, 2048 MB, Compute 2.1 (single,double)
Display Device: GPU1 GeForce GT 540M
Memory Usage: 1697 MB free (2048 MB total)

CPU是Intel Core i7-2630QM。

我认为Jacket在CPU上的FIND功能上达到了~3倍的加速。这是我使用的基准代码:

% time Jacket vs CPU
for n = 5:12;
    x(n) = 2^n;
    Ac = single(rand(x(n)));
    Ag = gsingle(Ac);
    t_cpu(n) = timeit(@() find(Ac > 0.5));
    t_gpu(n) = timeit(@() find(Ag > 0.5));
end

% plot results
plot(x, t_cpu ./ t_gpu);
xlabel('Matrix Edge Size', 'FontSize', 14);
ylabel('Jacket (GPU) Speedup over CPU', 'FontSize', 14);

以下是运行此代码的结果:

Jacket (GPU) Speedup over CPU

我确信Jacket支持的BWLABEL和REGIONPROPS函数也非常快,但鉴于上述基准测试,您可能可以使用FIND本身。

答案 1 :(得分:1)

除了arrayfire讨论的以外,另一种可能性是使用CUDA Thrust。下面,我发布一个简单的示例,其中根据(x, y)阈值选择2D域上的粒子。我很容易适应发布者感兴趣的情况,或更笼统地模拟Matlab的{​​{1}}的行为。

代码

find