OpenMP优化调研系列文章(5)

部分代码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 )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值