如何在Matlab中优化并行化的嵌入循环索引?

时间:2012-06-21 12:29:55

标签: matlab optimization parallel-processing indexing

目前我正在开展一个项目,我希望提高执行速度。 我对并行编码完全不熟悉。我的程序最初有六个循环,我管理 优化它到三个循环,执行时间减少300%。从我学习的东西 我认为问题在于索引。我在之前的循环中使用过parfor但是索引是i = 1:vs_max-1。

在以下代码中:

for i = 1:vs_max-1
 for j = i+1:vs_max-1
  d = max(abs(X(i,:)-X(j,:)));
  DD = exp(-(d/r)^n);
  D(i,j) = DD;
  D(j,i) = DD;
  while (i~=vs_max)
    d2 = max(abs(X2(i,:)-X2(j,:)));
    DD2 = exp(-(d2/r)^n);
    D2(i,j) = DD2;
    D2(j,i) = DD2;
    break;
  end

 end
end

我认为问题出在第二个循环索引中,其中j也需要i值 当我们有多个线程时,我们可以多次访问这些值。

任何人都可以帮我重新索引此循环,以便parfor不提示或提供其他类型的代码优化,以使上述代码变得更快吗?

提前感谢您的善意阅读和回复我的帖子。

1 个答案:

答案 0 :(得分:2)

您基本上是在上三角矩阵中生成索引。随着i的值向vs_max-1发展,线条越来越短。除非正在执行某些动态工作调度(例如,类似于schedule(dynamic),否则您在多个线程之间分配不好,如果您恰好熟悉OpenMP)。

您可以“扁平化”并运行单个循环并使用一些数学运算将迭代次数转换为(i,j)对,例如请参阅this question了解可能的解决方案。如果您有足够的内存,您也可以使用所有可能(i,j)对的预先填充列表,然后使用它从迭代编号中快速计算ij

BTW:计算的第二部分看起来很奇怪。为什么将它放在一个始终执行的while循环中,并且只执行一次(i ~= vs_max始终为真,因为i永远不会到达vs_max,而break会在之后终止第一次迭代)?