>> Ты GNU MP сначала выучи, а потом говори, что на матричных тестах >> фортран делает Cи
Спасибо, я лучше это время посвящу чему-нибудь более приятному. :) И вообще - для того, чтобы убедиться в превосходстве (пардон) меда над дерьмом, не обязательно пробовать на вкус последнее. :) И примеры я уже приводил вообще-то. Умножь мне для начала своими либами 2 матрицы и результаты покажи. :)
Я по-прежнему жду от знающих gcc (и совершенно не знающих Фортрана и основ матричных вычислений):
1) бенчмарки, доказывающие преимущества известного кроссплатформенного макроассемблера рубежа 60-70 годов :) над Фортраном в области матричных вычислений.
Оказывается, gcc уже не надо знать? Быстро вы мнение меняете! :-)
======
Выучи сначала опции оптимизации icc, а потом снова вылезай народ смешить.
======
Почитай сначала Голуба. Который не болтолог. Сколькими способами можно цикл организовать? Какой вариант будет эффективен для Си, какой для Фортрана? Надеюсь, не надо объяснять, почему для объективного сравнения тут надо тыковку напрячь о порядке обхода? :-)
Тот пример я As Is скомпилил. А если цикл переписать хотя бы так:
do i=1, rows
do j=1, rows
val = 0.0
do k=1, cols
val = val + m1(i,k)*m2(k,j)
end do
m3(i,j) = val
end do
end do
, то я получу 2.88.
Так что иди в детсад. И почитай предметную область, прежде чем спорить. А уж потом развлекай меня в отсутствии Луговского.
Для полноты картины: наилучшее из достигнутых значений (для случая голых циклов без модных фич) есть 1.96.
Справедливости ради надо добавить, что первоначальный сишный (как и сиплюсплюсный) тест от пользующего верблюжатину тоже кривоватый. Но это уж пусть другие правят.
======
program main
implicit none
integer :: size = 513
real(8), dimension(:,:), allocatable :: m1, m2, mm
real(4) start, end
call cpu_time(start)
allocate(m1(size,size), m2(size,size), mm(size,size))
call mkmatrix(m1, size, size)
call mkmatrix(m2, size, size)
call mmult(size, size, m1, m2, mm)
call cpu_time(end)
print *, mm(510,510), end-start
end program main
pure subroutine mkmatrix(m, rows, cols)
implicit none
integer, intent(in) :: rows, cols
real(8), dimension(rows, cols), intent(out) :: m
real(8) :: counter
integer :: i, j
counter = 1.0
do i=1, rows
do j=1, cols
counter = counter + 1.0
m(j,i) = counter
end do
end do
end subroutine mkmatrix
pure subroutine mmult(rows, cols, m1, m2, m3)
implicit none
integer, intent(in) :: rows, cols
real(8), dimension(rows, cols), intent(in) :: m1, m2
real(8), dimension(rows, cols), intent(out) :: m3
real(8) :: val
integer :: i, j, k
do i=1, rows
do j=1, rows
val = 0.0
do k=1, cols
val = val + m1(k,j)*m2(i,k)
end do
m3(j,i) = val
end do
end do
end subroutine mmult
======
>> Я по-прежнему жду от знающих gcc >> (и совершенно не знающих Фортрана и основ матричных вычислений):
Я не знаю фортрана - мне это не нужно. И ассемблера не знаю - мне Java хватает. Это вы сюда полезли со своим уставом поучать всех.
PS. А вообще мне ваш подход напоминает, извините за оффтопик, то как Микита Михалков попросил в теледебатах Кириенку "Боже царя храни" спеть. И сам начал Микитушка петь, дабы завести Кириенко. Ну и чудачком на букву "м" Микитка выставил себя перед всеми, доложу я вам.
Я не знаю фортрана - мне это не нужно. И ассемблера не знаю - мне Java хватает. Это вы сюда полезли со своим уставом поучать всех.
======
Оказывается, это я всех поучаю? =) Мне тут заявили: "Примеры "плохих" языков: Фортран". ((С) Die-Hard). Я всего лишь попросил проиллюстрировать этот тезис бенчмарками (для матричных вычислений, для эффективной реализации которых и существует Фортран). А в ответ получаю только неконструктивную брань. Так что или бенчмарки, или слова назад. Или тут в основном забавные люди на букву "Л" собрались (я не Линукс в данном случае имею в виду, и даже не Луговского)?
======
PS. А вообще мне ваш подход напоминает, извините за оффтопик, то как Микита Михалков попросил в теледебатах Кириенку "Боже царя храни" спеть. И сам начал Микитушка петь, дабы завести Кириенко. Ну и чудачком на букву "м" Микитка выставил себя перед всеми, доложу я вам.
======
Отчасти вы правы. Я увлекся-таки метанием бисера перед неподобающей публикой. Грешен. :)
2 один из анонимусов: поэтому за результатами можете заходить в соседнюю комнату, а не на форум. =)
Резюме (fortranrulez.front.ru):
Наилучшее для фортрановских циклов время выполнения: 1.01
При кодировании необходимо проверить 6 возможных циклов.
Любящие Си могут опционально поприменять для каждого из них
правила Голуба - гм... - писателя и прочие \m/ \m/ подходы.
Если они в результате смогут получить то же время - респект!
:)
Время выполнения при использовании встроенной matmul: 1.05
Для кодирования достаточно 1 секунды и одной строчки кода.
Так что успехов вам! Пишите как привыкли, раз вам так легче.
======
PROGRAM TESTMATMUL3
IMPLICIT NONE
INTEGER, PARAMETER :: M = 513, R = 513, N = 513
REAL(8), DIMENSION(:, :), ALLOCATABLE :: A
REAL(8), DIMENSION(:, :), ALLOCATABLE :: B
REAL(8), DIMENSION(:, :), ALLOCATABLE :: C
REAL(4) S, F
INTEGER I, J, K
ALLOCATE( A(M,R), B(R,N), C(M,N) )
K = 1.
DO I = 1, M
DO J = 1, N
K = K + 1
A(I,J) = K
END DO
END DO
K = 1.
DO I = 1, M
DO J = 1, N
K = K + 1
B(I,J) = K
END DO
END DO
CALL CPU_TIME(S)
CALL MATMUL_IJK(A,B,C,M,R,N)
CALL CPU_TIME(F)
PRINT *, 'IJK: ', F-S, C(510,510)
CALL CPU_TIME(S)
CALL MATMUL_JIK(A,B,C,M,R,N)
CALL CPU_TIME(F)
PRINT *, 'JIK: ', F-S, C(510,510)
CALL CPU_TIME(S)
CALL MATMUL_IKJ(A,B,C,M,R,N)
CALL CPU_TIME(F)
PRINT *, 'IKJ: ', F-S, C(510,510)
CALL CPU_TIME(S)
CALL MATMUL_JKI(A,B,C,M,R,N)
CALL CPU_TIME(F)
PRINT *, 'JKI: ', F-S, C(510,510)
CALL CPU_TIME(S)
CALL MATMUL_KIJ(A,B,C,M,R,N)
CALL CPU_TIME(F)
PRINT *, 'KIJ: ', F-S, C(510,510)
CALL CPU_TIME(S)
CALL MATMUL_KJI(A,B,C,M,R,N)
CALL CPU_TIME(F)
PRINT *, 'KJI: ', F-S, C(510,510)
CALL CPU_TIME(S)
C = MATMUL(A,B)
CALL CPU_TIME(F)
PRINT *, ':-): ', F-S, C(510,510)
END PROGRAM
PURE SUBROUTINE MATMUL_KJI(A,B,C,M,R,N)
IMPLICIT NONE
INTEGER, INTENT(IN) :: M, R, N
REAL(8), DIMENSION(M,R), INTENT(IN) :: A(M, R)
REAL(8), DIMENSION(R,N), INTENT(IN) :: B(R, N)
REAL(8), INTENT(OUT), DIMENSION(M,N) :: C(M, N)
INTEGER I, J, K
DO J = 1, N
DO I = 1, M
C(I,J) = 0.
END DO
END DO
DO K = 1, R
DO J = 1, N
DO I = 1, M
C(I,J) = C(I,J) + A(I,K)*B(K,J)
END DO
END DO
END DO
END SUBROUTINE MATMUL_KJI
PURE SUBROUTINE MATMUL_KIJ(A,B,C,M,R,N)
IMPLICIT NONE
INTEGER, INTENT(IN) :: M, R, N
REAL(8), DIMENSION(M,R), INTENT(IN) :: A(M, R)
REAL(8), DIMENSION(R,N), INTENT(IN) :: B(R, N)
REAL(8), INTENT(OUT), DIMENSION(M,N) :: C(M, N)
INTEGER I, J, K
DO J = 1, N
DO I = 1, M
C(I,J) = 0.
END DO
END DO
DO K = 1, R
DO I = 1, M
DO J = 1, N
C(I,J) = C(I,J) + A(I,K)*B(K,J)
END DO
END DO
END DO
END SUBROUTINE MATMUL_KIJ
PURE SUBROUTINE MATMUL_JKI(A,B,C,M,R,N)
IMPLICIT NONE
INTEGER, INTENT(IN) :: M, R, N
REAL(8), DIMENSION(M,R), INTENT(IN) :: A(M, R)
REAL(8), DIMENSION(R,N), INTENT(IN) :: B(R, N)
REAL(8), INTENT(OUT), DIMENSION(M,N) :: C(M, N)
INTEGER I, J, K
DO J = 1, N
DO I = 1, M
C(I,J) = 0.
END DO
END DO
DO J = 1, N
DO K = 1, R
DO I = 1, M
C(I,J) = C(I,J) + A(I,K)*B(K,J)
END DO
END DO
END DO
END SUBROUTINE MATMUL_JKI
PURE SUBROUTINE MATMUL_JIK(A,B,C,M,R,N)
IMPLICIT NONE
INTEGER, INTENT(IN) :: M, R, N
REAL(8), DIMENSION(M,R), INTENT(IN) :: A(M, R)
REAL(8), DIMENSION(R,N), INTENT(IN) :: B(R, N)
REAL(8), INTENT(OUT), DIMENSION(M,N) :: C(M, N)
INTEGER I, J, K
DO J = 1, N
DO I = 1, M
C(I,J) = 0.
END DO
END DO
DO J = 1, N
DO I = 1, M
DO K = 1, R
C(I,J) = C(I,J) + A(I,K)*B(K,J)
END DO
END DO
END DO
END SUBROUTINE MATMUL_JIK
PURE SUBROUTINE MATMUL_IKJ(A,B,C,M,R,N)
IMPLICIT NONE
INTEGER, INTENT(IN) :: M, R, N
REAL(8), DIMENSION(M,R), INTENT(IN) :: A(M, R)
REAL(8), DIMENSION(R,N), INTENT(IN) :: B(R, N)
REAL(8), INTENT(OUT), DIMENSION(M,N) :: C(M, N)
INTEGER I, J, K
DO J = 1, N
DO I = 1, M
C(I,J) = 0.
END DO
END DO
DO I = 1, M
DO K = 1, R
DO J = 1, N
C(I,J) = C(I,J) + A(I,K)*B(K,J)
END DO
END DO
END DO
END SUBROUTINE MATMUL_IKJ
PURE SUBROUTINE MATMUL_IJK(A,B,C,M,R,N)
IMPLICIT NONE
INTEGER, INTENT(IN) :: M, R, N
REAL(8), DIMENSION(M,R), INTENT(IN) :: A(M, R)
REAL(8), DIMENSION(R,N), INTENT(IN) :: B(R, N)
REAL(8), INTENT(OUT), DIMENSION(M,N) :: C(M, N)
INTEGER I, J, K
DO J = 1, N
DO I = 1, M
C(I,J) = 0.
END DO
END DO
DO I = 1, M
DO J = 1, N
DO K = 1, R
C(I,J) = C(I,J) + A(I,K)*B(K,J)
END DO
END DO
END DO
END SUBROUTINE MATMUL_IJK
======
anonymous (*) (2002-11-29 18:12:13.154):
> Я всего лишь попросил проиллюстрировать этот тезис бенчмарками (для матричных
> вычислений, для эффективной реализации которых и существует Фортран). А в ответ
> получаю только неконструктивную брань.
Ты, извини, все же студент, видимо. Логика твоя - вполне студенческая.
Я не утверждаю, что ты глуп; видно, что это не так. IMHO - типичный околорелигиозный
максималист. Студенты-старшекурсники часто этим грешат :)
0. "Я всего лишь попросил..." - сильно мягко сказано.
1. Ты мешаешь в кучу язык, компилятор и библиотеки.
2. Я повторял твои бенчмарки. Це оказался не медленне Фортрана.
3. Даже если бы доступные реализации компиляторов Фортрана генерили более быстрый
код, нежели цешные (что не так), это НЕ доказывало бы, что язык Фортран лучше языка
Си. Это лишь доказывало бы, что на оптимизацию численных алгоритмов, кодированных на
Фортране, к настоящему времени затрачены бОльшие усилия, чем на оптимизацию численных
алгоритмов, кодированных на Це (что, кстати, имело место быть лет 10 назад).
Ты, извини, все же студент, видимо. Логика твоя - вполне студенческая. Я не утверждаю, что ты глуп; видно, что это не так. IMHO - типичный околорелигиозный максималист. Студенты-старшекурсники часто этим грешат :)
======
Что-то ты часто о студенчестве вспоминаешь. Может, сам подсознательно комплексуешь от отсутствия диплома? К тому же некоторые ошибки твои по ходу дискуссии были, пардон, далекими от ошибок опытного специалиста. :) И по поводу максимализма. Не есть ли твое изначальное глобальное утверждение (фортран плохой язык), до сих пор кстати не подкрепленное фактами, истинным образцом максимализма и безапелляционности?
А теперь по пунктам.
======
0. "Я всего лишь попросил..." - сильно мягко сказано.
======
Для эхи, где есть Луговский - вполне себе интеллигентно. :) К тому же вы сами далеко не всегда демонстрируете достаточно вежливости.
======
1. Ты мешаешь в кучу язык, компилятор и библиотеки.
======
Если в чьей-то голове все мешается, не я в этом виноват. Любой желающий думать мог понять, когда и о какой конкретно составляющей шла речь. К тому же абсолютно абстрактно и независимо друг от друга эти вещи рассматривать просто бессмысленно. Есть смысл рассматривать утверждение: какой компилятор для какого языка для конкретной платформы стоит взять, чтобы получить для своей задачи наиболее быстрый код, затратив при этом приемлемое количество времени на кодирование.
"Библиотек" же я пока вообще не рассматривал. За исключением функции matmul. Но в контексте Фортрана эти функции являются неотъемлемой частью самого языка (как и ввод-вывод, например.) В отличие от Си, где постоянно подчеркивается ортогональность таких вещей собственно языку. Такая уж терминология, и не я ее придумал. А в случае с matmul (и другими функциями вроде sum, max и т.п.) рассмотрение функции в первую очередь как части языка вполне оправданно. Функция функции рознь. Главное свойство _элементных_ функций для работы с массивами - их элементность. :) Т.е. это просто способ записи (а значит, это понятие языка), позволяющий компилятору генерить более оптимальный код. Берем тот же matmul. Я говорю: язык позволяет эффективно умножить матрицы. И это в данном случае свойство именно языка, а не "библиотек". Потому что компилятор в этом конкретном случае не нуждается в вызове посторонней функции, реализующей ассемблерное перемножение матриц по хитрому алгоритму. Язык (явно говоря, что нужно сделать) просто дает компилятору возможность преобразовать данный вызов в один из шести циклов, который в общем случае является оптимальным по порядку обхода для данной платформы, а не выполнять цикл в заданном программистом порядке. Судя по моим результатам для компаковского компилятора, именно это и происходит. При чем тут "библиотеки"? Да ни при чем! :)
======
2. Я повторял твои бенчмарки. Це оказался не медленне Фортрана.
======
Ты повторял только писанное тобой умножение, даже не удосужившись проверить, является ли конкретный вариант цикла оптимальным ( а лишь отнюдь не по-студенчески заявив, что это вообще не важно :) ). Ты вышеуказанный вариант прогони целиком и запости сюда полный листинг (а еще лучше - выложи прогу в инет; линукс у нас тут тоже имееется). Тогда и поговорим. Если у меня эта прога пойдет с должной скоростью, а именно быстрее, чем за 1,01 секунды.
Реальные же бенчмарки фортрановские, относящиеся к тому же к более объемным задачам, (и единственные приведенные в этом треде защитниками Си) _лучше_ сишных. Сходи на сайт Blitz++ и полюбуйся сам. :)
Так что твой тезис о превосходстве Си по скорости остается недоказанным.
И позволю себе также напомнить, что речь шла не только о скорости (где Си может в принципе приближаться к Фортрану при условии кропотливого многочасового сишного кодирования). А и о том, что даже если ты получишь эти 1,01 секунды, то это дастся тебе куда большим трудом, чем мне, просто записавшему "макроподстановку" matmul.
А если мы сконцентрируемся исключительно на скорости, то matmul при пользовании наиболее перспективного на сегодня интеловского компилятора дает 0,84. Да, здесь, судя по результатам, вызов matmul действительно означает обращение к "библиотекам". Однако воспользуйся плиз _любыми_ сишными языковыми средствами, компиляторами и библиотеками, чтобы хотя бы повторить этот результат. А я посмотрю, сколько времени у тебя это займет, и на что будет внешне похож твой код.
======
3. Даже если бы доступные реализации компиляторов Фортрана генерили более быстрый код, нежели цешные (что не так), это НЕ доказывало бы, что язык Фортран лучше языка Си. Это лишь доказывало бы, что на оптимизацию численных алгоритмов, кодированных на Фортране, к настоящему времени затрачены бОльшие усилия, чем на оптимизацию численных алгоритмов, кодированных на Це (что, кстати, имело место быть лет 10 назад).
======
И этот человек говорит мне, что я что-то с "библиотеками" путаю! :)))
И пока рано еще вам говорить "БЫ". Фортрановские компиляторы генерят-таки более быстрый код, нежели сишные, и примеров этому предостаточно. Вы же пока ни одного законченного и прямо написанного примера не привели, и листингов полных не приводите (дабы можно было проверить, умеете ли вы правильно опции оптимизации задавать).
Эх... жаль, срочная работа у меня. Придется покинуть ваш заповедник по меньшей мере до пятницы. :) :(
Кстати о птичках - флеймление иногда и пользу приносит. =) По ходу дела качнул последний интеловский компилятор, так он помимо всего прочего очень неплохо работает со ссылками и структурами. Компаковский компилятор (как и практически все другие сегодняшние фортрановские компиляторы) очень сильно уступает Си в этом вопросе, однако с использованием новинки на примерах с вложенными списками удалось достичь производительности уровня мелкософтовского Си, в то время как компаковский компилятор показывает многократное отставание. Интел - рулез! :) Надеюсь, слияние компаковской и интеловской команд разработчиков даст и другие положительные результаты.