在matlab中使用cuda\jacket时,我遇到了一个非常慢的if语句响应。(使用简单的for循环和if条件,查找本地最大值的代码分别为5秒和0.02秒)
作为图形处理器编程的新手,我去阅读,当我看到之前的matlab if statements with CUDA SO讨论时,我觉得缺少了一些东西。你不需要使用cuda就能知道向量化你的代码更好。但是,在某些情况下,无论如何都需要使用if语句。例如,我想找出2D图像的一个像素(比如m(a,b))是否是它的8个最近邻域中的局部最大值。在matlab中,一种简单的方法是对if语句使用8个逻辑条件:
如果m(a,b)>m(a-1,b-1) & m(a,b)>(a,b-1) & m(a,b)>(a+1,b-1) &…在所有最近的邻居上等等
如果你有一个解决(或矢量化)这个问题的想法,我将不胜感激。
发布于 2012-08-08 04:03:19
使用多个"if“语句(或任何其他条件语句)的问题是,对于每个语句,结果会从gpu复制到主机,这可能是代价高昂的。
最简单的方法是按以下方式进行矢量化。
window = m(a-1:a+1, b-1:b+1);
if all(window(:) <= m(a,b))
% do something
end如果您可以显示if / else条件正在做什么,则可以进一步优化这一点。也就是说,请发布if/else代码,看看是否有其他优化可用(即,查看可能的方法来完全删除if条件)。
编辑
有了新的信息,以下是可以做的事情。
for j = 1:length(y)
a = x(j);
b = y(j);
window = d(a-1:a+1, b-1:b+1);
condition = all(window(:) <= d(a,b));
M(a, b) = condition + ~condition * M(a,b);
end你可以使用gfor循环来让它更快。
gfor j = 1:length(y)
a = x(j);
b = y(j);
window = d(a-1:a+1, b-1:b+1);
condition = all(window(:) <= d(a,b));
M(a, b) = condition + ~condition * M(a,b);
gend发布于 2012-08-07 02:11:49
使用内置函数的
已经优化的最简单的方法可能是使用imregionalmax函数,
maxinI = imregionalmax(I, CONN); 其中CONN是所需的连接性(在本例中为8)。
但是请注意,imregionalmax是图像处理工具箱的一部分。
使用 max function
如果您尝试查看这一个像素是否为其邻居的局部最大值,您可能会这样做
if m(a,b) == max(max(m( (a-1) : (a+1), (b-1) : (b+1))))或者也许不需要两个max,在某些情况下重塑可能会更快,
if m(a,b) == max(reshape (m( (a-1) : (a+1), (b-1) : (b+1)), 9,1) )不带 max function的
最后,如果您希望完全避免使用max函数,也可以使用比目前更矢量化的形式,即
if all(reshape( m(a,b) >= m( (a-1) : (a+1), (b-1) : (b+1)), 9,1))https://stackoverflow.com/questions/11833349
复制相似问题