【问题标题】:How to optimize embeded loop index for parallelization in Matlab?如何在 Matlab 中优化嵌入式循环索引以实现并行化?
【发布时间】:2012-06-23 16:32:31
【问题描述】:

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

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

【问题讨论】:

    标签: matlab optimization parallel-processing indexing


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      相关资源
      最近更新 更多