1

我正在尝试在 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
4

1 回答 1

1

第一次卸载 (n=481) 肯定会很慢,因为这是您卸载所有代码并在 KNC 上初始化进程的地方。如果您不想在开始计时之前看到它进行空卸载。

在高端(> = 481000),事情看起来很正常;每次运行都比以前慢约 10 倍,所以现在唯一的奇怪是较低的缩放。其中一些可能与负载不平衡有关。如果您有 60 核处理器并且运行 4T/C(您没有向我们提供此信息),则 4810 次迭代 => ~20 次迭代/内核,这意味着 SIMD 性能可能很差,因为您有 16 条通道。鉴于未对准,您可能只执行导入和导出,而不是全宽!)

于 2018-07-09T08:29:30.340 回答