LINUX.ORG.RU

Оставьте Фортран в покое!

Пусть F77 и ниже заслуживают всяческого фи с точки зрения спецов в теории алгоритмических языков, но!

те, кто хают Фортран думают только о своем тупом комфорте, а о разработчиках компиляторов вы подумали?

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

Так-то, а если работать на ПиСях, то вопросов нет, "обобщать" опять же не надо, уважаемые.

dea
()
Ответ на: комментарий от dea

dea (*) (2002-11-19 15:57:45.965):

> те, кто хают Фортран думают только о своем тупом комфорте, а о разработчиках
> компиляторов вы подумали?
Это cool!

> Автоматическая оптимизация программы на C на суперкомпьютер это застрелиться,
> на Фортране ...
Прикинь, да, - как возможности оптимизации соотносятся с 72-колоночной
автообрезаемой строкой, символом продолжения в 6 колонке, 6-символьными
идентификаторами, implicit декларациями, etc.?

> А если его дополнить небольшим количеством расширений, которые по пальцам
> пересчитать можно, ...
...то хрен его автоматически соптимизируешь.

Вообще, я всегда вручную соптимизирую лучше, чем любой оптимизатор. Лучше
уж я продумаю алгоритм сам, чем поручу компилеру распутывать мои навороты.
Извини, мне так ...э-э-э... комфортнее :)

З.Ы.
Всегда юзеры мешали админам глупостями "о своем тупом комфорте". Теперь, стало
быть, надо еще меньше думать "об этом", чтобы, не дай Бог, не помешать
разработчикам компиляторов ;)

Die-Hard ★★★★★
()

====== > те, кто хают Фортран думают только о своем тупом комфорте, а о разработчиках > компиляторов вы подумали? Это cool!

> Автоматическая оптимизация программы на C на суперкомпьютер это застрелиться, > на Фортране ... Прикинь, да, - как возможности оптимизации соотносятся с 72-колоночной автообрезаемой строкой, символом продолжения в 6 колонке, 6-символьными идентификаторами, implicit декларациями, etc.? ======

Ну вот... а говорил ведь, что Фортран знает. :)

anonymous
()

Ну это ваще ржач!!!

При чем имплиситы и длины имен, когда речь об оптимизации?

anonymous
()
Ответ на: комментарий от anonymous

anonymous (*) (2002-11-19 17:55:56.535):
> При чем имплиситы и длины имен, когда речь об оптимизации?
Вот и я об чем!

При чем ту оптимизация, если мне синаксис не нравится?

Die-Hard ★★★★★
()

======

> При чем имплиситы и длины имен, когда речь об оптимизации? Вот и я об чем!

При чем ту оптимизация, если мне синаксис не нравится?

======

Если синтаксис тебе важнее оптимизации, то нефиг ругать фортран. Весьма у многих приоритеты здесь зеркально противоположные. =)

anonymous
()

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

Так что, Черч рулит форева :)))))

Благо что тут видел сайт об использовании Haskell для квантовых вычислений. Боюсь только, что у физиков мозгов не хватит для Хаскелла :))))) Но программы просто дико впечатляют. Я тут не далее чем полгода назад имел счатстье написать аналог некого фортрановского кода, считающего газодинамику с химкинетикой. Так вот, этот аналог, писанный на С++, был быстрее оригинала, откомпилированного компаковским компиллером на порядк. Причем, в частности, за счет лучшей локализации данных и partial evalution (see expression templates). Причем, код получился на много понятнее, чем фортрановское спагетти :)))

А когда возникла необходимость интегрировать код в AMRный фреймвок Chombo, это было сделано за один человеко-день. Причем, за счет этого фреймвока задача стала прекрасно считаться на MPIном фреймвоке

Так что, фортран - в морг

anonymous
()

====== Я тут не далее чем полгода назад имел счатстье написать аналог некого фортрановского кода, считающего газодинамику с химкинетикой. Так вот, этот аналог, писанный на С++, был быстрее оригинала, откомпилированного компаковским компиллером на порядк. ======

Не верю. Раз сам написал - пример в студию.

anonymous
()

Это код что ли ?

А не жирнова-то будет ? ;) За код денюжку платить надо :) Как-то не прижился GPL в российском научном мире.

А статью, пожалуста. Она в процессе написания. Если дадите свое мыло - могу прислать, когда закончим.

anonymous
()

======

Это код что ли ? А не жирнова-то будет ? ;) За код денюжку платить надо :) Как-то не прижился GPL в российском научном мире.

======

Не сам код, а технически характерный пример. Или слабО?

А насчет денег ты идеалист. Кто тебе заплатит за газодинамику? :)

======

А статью, пожалуста. Она в процессе написания. Если дадите свое мыло - могу прислать, когда закончим.

======

Научные статьи я сам и писал, и читал - знаю что это сегодня такое по своей сущности в 90% случаев. :) Ты по делу говори, бумага-то все стерпит, когда надо отчитываться о проделанной работе. :))

Хотя присылайте конечно. "Посмотрим, какой это Сухов" (С)

anonymous
()
Ответ на: комментарий от anonymous

anonymous (*) (2002-11-20 10:40:41.667):
> Как-то не прижился GPL в российском научном мире.
Ну да, в _российском_ - может быть... -- т.е. те, кто за пределы России носа не
суют, публикуются из принципа в только российских журналах и не знают английского,
часто чахнут над своими поделиями - как бы не увели! - а то уж очень кушать хочется:)

В ("просто") научном мире GPL еще как прижился!

> А статью, пожалуста. Она в процессе написания. Если дадите свое мыло - могу прислать,
> когда закончим.
Не побоишься на халявку слать - буду благодарен за ссылку сюда или на
colonel_b@hotmail.com


Die-Hard ★★★★★
()

За газодинамику в сложном домене ?

Как-то взрыв газовой смеси на буровой вышке ? Как-то платят

Что такое технически характерный пример ?

Отчитываюсь я только перед тем, кто мне поставил задачу

По ходу дела, вычфизика не является источником моего существования, более того, это скорее хобби - т.ч. наезд Die-Hard считаю не обоснованным. Просто лишние пара-тройка тысяч мне не помешают :))) Знаете ли, квартиры в уродском городе МСК стоят неоправдано дорого.

На счет просто научного мира я знаю. Та же Chombo под открытой лицензией. Но вот российская вычислительная физика - это полный мрак. Таких диких отношений я нигде не видел: предательства, подставы, дележка грантов - мрак полнейший :( Слава Богу - я с этими учеными общаюсь лишь косвенно.

Вот математики - совсем другое дело :)))

anonymous
()

====== За газодинамику в сложном домене ? Как-то взрыв газовой смеси на буровой вышке ? Как-то платят ======

Исследуете, как быстро ударная волна дойдет до виллы местного НР? :) Тогда может даже и хорошо платят, не спорю. :)

======

Что такое технически характерный пример ?

======

Показывающий, что на Фортране реализация конкретного численного метода всегда медленнее, чем на С++, ввиду ублюдочности языка Фортран (а не криворукости кодера).

======

Отчитываюсь я только перед тем, кто мне поставил задачу

======

Т.е. за базар не отвечаешь? :)

anonymous
()

Смолл описание для сумневающихся :))

Матричные операции - через реализацию expression templates в Blitz++ (http://www.oonumerics.org/blitz/)

Automatic Mesh Refinemnet и распараллеливание, через Chombo (http://seesar.lbl.gov/anag/chombo/)

Далее газодинамика считается годуновым, а химкинетика по неявной схеме считает вполне очевидное уравнение химкинетики. Считает по отдельности, ибо общая система газодинамики и химкинетики расщепляется по энергии. Далее, согласование шага для годунова и chemsolverа. Послеледний - намного капризнее к шагу, т.к. матрица неявной схемы содержит числа от 10^-30 до 10^5, но это так, лирическое отступление.

Ну что, убедил ?

anonymous
()

Пока не убедил. Лучшего качества "на порядок" в бенчмарках я не нашел. Вот одна типичная фраза: "Blitz++ has a slight edge over F90". А поскольку качество оптимизации у различных компилятором ОЧЕНЬ разное, вполне возможно, что наоборот, будет "F90 has a slight edge over Blitz++". Даже при том же самом исходном коде.

anonymous
()
Ответ на: комментарий от anonymous

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 очевидно - он мощнее, гибче и, с др. стороны,
ближе к ассемблеру.

Die-Hard ★★★★★
()

Оригинальный код компиллися 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ти лет.

anonymous
()

Причем тут "ближе к ассемблеру"? Фортран - язык, нацеленный на матричные операции. Ссылки, например, в нем хоть и есть, но работают медленнее, чем сишные указатели. Ну а массивы - быстрее. Потому что Фортран язык не универсальный, а специализированный.

И вообще я практик. Вот вам очень простой пример: ====== 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.

F:\MyWork\TEST\FROMMAIN>main.exe xorswap_c: 318.508000 XORSWAPDO.f: 375.089000 XORSWAP.f: 148.594000 ======

Сделайте мне на своем Блитце, чтоб быстрее работало. Тогда и поговорим.

anonymous
()

====== оригинал (у меня был его частичный код) представлял из себя спагетти :)), что затрудняло работу branch-предиктора...

Да, кстати, не надо кричать, что оригинал написал горе-программист ======

ГЫ! А что же тогда кричать? :)))

anonymous
()

И вообще, с чего все началось:

======

Так вот, этот аналог, писанный на С++, был быстрее оригинала, откомпилированного компаковским компиллером на порядок.

======

Блитцевские бенчмарки свидетельльствуют, что это не так. Напротив, либо 77, либо 90 Фортран быстрее (в зависимости от задачи).

anonymous
()

Фортран не заточен на матричные операции !

Вы это о чем ??? Он заточен на линейную обработку массивов - не более

> ГЫ! А что же тогда кричать? :)))

Этот человек считал обшивку для Тополь и Тополь-М Это о чем-то говорит ?

anonymous
()
Ответ на: комментарий от anonymous

anonymous (*) (2002-11-20 16:00:33.907):
> Ссылки, например, в нем хоть и есть, но работают медленнее, чем сишные указатели.
> Ну а массивы - быстрее.

Понятно:)

А с какой скоростью работают массивы? И сколько просят за работу?


Die-Hard ★★★★★
()

> И вообще я практик. Вот вам очень простой пример

Что-то задачка практической не кажется :)))

Давайте уж чего-нить более практическое посчитаем :)

Напрмер, рассеяние волны на каком-нить предмете со сложной геометрией в трехмерке. Да и геометрию было бы неплохо брать из autocad/3d max.

Вот и посмторим, что будет быстрее работать, и что будет быстрее написано.

Да, сравнивать бум на хорошем интелле + на каком-нить линуховом кластере

Идет ?

anonymous
()

====== Фортран не заточен на матричные операции ! Вы это о чем ??? Он заточен на линейную обработку массивов - не более ======

А вы хотя бы Меткалфа и Рида читали?

====== Этот человек считал обшивку для Тополь и Тополь-М Это о чем-то говорит ? ======

Это еще не говорит о том, что он это сделал эффективно.

anonymous
()

> Это еще не говорит о том, что он это сделал эффективно

Это говорит, что он много чего сделал и, как поется в песне, "его изделия летают". Кроме того, за 30 лет люди, как правило, учатся эффективно писать

> А вы хотя бы Меткалфа и Рида читали? Нет, кто это такие ?

По ходу дела, под матричные операции APL заточен

anonymous
()

====== Понятно:)

А с какой скоростью работают массивы? И сколько просят за работу? ======

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

anonymous
()

Кстати, по поводу f90

Это уж точно от лукавого :) Эдакая телега с реактивным движком :))))

anonymous
()

Короче:

1) Основываясь на доступных бенчмарках, до предъявления Ваших результатов считаю, что чуда не произошло, и если Фортран конкретно в Вашей медленнее, то именно из-за того, что там "спагетти" (30-летней закалки).

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

За сим позвольте откланяться.

anonymous
()

To последний анонимус:

Вам с ксеона ? :)))

У меня только gnu fortran, так что plz тот же пример в вашем исполнении на f77

anonymous
()

====== У меня только gnu fortran, так что plz тот же пример в вашем исполнении на f77 ======

Вряд ли это можно легко написать на 77. :)

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

anonymous
()

Ээээ

Типа варез ?

Я. конечно, понимаю. Российским ученым не привыкать, но на тестовой машинке софт проверяется, и ворованного там стоять ничего не должно. А покупать... ну... эээ.... бабок как-то жалко :)

anonymous
()

Забыл сказать, что я ожидаю от желающих написать мой пример на Блитце: виндузовый (звиняйте, линуксов сейчас не держим, уж так получилось) экзешник (оптимизированный под третий пень) и исходник. Можно направлять на fortranrulez@front.ru.

anonymous
()

======

Типа варез ?

Я. конечно, понимаю. Российским ученым не привыкать, но на тестовой машинке софт проверяется, и ворованного там стоять ничего не должно. А покупать... ну... эээ.... бабок как-то жалко :)

======

Насколько я помню, lahey триал дает.

anonymous
()

Тады как будет время посмотрим и сравним :)

anonymous
()

Хотя было бы лучше какой-нить жизненный пример

Ну, например, LU-разложение Идет ?

anonymous
()

[уныло]

В прошлый раз писали прогонку. Вот:

Вот то, что я получил ====== /* // 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));

for (i=0; i<n+2; i++) { c[i]=0.0; b[i]=0.0; a[i]=0.0; f[i]=0.0; x[i]=0.0; }; for (i=2; i<=n-1; i++) { c[i]=0.5; a[i]=0.5; b[i]=-c[i]-a[i]; }; c[1]=0.0; a[1]=0.0; b[1]=1.0; f[1]=0.0; c[n]=0.0; a[n]=0.0; b[n]=1.0; f[n]=1.0;

start = clock(); for(it=0; it<maxit; it++) { TDMA(n, c, b, a, f, x); /* Call TDMA maxit times*/ for (i=2; i<=n-1; i++) { c[i]*= 1.0000001; a[i]*=1.0000002; /* Some corrections in coefs */ b[i]=-c[i]-a[i]; }; }; end = clock(); printf(" Matrix Rang %d, N of TDMA Calls: %d\n", n, maxit); printf(" Total Time %f sec, Rate: %f TDMA calls / sec\n Solution:\n", (end-start)/((double)CLOCKS_PER_SEC), 1000*maxit/(((double)(end-start)))); for (i=1; i<=4; i++) printf("x[%d] = %f\n", i, x[i]); for (i=n-3; i<=n; i++) printf("x[%d] = %f\n", i, x[i]); return 0; }

======

и то, что переписал как можно ближе к оригиналу:

====== MODULE TEMPARR REAL(8), DIMENSION(:), ALLOCATABLE :: P, Q END MODULE TEMPARR

SUBROUTINE PROGON(A,B,C,D,XO,N)

USE TEMPARR IMPLICIT NONE

INTEGER, INTENT(IN) :: N REAL(8), DIMENSION(N) :: A, C REAL(8), DIMENSION(N), INTENT(IN) :: B, D REAL(8), DIMENSION(N), INTENT(OUT) :: XO

INTEGER I

IF (A(1) /= 0.) A(1) = 0. IF (C(N) /= 0.) C(N) = 0.

P(1) = -C(1)/B(1) Q(1) = D(1)/B(1)

DO I = 2,N P(I) = -C(I)/(B(I)+A(I)*P(I-1)) Q(I) = -(A(I)*Q(I-1)-D(I))/(B(I)+A(I)*P(I-1)) END DO

XO(N) = Q(N)

DO I = N-1,1,-1 XO(I) = P(I)*XO(I+1)+Q(I) END DO

END SUBROUTINE PROGON

PROGRAM TDMA

USE TEMPARR IMPLICIT NONE

INTEGER, PARAMETER :: N = 2000, MAXIT = 32000 REAL(8), DIMENSION(:), ALLOCATABLE :: C, B, A, F, X

REAL(8) TIME0, DT, RATE INTEGER I

ALLOCATE (C(N+2),B(N+2),A(N+2),F(N+2),X(N+2),P(N+2),Q(N+2))

C(1) = 0. C(2:N-1) = .5 C(N) = 0.

A(1) = 0. A(2:N-1) = .5 A(N) = 0.

F(:N-1) = 0. F(N) = 1.

X = 0.

B(1) = 1. B(2:N-1) = -C(2:N-1) -A(2:N-1) B(N) = 1. CALL CPU_TIME(TIME0)

DO I = 1, MAXIT CALL PROGON(C,B,A,F,X,N) C(2:N-1) = C(2:N-1) * 1.0000001 A(2:N-1) = A(2:N-1) * 1.0000002 B(2:N-1) = -C(2:N-1) -A(2:N-1) END DO

CALL CPU_TIME(DT)

DT = DT - TIME0 RATE = MAXIT / DT

PRINT *, ' Matrix Rang ', N, ' N of TDMA Calls:', MAXIT PRINT *, ' Total Time ', DT, ' sec, Rate: ' , RATE, ' TDMA calls / sec' PRINT *, ' Solution: '

DO I = 1, 4 PRINT '(A,I4,A,E15.9)', ' x(', I, ') = ', X(I) END DO DO I = N-3, N PRINT '(A,I4,A,E15.9)', ' x(', I, ') = ', X(I) END DO

END PROGRAM

======

Результат:

5.45 на compaq fortran и 6.47 на msvc. Линуксовый gcc на аналогичной машине опять показывал что-то среднее, но ближе к msvc.

anonymous
()
Ответ на: комментарий от anonymous

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 

Все равно фортран в заднице!

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


Die-Hard ★★★★★
()

==== Слушай, практик, Я в твой пример навскидку не въехал - форматирование включил б, чтоль? - но не пожалел 20 минут на простейший тест. ====

Просто мы все лишний раз убедились, что Фортрана ты не знаешь. Ты в каком порядке индексы перебираешь? А в каком элементы хранятся?

Так что сам ты в заднице. Пардон. :Р

anonymous
()

И еще:

1) есть стандартная matmul

2) есть операции над массивами

3) для оптимизации массивных операций и циклов нужны разные ключи, во всяком случае в современном компаковском компиляторе. Либо /fast, либо /optimize:5. По разному надо пробовать.

Сишный вы наш =)

anonymous
()

anonymous (*) (2002-11-20 18:42:06.505):
anonymous (*) (2002-11-20 18:50:33.896):
1) Попробуй сам, убедись, что то того, как сидят в памяти массивы, ничего не изменится.
2) Я пробовал ВСЕ ключи.
3) Я про язык, а не про либы/компилеры.

Ладно, завязываю с тобой спорить; видимо, это не лечится :(
"Религия - опиум для народа!"

Die-Hard ★★★★★
()

Совсем-то уж не надо позориться! Очень даже зависит. Код с бенчмарками показать или сам признаешься? :)

И вообще - это ведь только идиоты пишут о столбцово-ориентированных версиях известных алгоритмов для Фортрана. Конечно же, Каханер, Моулер и Нэш идиоты, а Дайхард - рулез форэва! :)))

И вообще, качай и смотри еще один чУдный пример, раз тебе мое форматирование не нравится:

fortranrulez.front.ru/testvector.zip

anonymous
()

Уважаемый Die-Hard.

При виде вашего "кода на Цэ" складывается впечатление, что вы гнусно прикалываетесь. Убедительная просьба более не издеваться над читателями - фортранщики все равно не поймут.

anonymous
()

Фортранщики все поняли, погыгыкали да и выложили на fortranrulez.front.ru/testmatmul.zip

Стыдно должно быть, товарищ! Я думал, вы хоть на Си умеете. Ан нет.

ЗЫ: про то, что вы все перегрузили вводом-выводом, и про то, что в 3-м тысячелетии вы написали register, я молчу. =) Так что выложил более приличный и жизненный вариант теста. И числодробилка у вас хилая какая-то, кстати говоря...

ГЫГЫ:

===

MATMULDO_1: 7.400000

MATMULDO_2: 5.208000

matmulc : 22.212000

===

anonymous
()

Сорри, перевыложил только что без бага. =)

anonymous
()

Анонимусы, во налетели!

Фортраншики все, чтоль? Я всегда подозревал, что только очень недалекие
люди в наше время прутся от фортрана;)

Хотя, сильно сдается мне, что это все - один и тот же "религиозный" анонимус.
Аргументы уж больно ...сильные :) Ты, часом, не студент? Похож на только что
изучившего фортран третьекурсника.

Извини, но на бред мне как-то не досуг отвечать.

Die-Hard ★★★★★
()

Я думаю, всем тут уже ясно что ты обосрался по уши. Так что счастливо оставаться. =)

anonymous
()

И разошлись, как в море корабли...

LamerOk ★★★★★
()

Да, вчера я глупость написАл на Це :(.

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


Короче, вот правильный код:

#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++)
> любой компилер одинаково эффективно странслировать способен.


Die-Hard ★★★★★
()

Die-Hard

Ты не обессудь, что дурацкие вопросы задаю, но не многовато ли у тебя printf'ов для оценки производительности то ?? Да и чем матрицы в пустую умножать (или фибоначчи расчитывать, как народ делал в прошлый раз), лучше бы кластерный/факторный анализ прогнали бы на данных в пару гектар.. :-))) Вот там бы и было бы видно, кто чего стоит. :-))) Я бы сам такое любопытсва ради забабахал бы, да нигде ничего подходящего в таком объеме не встречалось... :-( А вам может и попадалось ??

LamerOk ★★★★★
()

Да не впадал я в экстаз, просто настроение хорошее было. =)

LamerOk дело говорит. Твой тест перегружен вводом-выводом. Результаты по времени существенно варьируются от запуска к запуску, от порядка вызова подпрограмм (если через общий мэйн запускать), и по делу ничего не показывают. Посмотри результаты моего выложенного теста по мотивам твоего. Там даже 2 фортрановские реализации с использованием одного и того же компилятора сильно отличаются по эффективности (про сишную я молчу), т.е. твой тезис о том, что любой компилер эту задачу ввиде ее элементарности одинаково соптимизирует, неверен мягко говоря.

И вообще, с чего все началось - может кто-нибудь сделать этот тест (fortranrulez.front.ru/testmatmul.zip) на Blitz++ (виндовым gcc) и выслать мне на fortranrulez@front.ru? Интересно же.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.