目前我正在开展一个项目,我希望提高执行速度。 我对并行编码完全不熟悉。我的程序最初有六个循环,我管理 优化它到三个循环,执行时间减少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不提示或提供其他类型的代码优化,以使上述代码变得更快吗?
提前感谢您的善意阅读和回复我的帖子。
答案 0 :(得分:2)
您基本上是在上三角矩阵中生成索引。随着i
的值向vs_max-1
发展,线条越来越短。除非正在执行某些动态工作调度(例如,类似于schedule(dynamic)
,否则您在多个线程之间分配不好,如果您恰好熟悉OpenMP)。
您可以“扁平化”并运行单个循环并使用一些数学运算将迭代次数转换为(i,j)
对,例如请参阅this question了解可能的解决方案。如果您有足够的内存,您也可以使用所有可能(i,j)
对的预先填充列表,然后使用它从迭代编号中快速计算i
和j
。
while
循环中,并且只执行一次(i ~= vs_max
始终为真,因为i
永远不会到达vs_max
,而break
会在之后终止第一次迭代)?