Необъяснимые накладные расходы Xeon-Phi - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь запустить этот код с этими разными n размерами на 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

1 Ответ

0 голосов
/ 09 июля 2018

Первая разгрузка (n = 481), безусловно, будет медленной, потому что именно здесь вы разгружаете весь код и инициализируете процесс в KNC. Если вы не хотите видеть, что вы делаете пустую разгрузку, прежде чем вы начнете отсчитывать время.

На верхнем уровне (> = 481000) все кажется нормальным; каждый прогон примерно в 10 раз медленнее, чем предыдущий, поэтому единственными странностями теперь является масштабирование нижних. Возможно, что-то из этого связано с дисбалансом нагрузки. Если у вас 60-ядерный процессор и вы используете 4T / C (вы не предоставили нам эту информацию), 4810 итераций => ~ 20 итераций / ядро, что означает, что производительность SIMD, вероятно, будет низкой, так как у вас 16 дорожек. Из-за несоосности вы можете выполнять только ввод и вывод, и ничего при полной ширине!)

...