2

目前我正在做一个项目,我想提高执行速度。我对并行编码完全陌生。我的程序最初有六个循环,我设法将其优化为三个循环,执行时间减少了 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 不提示或提供另一种类型的代码优化,以使上述代码变得更快?

提前感谢您的好意阅读和回答我的帖子。

4

1 回答 1

2

您基本上是在上三角矩阵中生成索引。随着 的值i向 前进vs_max-1,线条越来越短。schedule(dynamic)除非正在执行一些动态工作调度(例如,如果您碰巧熟悉 OpenMP,类似于 ,这不会很好地分布在多个线程之间)。

您可以将事物“展平”并运行一个循环并使用一些数学运算将迭代次数转换为一(i,j)对,例如,请参阅此问题以获取可能的解决方案。如果您有足够的内存,您还可以使用所有可能(i,j)对的预填充列表,然后使用它来快速计算i迭代j次数。

顺便说一句:计算的第二部分看起来很奇怪。为什么要把它放在一个while总是执行并且只执行一次的循环中(i ~= vs_max总是正确的,因为在第一次迭代后i永远不会到达vs_maxbreak终止它)?

于 2012-06-21T13:32:06.290 回答