gpt4 book ai didi

matlab - 如何在 Matlab 中优化嵌入循环索引以实现并行化?

转载 作者:行者123 更新时间:2023-12-01 22:47:19 25 4
gpt4 key购买 nike

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

预先感谢您阅读并回复我的帖子。

最佳答案

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

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

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

关于matlab - 如何在 Matlab 中优化嵌入循环索引以实现并行化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11138185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com