gpt4 book ai didi

fortran - 如何告诉编译器一个循环可以安全地并行化?

转载 作者:行者123 更新时间:2023-12-02 03:08:59 24 4
gpt4 key购买 nike

我正在更新一个大数组中的几个元素。

更新包括:

  1. 将当前值乘以十(如果它不为零)
  2. 清除当前值
  3. 将更新后的值移动到数组中的新位置

我知道移动时不会发生碰撞。
我如何告诉编译器它可以安全地并行化循环?

do i = 1, 1e6
if ( v[i] /= 0 ) then
temp = v[i] * 10
v[i] = 0
ndx = get_move_to_ndx(i)
v[ndx] = temp
end if
end do

我正在使用 ifort,但我猜这是独立于编译器的。

最佳答案

这是一种杂种方法,因此您对使用临时向量有一些想法。 WHERE 可能不正确,您必须尝试一下。 WHERE/ELSEWHERE 的主要优点是可读性,因为它通常不如循环那么快……只是更容易阅读。

!DIR$ SIMD
FillTemp: Do I = 1, 1000000
Temps(I) = v(I)*10
ENDDO FillTemp

!$OMP PARALLEL DO
FindIndex: Do I = 1, 1000000
ndx_vect(I) = get_move_to_ndx(i)
ENDDO FindIndex

WHERE( Temps /= 0 )
V = 0
ELSEWHERE
v(ndx_Vect) = tempz
ENDWHERE

关于fortran - 如何告诉编译器一个循环可以安全地并行化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40835369/

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