Кто-нибудь знает, почему 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 непосредственно вычисляется. Но на самом деле мои ожидания были неправильными. Заранее спасибо.
Спасибо за ответы. Собственно, сначала я тоже так думал. Таким образом, главная проблема здесь - доступ к памяти. Я еще не тестировал его с помощью Gfortran, но, надеюсь, я получу те же результаты (перспективы), поскольку иногда 'Ifort' и' Gfortran' могут давать разные характеристики даже для некоторых простых и фундаментальных проблем. –
Только сторона подумала, что вы должны устранить один цикл. Двое из них, похоже, не нужны. – innoSPG
Да, конечно, мне не нужны эти 2 цикла. Все коды, которые я написал здесь, являются лишь некоторыми простыми примерами, которые я хочу узнать о характеристиках 'Ifort' и' Gfortran'. –