我正在尝试在Xeon Phi KNC上以这些不同的n大小运行此代码。我正在获得表中所示的时间,但是我不知道为什么会遇到这些波动。你能指导我完成吗?预先感谢。
代码:
program prog
integer, allocatable :: arr1(:), arr2(:)
integer :: i, n, time_start, time_end
n=481
do while (n .le. 481000000)
allocate(arr1(n),arr2(n))
call system_clock(time_start)
!dir$ offload begin target(mic)
!$omp SIMD
do i=1,n
arr1(i) = arr1(i) + arr2(i)
end do
!dir$ end offload
call system_clock(time_end)
write (,) "n=",n," time=",time_end-time_start
deallocate(arr1,arr2)
n = n*10
end do
end program
结果:
n= 481 time= 8881
n= 4810 time= 75
n= 48100 time= 53
n= 481000 time= 261
n= 4810000 time= 1991
n= 48100000 time= 18912
n= 481000000 time= 188203
答案 0 :(得分:1)
第一次卸载(n = 481)肯定会很慢,因为这是您卸载所有代码并在KNC上初始化进程的地方。如果您不希望看到那样的内容,请在开始计时之前进行空的卸载。
在高端(> = 481000),事情看起来很理智;每次运行的速度比以前慢10倍左右,因此现在唯一的不足是缩放较小的运行。其中一些可能与负载不平衡有关。如果您有一个60核处理器并且正在运行4T / C(未提供此信息),则4810次迭代=>〜20次迭代/核,这意味着SIMD性能可能很差,因为您有16条通道。如果未对齐,则您可能只执行导入和导出操作,而全宽度时什么也没有执行!)