部分代码SIMD/并行化
该优化的灵感来源于ICC编译器的自动向量化功能[1],ICC编译器在做自动向量化的工作的时候,将一些不可SIMD的工作拆分成可以SIMD和不可SIMD两部分,使用临时数组存储可SIMD的计算结果,最后再将两部分结果结合在一起。我们也可将一段本不可并行运行的工作拆成可以并行化和不可并行化两部分进行优化,并且OpenMP如今也支持SIMD功能,同样也可以做部分SIMD。我们调研了使用手写代码完成上述两种优化的测试,发现在计算量足够大,或者是可以多次重复利用临时数组的时候,可以得到性能的优化。
优化前:
subroutine f(a, b, c, d)
integer :: a(10000000), b(10000000), c(10000000), d(10000000)
do i = 2, 10000000
a(i) = a(i - 1) + b(i) * c(i) / d(i) * b(i)
end do
end
program main
integer :: a(10000000), b(10000000), c(10000000)
do i = 1, 100
call f(a, b, c, d)
end do
end program main
优化后:
subroutine f(a, b, c, d, e)
integer :: a(10000000), b(10000000), c(10000000), d(10000000), e(10000000)
! o m p p a r a l l e l d o / / o r u s e o m p s i m d d o i = 2 , 10000000 d ( i ) = b ( i )