Фортран против C: Мандельброт тест

Вы можете попробовать что-то подобное с inline условным оператором :

visibleentriesruleid="ES_COMPRADOR_1 ? ES_COMPRADOR_1 : ES_COMPRADOR_2"

Таким образом, ваш код будет:


4
задан pawel_winzig 20 January 2019 в 09:28
поделиться

1 ответ

Победившая версия C ++ на этом тестовом сайте вручную векторизована для x86 с использованием встроенных функций SIMD (SSE, AVX или AVX512) , например, используя _mm256_movemask_pd(v1 <= v2);, чтобы получить битовую маску целого вектора результатов сравнения, позволяя ему проверять 4 пикселя параллельно для выхода за границы. И собственный синтаксис GNU C для SIMD умножается и что угодно, например, r2 + i2 для добавления или умножения векторов SIMD с помощью обычных операторов C / C ++.

Версия C ++ имеет условие цикла, оптимизированное для SIMD:

 // Do 50 iterations of mandelbrot calculation for a vector of eight
 // complex values.  Check occasionally to see if the iterated results
 // have wandered beyond the point of no return (> 4.0).

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


Существует множество версий программы на C и C ++, скорость которых аналогична скорости на Фортране. Они хороши даже для исходного кода C / C ++, который не векторизован вручную.

Я не уверен, поддерживает ли Intel Fortran или любой другой компилятор расширения для ручной векторизации.

0
ответ дан Peter Cordes 20 January 2019 в 09:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: