Пусть F77 и ниже заслуживают всяческого фи с точки зрения спецов в теории алгоритмических языков, но!
те, кто хают Фортран думают только о своем тупом комфорте, а о разработчиках компиляторов вы подумали?
Автоматическая оптимизация программы на C на суперкомпьютер это застрелиться, на Фортране это хотя бы теоретически возможно. А если его дополнить небольшим количеством расширений, которые по пальцам пересчитать можно, то Фортран это конфета для параллельного компилятора.
Так-то, а если работать на ПиСях, то вопросов нет, "обобщать" опять же не надо, уважаемые.
> те, кто хают Фортран думают только о своем тупом комфорте, а о разработчиках
> компиляторов вы подумали?
Это cool!
> Автоматическая оптимизация программы на C на суперкомпьютер это застрелиться,
> на Фортране ...
Прикинь, да, - как возможности оптимизации соотносятся с 72-колоночной
автообрезаемой строкой, символом продолжения в 6 колонке, 6-символьными
идентификаторами, implicit декларациями, etc.?
> А если его дополнить небольшим количеством расширений, которые по пальцам
> пересчитать можно, ...
...то хрен его автоматически соптимизируешь.
Вообще, я всегда вручную соптимизирую лучше, чем любой оптимизатор. Лучше
уж я продумаю алгоритм сам, чем поручу компилеру распутывать мои навороты.
Извини, мне так ...э-э-э... комфортнее :)
З.Ы.
Всегда юзеры мешали админам глупостями "о своем тупом комфорте". Теперь, стало
быть, надо еще меньше думать "об этом", чтобы, не дай Бог, не помешать
разработчикам компиляторов ;)
====== > те, кто хают Фортран думают только о своем тупом комфорте, а о разработчиках > компиляторов вы подумали? Это cool!
> Автоматическая оптимизация программы на C на суперкомпьютер это застрелиться, > на Фортране ... Прикинь, да, - как возможности оптимизации соотносятся с 72-колоночной автообрезаемой строкой, символом продолжения в 6 колонке, 6-символьными идентификаторами, implicit декларациями, etc.? ======
По ходу дела, тут как-то пробегала статья о современных методах распараллеливания под суперкомпьютеры. Так вот, оказалось, что так или иначе, все современные тулы создают функциональное представление, которое, затем, и распараллеливается.
Так что, Черч рулит форева :)))))
Благо что тут видел сайт об использовании Haskell для квантовых вычислений. Боюсь только, что у физиков мозгов не хватит для Хаскелла :))))) Но программы просто дико впечатляют. Я тут не далее чем полгода назад имел счатстье написать аналог некого фортрановского кода, считающего газодинамику с химкинетикой. Так вот, этот аналог, писанный на С++, был быстрее оригинала, откомпилированного компаковским компиллером на порядк. Причем, в частности, за счет лучшей локализации данных и partial evalution (see expression templates). Причем, код получился на много понятнее, чем фортрановское спагетти :)))
А когда возникла необходимость интегрировать код в AMRный фреймвок Chombo, это было сделано за один человеко-день. Причем, за счет этого фреймвока задача стала прекрасно считаться на MPIном фреймвоке
====== Я тут не далее чем полгода назад имел счатстье написать аналог некого фортрановского кода, считающего газодинамику с химкинетикой. Так вот, этот аналог, писанный на С++, был быстрее оригинала, откомпилированного компаковским компиллером на порядк. ======
Это код что ли ? А не жирнова-то будет ? ;) За код денюжку платить надо :) Как-то не прижился GPL в российском научном мире.
======
Не сам код, а технически характерный пример. Или слабО?
А насчет денег ты идеалист. Кто тебе заплатит за газодинамику? :)
======
А статью, пожалуста. Она в процессе написания. Если дадите свое мыло - могу прислать, когда закончим.
======
Научные статьи я сам и писал, и читал - знаю что это сегодня такое по своей сущности в 90% случаев. :) Ты по делу говори, бумага-то все стерпит, когда надо отчитываться о проделанной работе. :))
Хотя присылайте конечно. "Посмотрим, какой это Сухов" (С)
anonymous (*) (2002-11-20 10:40:41.667):
> Как-то не прижился GPL в российском научном мире.
Ну да, в _российском_ - может быть... -- т.е. те, кто за пределы России носа не
суют, публикуются из принципа в только российских журналах и не знают английского,
часто чахнут над своими поделиями - как бы не увели! - а то уж очень кушать хочется:)
В ("просто") научном мире GPL еще как прижился!
> А статью, пожалуста. Она в процессе написания. Если дадите свое мыло - могу прислать,
> когда закончим.
Не побоишься на халявку слать - буду благодарен за ссылку сюда или на
colonel_b@hotmail.com
Как-то взрыв газовой смеси на буровой вышке ? Как-то платят
Что такое технически характерный пример ?
Отчитываюсь я только перед тем, кто мне поставил задачу
По ходу дела, вычфизика не является источником моего существования, более того, это скорее хобби - т.ч. наезд Die-Hard считаю не обоснованным. Просто лишние пара-тройка тысяч мне не помешают :))) Знаете ли, квартиры в уродском городе МСК стоят неоправдано дорого.
На счет просто научного мира я знаю. Та же Chombo под открытой лицензией. Но вот российская вычислительная физика - это полный мрак. Таких диких отношений я нигде не видел: предательства, подставы, дележка грантов - мрак полнейший :( Слава Богу - я с этими учеными общаюсь лишь косвенно.
====== За газодинамику в сложном домене ? Как-то взрыв газовой смеси на буровой вышке ? Как-то платят ======
Исследуете, как быстро ударная волна дойдет до виллы местного НР? :) Тогда может даже и хорошо платят, не спорю. :)
======
Что такое технически характерный пример ?
======
Показывающий, что на Фортране реализация конкретного численного метода всегда медленнее, чем на С++, ввиду ублюдочности языка Фортран (а не криворукости кодера).
======
Отчитываюсь я только перед тем, кто мне поставил задачу
Далее газодинамика считается годуновым, а химкинетика по неявной схеме считает вполне очевидное уравнение химкинетики. Считает по отдельности, ибо общая система газодинамики и химкинетики расщепляется по энергии. Далее, согласование шага для годунова и chemsolverа. Послеледний - намного капризнее к шагу, т.к. матрица неявной схемы содержит числа от 10^-30 до 10^5, но это так, лирическое отступление.
Пока не убедил. Лучшего качества "на порядок" в бенчмарках я не нашел. Вот одна типичная фраза: "Blitz++ has a slight edge over F90". А поскольку качество оптимизации у различных компилятором ОЧЕНЬ разное, вполне возможно, что наоборот, будет "F90 has a slight edge over Blitz++". Даже при том же самом исходном коде.
anonymous (*) (2002-11-20 15:05:28.866):
> ...вполне возможно, что наоборот, будет "F90 has a slight edge over Blitz++"
и т.п. ...
Чем попусту впадаь в религиозный экстаз :), обосновал бы, почему Фортран может быть
быстрее? IMHO
do i=1,10
и
for(i=1;i<11;1++)
любой компилер одинаково эффективно странслировать способен.
Почему Це быстрее IMHO очевидно - он мощнее, гибче и, с др. стороны,
ближе к ассемблеру.
Оригинальный код компиллися Compaq Visual Fortran for Windows 6.0 наш код - g++ 2.95 под cygnus под Windows, и тот же компиллер под Linux
Benchmarkинг производился Xeon 1.8GHz
Профайлер кеша (http://www.cacheprof.org/) показал, что у фортрановского кода быстродействие было понижено за счет большого числа cache misses. Действительно, единственными структурами данных в фортрановском коде были многомерные массивы, причем каждый шаг вычислений требовал данных из нескольких массивов. Кроме того, оригинал (у меня был его частичный код) представлял из себя спагетти :)), что затрудняло работу branch-предиктора. В общем, анализ был очень поучительный.
Да, кстати, не надо кричать, что оригинал написал горе-программист --- его автор очень уважаемый физик-вычислитель, считающий уже более 30ти лет.
Причем тут "ближе к ассемблеру"? Фортран - язык, нацеленный на матричные операции. Ссылки, например, в нем хоть и есть, но работают медленнее, чем сишные указатели. Ну а массивы - быстрее. Потому что Фортран язык не универсальный, а специализированный.
И вообще я практик. Вот вам очень простой пример: ====== SUBROUTINE XORSWAP INTEGER, PARAMETER :: ILU = 20, JLU = 60, L = 180, M = 135, * IM = 260, JM = 260, KMAX = 1000001 INTEGER, DIMENSION(IM,JM) :: I, J DO K = 1, KMAX I(ILU:ILU+L,ILU:ILU+M) = * IEOR(I(ILU:ILU+L,ILU:ILU+M), * J(JLU:JLU+L,JLU:JLU+M)) J(JLU:JLU+L,JLU:JLU+M) = * IEOR(J(JLU:JLU+L,JLU:JLU+M), * I(ILU:ILU+L,ILU:ILU+M)) I(ILU:ILU+L,ILU:ILU+M) = * IEOR(I(ILU:ILU+L,ILU:ILU+M), * J(JLU:JLU+L,JLU:JLU+M)) END DO OPEN(13, file='out_f90_2.txt') WRITE(13,'(100I2)') I CLOSE(13) END ======
А вот результаты ( а также для аналогов на си и фортране 77):
ЗЫ: поскольку вы тут MSVC вряд ли любите, уточняю, что линуксовый gcc у соседа по рабочему месту давал результаты, почти столь же далекие от фортрановских.
====== F:\MyWork\TEST\FROMMAIN>cl /O2 /c main.c xorswap.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86 Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
main.c xorswap.c Generating Code...
F:\MyWork\TEST\FROMMAIN>df /compile_only /optimize:5 /object:fortran.obj xorswapdo.f xorswapf.f Compaq Visual Fortran Optimizing Compiler Version 6.6 (Update B) Copyright 2001 Compaq Computer Corp. All rights reserved.
xorswapdo.f xorswapf.f
F:\MyWork\TEST\FROMMAIN>link main.obj xorswap.obj fortran.obj Microsoft (R) Incremental Linker Version 6.00.8447 Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
А с какой скоростью работают массивы? И сколько просят за работу? ======
Смотри результаты моего примера (твоих примеров и результатов я пока не видел). А если тебе нужна теория, книжки почитай. В них все написано. А я сейчас на работе, и трехмерными обтеканиями мне за бесплатно впадлу и некогда заниматься.
1) Основываясь на доступных бенчмарках, до предъявления Ваших результатов считаю, что чуда не произошло, и если Фортран конкретно в Вашей медленнее, то именно из-за того, что там "спагетти" (30-летней закалки).
2) Жду результатов Блитца с плюсами хотя бы относительно такого примитивного примера, как я привел.
Я. конечно, понимаю. Российским ученым не привыкать, но на тестовой машинке софт проверяется, и ворованного там стоять ничего не должно. А покупать... ну... эээ.... бабок как-то жалко :)
Забыл сказать, что я ожидаю от желающих написать мой пример на Блитце: виндузовый (звиняйте, линуксов сейчас не держим, уж так получилось) экзешник (оптимизированный под третий пень) и исходник. Можно направлять на fortranrulez@front.ru.
Я. конечно, понимаю. Российским ученым не привыкать, но на тестовой машинке софт проверяется, и ворованного там стоять ничего не должно. А покупать... ну... эээ.... бабок как-то жалко :)
Вот то, что я получил ====== /* // TDMA // to solve the system of equation: // c[k]*x[k-1] + b[k]*x[k] + a[k]*x[k+1] = f[k], // where c[1] = 0; a[n] = 0 */ #include <math.h> #include <stdlib.h> #include <stdio.h> #include <time.h>
double *be, *z; /* temporary arrays */
double TDMA(n, c, b, a, f, x) int n; double *c, *b, *a, *f, *x; { double d; int k;
if( c[1] != 0.0 ) c[1] = 0.0; if( a[n] != 0.0 ) a[n] = 0.0; /* direct: */ be[1] = -a[1]/b[1]; z[1] = f[1]/b[1]; for (k=2; k <= n; k++) { d = b[k] + c[k]*be[k-1]; d = 1.0/d; be[k] = -a[k]*d; z[k] = (f[k] - c[k]*z[k-1])*d; }; /* come back: */ x[n] = z[n]; for (k=n-1; k >= 1; k--) x[k] = be[k]*x[k+1] + z[k];
return 0.0; }; int main() {
double *c, *b, *a, *f, *x; int n=2000; /* A number of equations */ int maxit=32000; /* A number of TDMA calls */ int i,it; clock_t start, end;
c = (double*) calloc(n+2, sizeof(double)); b = (double*) calloc(n+2, sizeof(double)); a = (double*) calloc(n+2, sizeof(double)); f = (double*) calloc(n+2, sizeof(double)); x = (double*) calloc(n+2, sizeof(double)); be = (double*) calloc(n+2, sizeof(double)); z = (double*) calloc(n+2, sizeof(double));
anonymous (*) (2002-11-20 16:33:18.768):
> твоих примеров и результатов я пока не видел
Слушай, практик,
Я в твой пример навскидку не въехал - форматирование включил б, чтоль? -
но не пожалел 20 минут на простейший тест.
Произведение 2 матриц - че может быть проще?
Fortran:
PARAMETER (IS=400)
INTEGER R(IS,IS),I(IS,IS),J(IS,IS),K,L,M
DO K = 1, IS
DO L = 1, IS
I(K,L) = 3
J(K,L) = 4
ENDDO
ENDDO
DO K = 1, IS
DO L = 1, IS
R(K,L) = 0
DO M = 1, IS
R(K,L) = R(K,L)+I(K,M)*J(M,L)
ENDDO
ENDDO
ENDDO
WRITE(*,10) R
10 FORMAT(400(' ',I2))
END
Це:
#include <stdio.h>
#define IS 400
int i[IS*IS],j[IS*IS],r[IS*IS];
void main(void)
{
register int m k,l;
for(k=0;k<IS; k++)
for(l=0;l<IS; l++){
i[k,l]=3;
j[k,l]=4;
}
for(k=0;k<IS; k++)
for(l=0;l<IS; l++){
r[k,l]=0;
for(m=0;m<IS; m++)
r[k,l]+=i[k,m]*j[m,l];
}
for(k=0;k<IS; k++){
for(l=0;l<IS; l++)
printf(" %d",r[k,l]);
printf("\n");
}
}
Компилеры:
man f77
f77 - invokes the DIGITAL Fortran 77 (formerly DEC Fortran) compiler
man f90
f90 - invokes the DIGITAL Fortran 90 compiler
cc -V
DEC C V5.8-009 on Digital UNIX V4.0 (Rev. 1091)
uname -msr
OSF1 V4.0 alpha
ок? Как раз числогрызные - и платформа, и компилеры.
f77 -o tryfc tryfc.f
time ./tryfc > /dev/null
2.536u 0.020s 0:02.57
f90 -o tryfc tryfc.f
time ./tryfc > /dev/null
2.344u 0.015s 0:02.46
cc -O2 -o tryfcc tryfc.c
time ./tryfcc > /dev/null
1.157u 0.005s 0:01.16
(Надо ли говорить, что по умолчанию Фортрановские компилеры оптимизируют -O4?)
Ок, оптимизируем пайпы, чтобы IO не мешалось:
f90 -O5 -o tryfc tryfc.f
time ./tryfc > /dev/null
1.788u 0.019s 0:01.87
cc -O4 -o tryfcc tryfc.c
time ./tryfcc > /dev/null
0.996u 0.003s 0:01.00
Все равно фортран в заднице!
Заметь, на Сях я еще мог бы вручную поизвращаться,
массивы через указатели попинать.
3) для оптимизации массивных операций и циклов нужны разные ключи, во всяком случае в современном компаковском компиляторе. Либо /fast, либо /optimize:5. По разному надо пробовать.
anonymous (*) (2002-11-20 18:42:06.505):
anonymous (*) (2002-11-20 18:50:33.896):
1) Попробуй сам, убедись, что то того, как сидят в памяти массивы, ничего не изменится.
2) Я пробовал ВСЕ ключи.
3) Я про язык, а не про либы/компилеры.
Ладно, завязываю с тобой спорить; видимо, это не лечится :(
"Религия - опиум для народа!"
Совсем-то уж не надо позориться! Очень даже зависит. Код с бенчмарками показать или сам признаешься? :)
И вообще - это ведь только идиоты пишут о столбцово-ориентированных версиях известных алгоритмов для Фортрана. Конечно же, Каханер, Моулер и Нэш идиоты, а Дайхард - рулез форэва! :)))
И вообще, качай и смотри еще один чУдный пример, раз тебе мое форматирование не нравится:
При виде вашего "кода на Цэ" складывается впечатление, что вы гнусно прикалываетесь. Убедительная просьба более не издеваться над читателями - фортранщики все равно не поймут.
Фортранщики все поняли, погыгыкали да и выложили на fortranrulez.front.ru/testmatmul.zip
Стыдно должно быть, товарищ! Я думал, вы хоть на Си умеете. Ан нет.
ЗЫ: про то, что вы все перегрузили вводом-выводом, и про то, что в 3-м тысячелетии вы написали register, я молчу. =) Так что выложил более приличный и жизненный вариант теста. И числодробилка у вас хилая какая-то, кстати говоря...
Фортраншики все, чтоль? Я всегда подозревал, что только очень недалекие
люди в наше время прутся от фортрана;)
Хотя, сильно сдается мне, что это все - один и тот же "религиозный" анонимус.
Аргументы уж больно ...сильные :) Ты, часом, не студент? Похож на только что
изучившего фортран третьекурсника.
Да, вчера я глупость написАл на Це :(.
Вместо двумерных у меня одномерные массивы были.
Я ж торопился, на коленке ваял, пытаясь изобразить сишный код как можно
ближе к фортранному. А аононимус, вместо того, чтобы меня в
мою глупость ткнуть, впал в религиозный экстаз...
Короче, вот правильный код:
#include <stdio.h>
#define IS 400
int i[IS][IS],j[IS][IS],r[IS][IS];
void main(void)
{
register int m,k,l;
for(k=0;k<IS; k++)
for(l=0;l<IS; l++){
i[k][l]=3;
j[k][l]=4;
}
for(k=0;k<IS; k++)
for(l=0;l<IS; l++){
r[k][l]=0;
for(m=0;m<IS; m++)
r[k][l]+=i[k][m]*j[m][l];
}
for(k=0;k<IS; k++){
for(l=0;l<IS; l++)
printf(" %d",r[k][l]);
printf("\n");
}
}
И теперь и сишная, и фортранная проги демонстрируют одинаковую производительность.
Как я и предполагал (Die-Hard (*) (2002-11-20 15:39:24.65):
> IMHO
> do i=1,10
> и
> for(i=1;i<11;1++)
> любой компилер одинаково эффективно странслировать способен.
Ты не обессудь, что дурацкие вопросы задаю, но не многовато ли у тебя printf'ов для оценки производительности то ?? Да и чем матрицы в пустую умножать (или фибоначчи расчитывать, как народ делал в прошлый раз), лучше бы кластерный/факторный анализ прогнали бы на данных в пару гектар.. :-))) Вот там бы и было бы видно, кто чего стоит. :-))) Я бы сам такое любопытсва ради забабахал бы, да нигде ничего подходящего в таком объеме не встречалось... :-( А вам может и попадалось ??
Да не впадал я в экстаз, просто настроение хорошее было. =)
LamerOk дело говорит. Твой тест перегружен вводом-выводом. Результаты по времени существенно варьируются от запуска к запуску, от порядка вызова подпрограмм (если через общий мэйн запускать), и по делу ничего не показывают. Посмотри результаты моего выложенного теста по мотивам твоего. Там даже 2 фортрановские реализации с использованием одного и того же компилятора сильно отличаются по эффективности (про сишную я молчу), т.е. твой тезис о том, что любой компилер эту задачу ввиде ее элементарности одинаково соптимизирует, неверен мягко говоря.
И вообще, с чего все началось - может кто-нибудь сделать этот тест (fortranrulez.front.ru/testmatmul.zip) на Blitz++ (виндовым gcc) и выслать мне на fortranrulez@front.ru? Интересно же.