2010-12-30 2 views
1

У меня есть инициализация массива на основе подразумеваемого цикла do, учитывая нечетный размер N.Являются ли подразумеваемые DO петли неэффективными?

J=(N+1)/2 
XLOC(1:N) = (/ (I-J, I=1,N) /) 

В контексте F90 + это рекомендуется использовать (/ .. /) синтаксис, или более эффективно использовать FORALL заявление.

Пример: для N=19 затем XLOC=(-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9)

Как бы вы еще инициализировать этот массив?


Edit 1

Как бы вы инициализировать этот массив с более читаемым кодом?

ответ

2

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

Также см этого предыдущего ответа: Do Fortran 95 constructs such as WHERE, FORALL and SPREAD generally result in faster parallel code?

2

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