0

我有以下代码……</p>

for i=1:100
   for j=1:200

       for k=1:100

             error = DOprocess(i,j,k);

             if(error==const)
               %%Break all loops...
             end
       end

  end
end

现在的问题是 DoProcess 函数每次运行都需要大量时间。但我想找到错误代码等于 const 的 I,j,k 的组合。我也不知道 DoProcess 的内部逻辑。我知道,如果我知道我可以使用优化技术来找到最佳解决方案。对于 I、j 和 k 的多个组合,DoProcess 也可以返回一个等于 const 的错误。我只需要找到第一次出现。所以任何人都可以建议我替代搜索算法而不是这些循环。该代码在 Matlab 中,但对于 c/c++ 人来说,您只需将 end 替换为} 并在每个 for 循环的开头保留一个 {。如果在 matlab 中需要,我已准备好实现搜索算法。

4

5 回答 5

0

由于您不了解 DoProcess 函数的详细信息,因此无法进一步优化代码。

如果您以某种方式获得了该函数的实现,则可以展开至少一个循环,并使用 SIMD 函数(几乎每个处理器都至少部分支持)。

如果您只是希望您的计算更快地完成,那么您可以尝试添加更多线程,看看它是否有帮助。

于 2013-11-15T07:44:48.333 回答
0

This is not an algorithm optimization, but you could execute this code in parallel (assuming there are no dependencies between iterations (DOprocess).

于 2013-11-15T07:17:45.873 回答
0

您可以将它们组合为以下示例:

    max = 100*200*100;
    for (n = 0:max) {
        temp = n;
        i = temp % 100+1;
        temp/=100;
        j = temp % 200+1;
        temp/=200;
        k = temp % 100+1;

        error = DOprocess(i,j,k);

        if(error==const)
            break;
        end
    }
于 2013-11-15T07:16:12.373 回答
0

在没有 DoProcess 函数的任何额外信息的情况下,如果 (i, j, k) 结果不一直变化,则在实践中可能有两种优化方法:

  1. 离线执行此操作,并缓存预期的 (i, j, k) 组合
  2. 或者,在在线环境中执行一次,然后缓存。避免重复计算。
于 2013-11-15T08:08:59.083 回答
0

提高速度的一种可能性是在 DOprocess 中进行矢量化,并至少为一个输入接受一个矢量。

http://www.mathworks.de/de/help/matlab/matlab_prog/vectorization.html

这样的向量化代码更快,因为循环的开销被删除或每个向量仅存在一次。此外,许多基本操作对于大型数据集非常有效,并且使用多线程进行计算。这不需要并行工具箱。

于 2013-11-15T09:56:30.607 回答