LINUX.ORG.RU

>> Ч т о т а к о е C I C S ? :-)

Транзакционный монитор. Образца 60-х годов прошлого века.

anonymous
()

>> Ты GNU MP сначала выучи, а потом говори, что на матричных тестах >> фортран делает Cи

Спасибо, я лучше это время посвящу чему-нибудь более приятному. :) И вообще - для того, чтобы убедиться в превосходстве (пардон) меда над дерьмом, не обязательно пробовать на вкус последнее. :) И примеры я уже приводил вообще-то. Умножь мне для начала своими либами 2 матрицы и результаты покажи. :)

anonymous
()

>> Спасибо, я лучше это время посвящу чему-нибудь более приятному

Более приятному? Это типа флейма на Линуксовом форуме, совершенно не зная gcc?

anonymous
()

Я по-прежнему жду от знающих gcc (и совершенно не знающих Фортрана и основ матричных вычислений):

1) бенчмарки, доказывающие преимущества известного кроссплатформенного макроассемблера рубежа 60-70 годов :) над Фортраном в области матричных вычислений.

2) примера с быстрым умножением матриц.

anonymous
()

ЗЫ: числа должны быть вещественными, чтобы вы не очень адресной арифметикой увлекались и чтобы хоть немного было на реальную жизнь похоже.

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

Эй виндузятник фортрановый! У тебя Фортран дает 3.94?

У меня на PIII 800EB icc выдает 3.235!

Иди, удавись - ты смешен! Выучи сначала опции оптимизации icc, а потом снова вылезай народ смешить.

anonymous
()

Оказывается, 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.

Так что иди в детсад. И почитай предметную область, прежде чем спорить. А уж потом развлекай меня в отсутствии Луговского.

ЗЫ: я еще MATMUL не использовал! :)

anonymous
()

Для полноты картины: наилучшее из достигнутых значений (для случая голых циклов без модных фич) есть 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

======

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

Ну Вы и маньяк!

Сразу видно, что Вы большой ученый, прохвессор, наверное.

Фонд Сороса скончался - вот теперь у Вас много свободного времени, для того, чтобы поболтать на LORe.

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

>> Я по-прежнему жду от знающих gcc >> (и совершенно не знающих Фортрана и основ матричных вычислений):

Я не знаю фортрана - мне это не нужно. И ассемблера не знаю - мне Java хватает. Это вы сюда полезли со своим уставом поучать всех.

PS. А вообще мне ваш подход напоминает, извините за оффтопик, то как Микита Михалков попросил в теледебатах Кириенку "Боже царя храни" спеть. И сам начал Микитушка петь, дабы завести Кириенко. Ну и чудачком на букву "м" Микитка выставил себя перед всеми, доложу я вам.

anonymous
()

======

Я не знаю фортрана - мне это не нужно. И ассемблера не знаю - мне Java хватает. Это вы сюда полезли со своим уставом поучать всех.

======

Оказывается, это я всех поучаю? =) Мне тут заявили: "Примеры "плохих" языков: Фортран". ((С) Die-Hard). Я всего лишь попросил проиллюстрировать этот тезис бенчмарками (для матричных вычислений, для эффективной реализации которых и существует Фортран). А в ответ получаю только неконструктивную брань. Так что или бенчмарки, или слова назад. Или тут в основном забавные люди на букву "Л" собрались (я не Линукс в данном случае имею в виду, и даже не Луговского)?

======

PS. А вообще мне ваш подход напоминает, извините за оффтопик, то как Микита Михалков попросил в теледебатах Кириенку "Боже царя храни" спеть. И сам начал Микитушка петь, дабы завести Кириенко. Ну и чудачком на букву "м" Микитка выставил себя перед всеми, доложу я вам.

======

Отчасти вы правы. Я увлекся-таки метанием бисера перед неподобающей публикой. Грешен. :)

2 один из анонимусов: поэтому за результатами можете заходить в соседнюю комнату, а не на форум. =)

anonymous
()

Резюме (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
()
Ответ на: комментарий от anonymous

anonymous (*) (2002-11-29 18:12:13.154):
> Я всего лишь попросил проиллюстрировать этот тезис бенчмарками (для матричных
> вычислений, для эффективной реализации которых и существует Фортран). А в ответ
> получаю только неконструктивную брань.
Ты, извини, все же студент, видимо. Логика твоя - вполне студенческая.

Я не утверждаю, что ты глуп; видно, что это не так. IMHO - типичный околорелигиозный
максималист. Студенты-старшекурсники часто этим грешат :)

0. "Я всего лишь попросил..." - сильно мягко сказано.
1. Ты мешаешь в кучу язык, компилятор и библиотеки.
2. Я повторял твои бенчмарки. Це оказался не медленне Фортрана.
3. Даже если бы доступные реализации компиляторов Фортрана генерили более быстрый
код, нежели цешные (что не так), это НЕ доказывало бы, что язык Фортран лучше языка
Си. Это лишь доказывало бы, что на оптимизацию численных алгоритмов, кодированных на
Фортране, к настоящему времени затрачены бОльшие усилия, чем на оптимизацию численных
алгоритмов, кодированных на Це (что, кстати, имело место быть лет 10 назад).

Die-Hard ★★★★★
()

======

Ты, извини, все же студент, видимо. Логика твоя - вполне студенческая. Я не утверждаю, что ты глуп; видно, что это не так. IMHO - типичный околорелигиозный максималист. Студенты-старшекурсники часто этим грешат :)

======

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

А теперь по пунктам.

======

0. "Я всего лишь попросил..." - сильно мягко сказано.

======

Для эхи, где есть Луговский - вполне себе интеллигентно. :) К тому же вы сами далеко не всегда демонстрируете достаточно вежливости.

======

1. Ты мешаешь в кучу язык, компилятор и библиотеки.

======

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

"Библиотек" же я пока вообще не рассматривал. За исключением функции matmul. Но в контексте Фортрана эти функции являются неотъемлемой частью самого языка (как и ввод-вывод, например.) В отличие от Си, где постоянно подчеркивается ортогональность таких вещей собственно языку. Такая уж терминология, и не я ее придумал. А в случае с matmul (и другими функциями вроде sum, max и т.п.) рассмотрение функции в первую очередь как части языка вполне оправданно. Функция функции рознь. Главное свойство _элементных_ функций для работы с массивами - их элементность. :) Т.е. это просто способ записи (а значит, это понятие языка), позволяющий компилятору генерить более оптимальный код. Берем тот же matmul. Я говорю: язык позволяет эффективно умножить матрицы. И это в данном случае свойство именно языка, а не "библиотек". Потому что компилятор в этом конкретном случае не нуждается в вызове посторонней функции, реализующей ассемблерное перемножение матриц по хитрому алгоритму. Язык (явно говоря, что нужно сделать) просто дает компилятору возможность преобразовать данный вызов в один из шести циклов, который в общем случае является оптимальным по порядку обхода для данной платформы, а не выполнять цикл в заданном программистом порядке. Судя по моим результатам для компаковского компилятора, именно это и происходит. При чем тут "библиотеки"? Да ни при чем! :)

======

2. Я повторял твои бенчмарки. Це оказался не медленне Фортрана.

======

Ты повторял только писанное тобой умножение, даже не удосужившись проверить, является ли конкретный вариант цикла оптимальным ( а лишь отнюдь не по-студенчески заявив, что это вообще не важно :) ). Ты вышеуказанный вариант прогони целиком и запости сюда полный листинг (а еще лучше - выложи прогу в инет; линукс у нас тут тоже имееется). Тогда и поговорим. Если у меня эта прога пойдет с должной скоростью, а именно быстрее, чем за 1,01 секунды.

Реальные же бенчмарки фортрановские, относящиеся к тому же к более объемным задачам, (и единственные приведенные в этом треде защитниками Си) _лучше_ сишных. Сходи на сайт Blitz++ и полюбуйся сам. :)

Так что твой тезис о превосходстве Си по скорости остается недоказанным.

И позволю себе также напомнить, что речь шла не только о скорости (где Си может в принципе приближаться к Фортрану при условии кропотливого многочасового сишного кодирования). А и о том, что даже если ты получишь эти 1,01 секунды, то это дастся тебе куда большим трудом, чем мне, просто записавшему "макроподстановку" matmul.

А если мы сконцентрируемся исключительно на скорости, то matmul при пользовании наиболее перспективного на сегодня интеловского компилятора дает 0,84. Да, здесь, судя по результатам, вызов matmul действительно означает обращение к "библиотекам". Однако воспользуйся плиз _любыми_ сишными языковыми средствами, компиляторами и библиотеками, чтобы хотя бы повторить этот результат. А я посмотрю, сколько времени у тебя это займет, и на что будет внешне похож твой код.

======

3. Даже если бы доступные реализации компиляторов Фортрана генерили более быстрый код, нежели цешные (что не так), это НЕ доказывало бы, что язык Фортран лучше языка Си. Это лишь доказывало бы, что на оптимизацию численных алгоритмов, кодированных на Фортране, к настоящему времени затрачены бОльшие усилия, чем на оптимизацию численных алгоритмов, кодированных на Це (что, кстати, имело место быть лет 10 назад).

======

И этот человек говорит мне, что я что-то с "библиотеками" путаю! :)))

И пока рано еще вам говорить "БЫ". Фортрановские компиляторы генерят-таки более быстрый код, нежели сишные, и примеров этому предостаточно. Вы же пока ни одного законченного и прямо написанного примера не привели, и листингов полных не приводите (дабы можно было проверить, умеете ли вы правильно опции оптимизации задавать).

Эх... жаль, срочная работа у меня. Придется покинуть ваш заповедник по меньшей мере до пятницы. :) :(

anonymous
()

Кстати о птичках - флеймление иногда и пользу приносит. =) По ходу дела качнул последний интеловский компилятор, так он помимо всего прочего очень неплохо работает со ссылками и структурами. Компаковский компилятор (как и практически все другие сегодняшние фортрановские компиляторы) очень сильно уступает Си в этом вопросе, однако с использованием новинки на примерах с вложенными списками удалось достичь производительности уровня мелкософтовского Си, в то время как компаковский компилятор показывает многократное отставание. Интел - рулез! :) Надеюсь, слияние компаковской и интеловской команд разработчиков даст и другие положительные результаты.

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