PARALLEL.RU

Дискуссионный клуб по параллельным вычислениям
Текущее время: 17 окт 19 1:24

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: Быстродействие кода в VC и Visual Fortran
СообщениеДобавлено: 16 май 05 17:22 
Не в сети

Зарегистрирован: 26 мар 05 21:31
Сообщения: 12
Есть программа, написанная на Фортране.
Программа расчитывает TVD схему на 3-х мерной сетке. Соответственно очень много расчетов.
Поставленная задача - распаралелить для расчетов на кластере.
Так-как я гораздо лучше знаю C и мне он больше по душе я решил первым делом переписать эту программу на С.
После переделки ( собственно переписал почти в идентичную программу ) решил сравнить быстродействие.
Результат - фортрановская программа работает в 2-3 раза быстрее. Мне кажется что разница не должна превышать 20-30%
Отсюда вопрос - какие возможны общие методы повышения производительности? Может быть существуют пакеты для оптимизации под Athlon/Intel?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 16 май 05 17:31 
Не в сети

Зарегистрирован: 18 ноя 02 16:40
Сообщения: 168
Откуда: Москва
Вообще, тут могут иметь значение очень многие факторы, даже не касаясь особенностей конкретных компиляторов. Например, расположение массивов данных в Фортране по столбцам, а в Си по строкам, соответственно, если программа изначально писалась и оптимизировалась под фортрановский компилятор, то при тупом переносе на Си работа с данными может оказаться очень неэффективной. Наверняка может иметь значение и много чего еще...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 16 май 05 17:41 
Не в сети

Зарегистрирован: 26 мар 05 21:31
Сообщения: 12
менял и последовательность циклов, индексацию массива, делал одномерные массивы вместо многомерных.
получилось из 25 сек выполнения уменьшить до 20.
фортрановская прога считает за 12 с.
может быть из-за того что у меня динамические массивы, а в фортране статические? (тоесть в С коде данные возможно распологаются в разных областях памяти, а в Фортране последовательно?)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 16 май 05 17:51 
Не в сети

Зарегистрирован: 18 ноя 02 16:40
Сообщения: 168
Откуда: Москва
sema писал(а):
может быть из-за того что у меня динамические массивы, а в фортране статические? (тоесть в С коде данные возможно распологаются в разных областях памяти, а в Фортране последовательно?)

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 16 май 05 17:59 
Не в сети

Зарегистрирован: 26 мар 05 21:31
Сообщения: 12
ASA писал(а):
Трудно сказать, может, и в этом причина.... кроме того, само выделение динамических массивов может требовать какого-то времени (хотя вряд ли такого уж большого).

Как выяснилось 5-ти мерный массив [5][30][40][500]выделяется достаточно долго. Хотя может быть просто кривые руки.

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

Провел небольшое исследование, причину не нашел.
Я считаю что разница между C и Fortran-ом не привысит 20%
ASA писал(а):
Но абстрактно об этом сложно судить.

Могу попробовать конкретные примеры привести, если это имеет смысл.

Может быть траблы в этом?
Цитата:
Может быть существуют пакеты для оптимизации под Athlon/Intel?

Тоесть в моем фортрновском дистрибе они есть, а в VC нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 16 май 05 19:50 
Не в сети

Зарегистрирован: 26 мар 05 21:31
Сообщения: 12
данные содержатся в массиве следующей размерности
qt_gas[5][60][30][500] - 3-хмерная сетка по соответственно z,y,x. на каждую точку надо 5 физических величин.

Распаралеливать я думаю эффективнее по самой большой размерности x
(которая 500).
Вычислительный цикл организован следующим образом:
for(l=2;l<L_gas+2;l++){
for(j=2;j<M_gas+2;j++){
...
for(i=2;i<Nt_gas+1;i++){
...
for(k=0;k<5;k++) qy[k]=ri*dtheta_g[j-2+k];
...
for(kk=0;kk<5;kk++)
for(k=0;k<5;k++)
q[k][kk]=qtt_gas[k][i][j-2+kk][l];
Bet_R(2,dy,qy,q,sum_BRl,sum_BRp,dtn_i);
qt_gas[0][i][j][l]=qt_gas[0][i][j][l]-.5*(dt*dFq-sum_BR[0])*a_sj;
...
qt_gas[4][i][j][l]=qt_gas[4][i][j][l]-.5*(dt*dFq-sum_BR[4])*a_sj;
}
}
}

Как в этом случае возможно эффективно расположить данные в памяти и в каком порядке организовать циклы?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 17 май 05 11:31 
Не в сети

Зарегистрирован: 18 ноя 02 16:40
Сообщения: 168
Откуда: Москва
Что можно сказать сходу:
- в приведенном фрагменте самый внутренний цикл идет по первому измерению массива, следующий - по второму и т.д., это хорошо соответствует хранению данных в Фортране, но плохо - хранению данных в Си (для Си лучше соответствует как раз обратный порядок прохода по измерениям массива)
- если итерации всех циклов независимы (по приведенному фрагменту об этом сложно судить), то лучше, конечно, для распараллеливания использовать самый длинный цикл (500 итераций)
- если мы параллелим не для векторного компьютера, то выбранный для распараллеливания цикл лучше всего делать самым внешним
- самым внутренним эффективнее всего делать самый длинный цикл из оставшихся (60 итераций), при этом, если есть возможность, надо согласовать структуру данных (чтобы внутренний цикл для Фортрана проходил по первому измерению массива, а для Си - по последнему)

Это, скорее, некие общие соображения, которые могут не совсем соответствовать конкретной программе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 17 май 05 11:56 
Не в сети

Зарегистрирован: 26 мар 05 21:31
Сообщения: 12
ASA писал(а):
Что можно сказать сходу:
- в приведенном фрагменте самый внутренний цикл идет по первому
Это, скорее, некие общие соображения, которые могут не совсем соответствовать конкретной программе.


Спасибо за совет, буду пробовать. После "полевых" испытаний наверное будет яснее.
Мои сображения -
1) выделение памяти массива [500][60][30][5] будет гораздо медленее чем [5][60][30][500]. может имеет смысл объеденить 2 последних индекса и обращаться к ним как [5i+j]??
2) паралелить по размерности [60] не очень целеообразно, так-как схема 5-точечная, и уже при 7--8 машинах в кластере на 10 расчетных ячеек будет приходится 4 фиктивных - 40% потреь памяти ( что довольно критично), и время пересылки по сети гран условий может занимать кучу времени.
3) массив по самой большой размерности (500) считается не полностью.
возмущения задаются с одной стороны и распространяются в расчетной области. следовательно с начала расчет идет до 20 точки, затем по мере распространения возмущения расчетная область расширяется. для реализаци этой затеи на кластере придется чуть повозиться.
4) а так итерации особо независимы по всем 3-м измерениям


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 20 май 05 11:40 
Не в сети

Зарегистрирован: 26 мар 05 21:31
Сообщения: 12
программа считающая pi работает по времени одинаково,
а вот такой код
VC
Код:
   register int i,j;
   int k;
   double **test=new double*[1000];
   for(i=0;i<1000;i++)test[i]=new double [1000];
   
   for(k=0;k<100;k++)
      for(i=0;i<1000;i++)
         for(j=0;j<1000;j++)
            test[i][j]=j+i;

VF
Код:
   integer i,j,k
   real(8), allocatable :: test(:,:)
   allocate(test(1000,1000))
   
   do k=1,100
    do j=1,1000
     do i=1,1000
      test(j,i)=i+j
     end do
    end do
   end do

в С работает на 50 % медленнее. (по крайней мере у меня)
Это уже эффективность компилятора?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 21 май 05 17:14 
В фортрановской программе следовало бы
поменять местами индексы i и j
test(i,j)=i+j
Возможно, программа работала бы
еще быстрее.
А вообще, на вычислительных задачах
фортран, как правило, быстрее С.


Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: 21 май 05 17:33 
Не в сети

Зарегистрирован: 26 мар 05 21:31
Сообщения: 12
ну я так максимальное быстродействие и мерял ( там всего 2 варианта, я их оба и попробовал).
кстати у меня дома на Athlon XP быстродействие отличается в 1,5 раза (1,5 сек против 1 сек), в университете запускал на PIV те-же exe-шники - скорость одинаковая (1сек) :О
вообщем полная неразбериха.
ну то что фортран быстрее я не спорю, но не в 3 же раза.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 22 май 05 19:13 
Не в сети

Зарегистрирован: 26 дек 04 21:21
Сообщения: 120
Откуда: Ростов-на-Дону
Когда время выполнения программы столь мало, то очень важно какими средствами ты его замеряешь!

Когда я замерял время для VC, то у меня был такой разброс по результатам замеров, что ой-ё-ё-ой!

_________________
Важно не слово, но дело!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 22 май 05 20:15 
Не в сети

Зарегистрирован: 26 мар 05 21:31
Сообщения: 12
Время меряю вот так
double timer(void)
{
struct _timeb tp;
_ftime(&tp);
return((double)(tp.time)+(double)(tp.millitm)/1000.);
}
причем разброса по результатам особо нету. на больших временах та-же самая картина


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB