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

时间:2016-11-28 00:01:10

标签: fortran

我正在更新大型数组中的一些元素。

更新包括:

  1. 将当前值乘以10(如果不为零)
  2. 清除当前值
  3. 将更新后的值移至数组中的新位置
  4. 我知道移动时不会发生碰撞 如何告诉编译器它可以安全地并行化循环?

    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,但我想这与编译器无关。

1 个答案:

答案 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
相关问题