Отключить векторизованный цикл в Фортране? - PullRequest
0 голосов
/ 13 декабря 2010

Можно ли обойти векторизацию цикла в FORTRAN? Я пишу стандарты F77 для конкретного проекта, но GNU gfortran компилируется с помощью современных FORTRAN, таких как F95. Кто-нибудь знает, избегали ли в некоторых стандартах FORTRAN петли векторизации или в gfortran есть какие-либо флаги / опции, чтобы отключить это?

ОБНОВЛЕНИЕ: Итак, я думаю, что окончательное решение моей конкретной проблемы - это «DO» с циклами FORTRAN DO, не позволяющими обновить переменную итерации. Упоминание об этом можно найти в ответе @High Performance Mark на эту тему ... Векторизация цикла и как ее избежать

[В ФОРТ, НАЙДИТЕ сучки для укрытия.]

Ответы [ 4 ]

3 голосов
/ 13 декабря 2010

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

Что вы имеете в виду, когда пишете, что хотите обойти векторизацию цикла? И в следующем предложении предположить, что это было бы недоступно для программ FORTRAN77? Для современного процессора совершенно нормально генерировать векторные инструкции, если процессор способен их выполнять. Это верно для любой версии языка, на котором написана программа.

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

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

Мне кажется довольно странным пытаться заставить компилятор идти против его природы, возможно, вы могли бы объяснить, почему вы хотите сделать это более подробно.

1 голос
/ 09 октября 2015

gfortran не выполняет векторизацию автоматически, если вы не установили -O3 или -ftree-vectorize. Так что легко избежать векторизации. Возможно, вам придется прочитать (просмотреть) руководство по gcc, а также руководство по gfortran.
Автоматическая векторизация была хорошо известной особенностью компиляторов Fortran на протяжении более 35 лет, и даже определение контуров DO в Fortran 77 было задано с учетом этого (а также ввиду некоторых известных непереносимых нарушений стандарта F66). Вы не можете рассчитывать на отключение векторизации как способа заставить некорректный код работать, хотя это может привести к появлению симптомов неверного кода.

1 голос
/ 14 декабря 2010

В большинстве современных компиляторов параметр командной строки -O0 должен отключать все оптимизации, включая векторизацию цикла.

Я иногда обнаруживал, что это приводит к исчезновению ошибок.Однако обычно это означает, что с моим кодом что-то не так, поэтому если с вами происходит что-то подобное, вы почти наверняка написали программу с ошибками.

Теоретически это возможно, но гораздо менее вероятно,Ошибка в компиляторе, вы можете легко проверить это, скомпилировав свой код в другом компиляторе Фортрана.(например, гфортран или g95).

1 голос
/ 13 декабря 2010

Как писал High Performance Mark, компилятор может выбирать машинные инструкции для реализации вашего исходного кода, если результаты соответствуют правилам языка. Вы не должны быть в состоянии наблюдать какую-либо разницу в выходных значениях в результате векторизации цикла ... ваш код должен работать быстрее. Так почему же тебя это волнует?

Иногда различия могут наблюдаться на разных уровнях оптимизации, например, в некоторых архитектурах регистры имеют дополнительную точность.

Место для поиска такого рода оптимизаций компилятора - руководство по gcc. Они расположены там, так как они являются общими для всего набора компиляторов gcc.

...