我尝试在Xeon Phi KNC上运行这段不同大小的代码。我得到了表中显示的时间,但我不知道为什么我会遇到这些波动。你能给我指点一下吗?提前谢谢。
代码:
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发布于 2018-07-09 16:29:30
第一次卸载(n=481)肯定会很慢,因为这是您卸载所有代码并初始化KNC上的进程的地方。如果你不想看到这一点,那么在开始计时之前做一个空的卸载。
在高端(>=481000),事情看起来很正常;每次运行都比以前慢了大约10倍,所以现在唯一奇怪的是低端运行的缩放。这其中有可能与负载不平衡有关。如果你有一个60核的处理器,并且运行4T/C (你没有给我们这个信息),4810次迭代=> ~20次迭代/核心,这意味着单指令多核的性能可能会很差,因为你有16个通道。如果没有对齐,您可能只执行入刀和退刀,而不是全宽!)
https://stackoverflow.com/questions/51207834
复制相似问题