2016-08-29 3 views
0

Кто-нибудь знает, почему Program B быстрее, чем Program A есть?Двухкратный цикл 1D с различными конфигурациями

Я использовал ifort-16 с -fast флагом оптимизации и отчеты по оптимизации говорят, что Program A даст оценочную потенциальную скорость до 10.09, в то время как Program B только 3,90. Но на самом деле время работы Program B составляет 14 секунд, а Program A - 20 секунд.

!Program A 
DO J=1, 100000   !This is the different part 
    !$OMP SIMD 
    DO I=1, 100000 
     IF(A(I)==J) THEN 
      B(I)=J 
     END IF   
    END DO 
    !$OMP END SIMD 
END DO 

!Program B 
DO I=1, 100000   !This is the different part 
    !$OMP SIMD 
    DO J=1, 100000 
     IF(A(I)==J) THEN 
      B(I)=J 
     END IF   
    END DO 
    !$OMP END SIMD 
END DO 

Ну, обе программы были успешно векторизации и как-то мое чувство говорит, что program A будет быстрее, так как (на мой взгляд), оба кода будут векторизованы следующим образом:

!Program A 
IF(A(I)==J) THEN 
    B(I)=J 
END IF 

IF(A(I+1)==J) THEN 
    B(I+1)=J 
END IF 

... 

и

!Program B 
IF(A(I)==J) THEN 
    B(I)=J 
END IF 

IF(A(I)==J+1) THEN 
    B(I)=J+1 
END IF 

... 

, где Program A будет более эффективным, так как левая стороне индексирует re непосредственно вычисляется. Но на самом деле мои ожидания были неправильными. Заранее спасибо.

ответ

1

Время выполнения программы включает в себя множество компонентов. Время, на которое мы смотрим большую часть времени, - это время вычисления. Однако у нас также есть доступ к памяти, который является узким местом большинства программ. Существуют и другие компоненты, но я ограничусь этими двумя. В вашем случае доступ к памяти потенциально может иметь значение.

В программе B, внутренний цикл (с J индексом), который работает 100000 доступа та же область памяти A(I) и B(I) для каждой итерации внешнего цикла (I индекса). Как только они загружаются в регистры, больше нет необходимости переходить в память. Программа переходит в память только тогда, когда изменяется индекс I внешнего контура. То есть 100000 раз

В программе А, внутренний цикл (с I индексом), который работает 100000 доступа различных ячеек памяти A(I) и B(I) для каждой итерации внутреннего цикла. Поскольку вы не можете иметь 100000 в регистрах, CPU придется ждать данных. А поскольку внешний цикл (J индекса) также запустить 100000 раз, у вас есть 100000x100000 доступ к памяти для программы по сравнению с 100000 для программы В.

То есть одно из возможных объяснений того, что вы наблюдали.

+1

Спасибо за ответы. Собственно, сначала я тоже так думал. Таким образом, главная проблема здесь - доступ к памяти. Я еще не тестировал его с помощью Gfortran, но, надеюсь, я получу те же результаты (перспективы), поскольку иногда 'Ifort' и' Gfortran' могут давать разные характеристики даже для некоторых простых и фундаментальных проблем. –

+0

Только сторона подумала, что вы должны устранить один цикл. Двое из них, похоже, не нужны. – innoSPG

+1

Да, конечно, мне не нужны эти 2 цикла. Все коды, которые я написал здесь, являются лишь некоторыми простыми примерами, которые я хочу узнать о характеристиках 'Ifort' и' Gfortran'. –

 Смежные вопросы

  • Нет связанных вопросов^_^