无法解释的 Xeon-Phi 开销

Posted

技术标签:

【中文标题】无法解释的 Xeon-Phi 开销【英文标题】:Unexplained Xeon-Phi Overhead 【发布时间】:2018-07-06 09:59:25 【问题描述】:

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

【问题讨论】:

设置:#!/bin/bash #SBATCH -N 1 #SBATCH -o out_122 #SBATCH --exclusive export MIC_KMP_AFFINITY=verbose,granularity=fine,scatter export MIC_OMP_NUM_THREADS=122 ./prog.exe sbatch -p xphi -N 1 --exclusive run_par.sh,而所有设置都在run_par.sh中,xphi是设备的名称。 还值得一提的是,native 运行(在!$omp SIMD 之前添加!dir$ offload begin target(mic) 会产生更好的结果。n= 481 time= 0 n= 4810 time= 0 n= 48100 time= 6 n= 481000 time= 55 n= 4810000 time= 455 n= 48100000 time= 4342 n= 481000000 time= 43322 natuve 运行中设置为:#!/bin/bash #SBATCH -N 1 #SBATCH -o out_244_native #SBATCH --exclusive export SINK_LD_LIBRARY_PATH=...intel/compilers_and_libraries/linux/lib/mic:$SINK_LD_LIBRARY_PATH micnativeloadex ./prog.exe.MIC -e "KMP_AFFINITY=verbose,granularity=fine,scatter" 【参考方案1】:

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

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

【讨论】:

以上是关于无法解释的 Xeon-Phi 开销的主要内容,如果未能解决你的问题,请参考以下文章

在 xeon-phi 上引导自定义内核

Xeon-Phi 从主机 openMP 并行区域异步卸载

CudaEvent内核启动时间

字节码执行方式--解释执行和JIT

字节码执行方式--解释执行和JIT

解释 gperftools 在多线程工作负载上的结果