我正在更新大型数组中的一些元素。
更新包括:
我知道移动时不会发生碰撞 如何告诉编译器它可以安全地并行化循环?
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,但我想这与编译器无关。
答案 0 :(得分:1)
这是一个混合方法,所以你有一些使用临时向量的想法。 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