Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C++ vs F90, комплексные числа, сравнение скорости 
:(
    Опции темы
kamre
Дата 19.10.2007, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 1
Всего: 13



Вообщем, имеется программа на fortran 90, интенсивно использующая вычисления с комплексными числами. Подумываю переписать ее на C++ и развивать дальше. Программа работает долго, поэтому очень важным критерием является скорость получаемого бинарного кода. Решил сравнить скорость работы с комплексными числами на C++ и на Fortran90, чтобы понять, не упадет ли производительность.

Вот код на Fortran 90:
Код

program test_bessel
  use ifport
  implicit none
  real(8), parameter ::  PI = 3.1415926535897932385d+0, maxArg = 10.0d+0
  integer, parameter :: szA = 13, szB = 12, maxiters = 10000000
  real(8) :: A(szA), B(szB)

  data A / 4.3583898233049950d-18,&
           6.2760813455591930d-16,&
           7.5940584281266230d-14,&
           7.5940584281266240d-12,&
           6.1511873267825650d-10,&
           3.9367598891408420d-08,&
           1.9290123456790120d-06,&
           6.9444444444444440d-05,&
           1.7361111111111110d-03,&
           2.7777777777777780d-02,&
           2.5000000000000000d-01,&
           1.0000000000000000d+00,&
           1.0000000000000000d+00 /

  data B / 1.1291359152578980d+06,&
           1.1265755163570870d+05,&
           1.2482831206172700d+04,&
           1.5549547523260120d+03,&
           2.2114912033081050d+02,&
           3.6640090942382810d+01,&
           7.2674560546875000d+00,&
           1.7944335937500000d+00,&
           5.8593750000000000d-01,&
           2.8125000000000000d-01,&
           2.5000000000000000d-01,&
           1.0000000000000000d+00 /

  complex(8) :: s, z
  real(8) :: r
  integer :: t1, t2, rate, i
  s = 0
  call system_clock(t1, rate)
  do i = 0, maxiters-1
    r = maxArg*i/maxiters
    z = I0(dcmplx(r,r))
    s = s + z
  end do
  call system_clock(t2, rate)
  write(*, *) 's: ', s
  write(*, *) 'time: ', 1.0d+0*(t2-t1)/rate
  
contains
  complex(8) function I0(z)
    implicit none
    complex(8), intent(in) :: z
    complex(8) :: s, x
    integer :: i
    if (abs(z) < 5.0d+0) then
      x = z*z*0.25;
      s = A(1)
      do i = 2, szA
        s = A(i) + x*s
      end do
    else
      x = 0.5d+0/z
      s = B(1)
      do i = 2, szB
        s = B(i) + x*s
      end do
      s = s*exp(z)/sqrt(2.0d+0*PI*z)
    end if
    I0 = s
  end function I0
end program test_bessel


А вот эквивалентная программа на C++, использующая тип std::complex<double>, который является аналогом complex(8) из Fortran 90:
Код

#include <iostream>
#include <complex>
#include <ctime>

using namespace std;

const double PI = 3.1415926535897932385;

enum { szA = 13, szB = 12 };

const double A[szA] = {
  4.3583898233049950E-18,
  6.2760813455591930E-16,
  7.5940584281266230E-14,
  7.5940584281266240E-12,
  6.1511873267825650E-10,
  3.9367598891408420E-08,
  1.9290123456790120E-06,
  6.9444444444444440E-05,
  1.7361111111111110E-03,
  2.7777777777777780E-02,
  2.5000000000000000E-01,
  1.0000000000000000E+00,
  1.0000000000000000E+00
};

const double B[szB] = {
  1.1291359152578980E+06,
  1.1265755163570870E+05,
  1.2482831206172700E+04,
  1.5549547523260120E+03,
  2.2114912033081050E+02,
  3.6640090942382810E+01,
  7.2674560546875000E+00,
  1.7944335937500000E+00,
  5.8593750000000000E-01,
  2.8125000000000000E-01,
  2.5000000000000000E-01,
  1.0000000000000000E+00
};

complex<double> I0(const complex<double> &z)
{
  complex<double> s,x;
  if (abs(z) < 5.0) {
    x = z*z*0.25;
    s = A[0];
    for (int i = 1; i < szA; i++) {
      s = A[i] + x*s;
    }
  } else {
    x = 0.5/z;
    s = B[0];
    for (int i = 1; i < szB; i++) {
      s = B[i] + x*s;
    }
    s *= exp(z)/sqrt(2.0*PI*z);
  }
  return s;
}

int main()
{
  enum { maxiters = 10000000 };
  const double maxArg = 10.0;
  complex<double> s, z;
  double r;
  clock_t a = clock();
  for (int i = 0; i < maxiters; i++) {
    r = maxArg*i/maxiters;
    z = I0(complex<double>(r,r));
    s += z;
  }
  clock_t b = clock();
  cout.precision(15);
  cout << " s: " << s << endl;
  cout << " time: " << (b-a)*1.0/CLOCKS_PER_SEC << endl;
  return 0;
}


Компиляторы используются следующие:
Цитата

g++ (GCC) 4.2.1 (SUSE Linux)
Copyright © 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

и
Цитата

ifort (IFORT) 10.0 20070426
Copyright © 1985-2007 Intel Corporation.  All rights reserved.


Компилирую вот так:
Код

g++ -O3 test_bessel.cpp -o test_bessel

и так:
Код

ifort -O3 test_bessel.f90 -o test_bessel


На моем ноутбуке (Processor (CPU): Intel® Celeron® M CPU 430 @ 1.73GHz) получаются вот такие результаты:
для c++:
Цитата

time: 4.97
time: 4.96
time: 4.97
time: 4.98
time: 4.94
time: 4.94
time: 4.94
time: 4.98
time: 4.98
time: 5.0
average time: 4.966

для fortran:
Цитата

time: 3.6016
time: 3.7884
time: 3.6533
time: 3.6837
time: 3.768
time: 3.8001
time: 3.801
time: 3.7961
time: 3.8362
time: 3.6987
average time: 3.74271


На рабочем компьютере пока еще не тестировал (хотя там только win2k, msvc-2005 и ifort 9.1), но все равно  4.966/3.742 ~= 1.33, т.е. c++ медленнее на 33%. Не слишком ли это много для такой простой программки? Программа на фортране сейчас считает по несколько часов, так что не хотелось бы ухудшить производительность на треть при переходе на c++.
PM MAIL   Вверх
Daevaorn
Дата 19.10.2007, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



А компилятором С++ от Intel почему не протестировали? А то получаютсяне не очень равные условия. Хотя то что фортран быстрее вполне ожидаемо.
PM MAIL WWW   Вверх
kamre
Дата 20.10.2007, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 1
Всего: 13



Цитата(Daevaorn @ 19.10.2007,  23:25)
А компилятором С++ от Intel почему не протестировали? А то получаютсяне не очень равные условия. Хотя то что фортран быстрее вполне ожидаемо.

А почему ожидаемо? Потому что в fortran тип комплексных чисел на уровне компилятора, а в c++ на уровне библиотеки stl?

На самом деле потестировал. Но результаты совсем плохие получились.
Цитата

icpc (ICC) 10.0 20070426
Copyright © 1985-2007 Intel Corporation.  All rights reserved.

Комипилировал так:
Код

 icpc -O3 test_bessel.cpp -o test_bessel

Вот такие результаты:
Цитата

time: 9.77
time: 9.77
time: 9.84
time: 9.76
time: 9.75
time: 9.75
time: 9.75
time: 9.74
time: 9.8
time: 9.74
average time: 9.767


Честно говоря, никогда не разбирался с компилятором для c++ от Intel. Возможно не правильно компилирую...Глянул man, там куча опций для различных оптимизаций...
А с ним должны свои реализации stl идти или нет? 
PM MAIL   Вверх
Ln78
Дата 20.10.2007, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: 13
Всего: 15



Когда-то я тоже такое сравнение проводил, только использовал для фортрана транслятор то ли от MS (вроде именно его), то ли Compaq. Для С++ использовал VS7.0 и C++Builder6.0, сравнивал как стандартный класс complex, так и свой собственный, ещё давно написанный (я, вообще, "изобретатель велосипедов"). Борландовский оказался хуже всех. Для VS обнаружил какую-то непонятную особенность: операция деления комплексных чисел выполнялась на порядок медленнее, например, умножения. Собственная реализация оказалась неуступающей фортрановской, её и оставил для дальнейшего использования, цель сравнения была как раз выяснить, не пора ли её выбросить. Но это было лет 5 назад, сейчас этими задачами не занимаюсь, так что, возможно, сведения устарели.
PM MAIL   Вверх
Daevaorn
Дата 20.10.2007, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(kamre @  20.10.2007,  01:16 Найти цитируемый пост)
Вот такие результаты:

а фортрановый вариант сколько? сранивать надо, один результат С++ ничего не говорит.
PM MAIL WWW   Вверх
kamre
Дата 20.10.2007, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 1
Всего: 13



Цитата(Daevaorn @ 20.10.2007,  08:35)
Цитата(kamre @  20.10.2007,  01:16 Найти цитируемый пост)
Вот такие результаты:

а фортрановый вариант сколько? сранивать надо, один результат С++ ничего не говорит.

В смысле сколько? В первом же посте есть время для Intel Fortran. А это я просто ту самую c++ программку скомпилировал компилятором Intel c++. 
PM MAIL   Вверх
nickless
Дата 20.10.2007, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



kamre, может стоит поискать специализированную либу для математических вычислений, а не переписывать кучу кода на С++? Библиотеки скорее всего неплохо оптомизированы, может ассемблером или тем же фортраном smile 
Я правда такими либами ни разу не пользовался, могу только предложить соответствующий раздел портажей Gentoo, в Suse все эти либы скорее всего тоже есть.


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
kamre
Дата 20.10.2007, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 1
Всего: 13



Цитата(nickless @ 20.10.2007,  15:39)
kamre, может стоит поискать специализированную либу для математических вычислений, а не переписывать кучу кода на С++? Библиотеки скорее всего неплохо оптомизированы, может ассемблером или тем же фортраном smile 
Я правда такими либами ни разу не пользовался, могу только предложить соответствующий раздел портажей Gentoo, в Suse все эти либы скорее всего тоже есть.


nickless, пока "куча кода" на фортране не такая уж и большая, и вполне обозримая. В ней не используются никакие сторонние библиотеки. Просто если развивать этот код дальше, то мне кажется, что переход на c++ может дать некоторые преимущества. Но если при таком переходе сильно просядет производительность откомпилированной программы (раза в 1.5 и более), то это не очень оправданный переход.

Подскажите, какие-нибудь интересные сравнения в интернете на тему производительности кода на Fortran 90 и на С++.
Пока у меня в гугле что-то старенькое все находится и не очень по теме.
PM MAIL   Вверх
kamre
Дата 22.10.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 1
Всего: 13



Сравнил на работе. 
Процессор: Intel® Pentium® 4 CPU 3.00GHz.
Вот такие результаты вышли:
Цитата

ifort /?:
  Intel® Fortran Compiler for 32-bit applications, Version 9.1 Build 20060927Z Package ID: W_FC_C_9.1.032
  Copyright © 1985-2006 Intel Corporation.  All rights reserved.
ifort /O3:
  time:  3.406
  time:  3.406
  time:  3.391
  time:  3.406
  time:  3.406
  time:  3.391
  time:  3.406
  time:  3.391
  time:  3.407
  time:  3.391
  average time: 3.4001

Цитата

cl /?:
  Microsoft ® 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
  Copyright © Microsoft Corporation.  All rights reserved.
cl /O2:
  time:  12.656
  time:  12.671
  time:  12.671
  time:  12.718
  time:  12.687
  time:  12.656
  time:  12.671
  time:  12.703
  time:  12.656
  time:  12.687
  average time: 12.6776

Цитата

g++ --version:
  g++.EXE (GCC) 3.4.2 (mingw-special)
  Copyright © 2004 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.  There is NO
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
g++ -O3:
  time:  10.0
  time:  10.0
  time:  10.0
  time:  10.0
  time:  10.031
  time:  10.031
  time:  10.015
  time:  9.984
  time:  10.0
  time:  9.984
  average time: 10.0045


Это сообщение отредактировал(а) kamre - 22.10.2007, 14:24
PM MAIL   Вверх
SergeCpp
Дата 22.10.2007, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 15
Всего: 124



Technical Report on C++ Performance
(Note this document from Bjarne Stroustrup's Home Page)

PDF, 189 pages, 1.2 megs

The aim of this report is:
• to give the reader a model of time and space overheads implied by use of
various C++ language and library features,
• to debunk widespread myths about performance problems,
• to present techniques for use of C++ in applications where performance
matters, and
• to present techniques for implementing C++ Standard language and library
facilities to yield efficient code.
As far as run-time and space performance is concerned, if you can afford to use C for
an application, you can afford to use C++ in a style that uses C++’s facilities
appropriately for that application.

This report first discusses areas where performance issues matter, such as various
forms of embedded systems programming and high-performance numerical
computation. After that, the main body of the report considers the basic cost of using
language and library facilities, techniques for writing efficient code, and the special
needs of embedded systems programming.

Complex Arithmetic: In the Intersection of C and C++
Цитата
Many of C99's features came from extensions that vendors had made to their C compilers to permit FORTRAN programmers to move to C. A case in point: Cray Research had FORTRAN programmers who wished to be C programmers, but they needed FORTRAN's support for complex numbers.


The Standard Librarian: Complex Numbers


Это сообщение отредактировал(а) SergeCpp - 22.10.2007, 16:01
PM MAIL WWW ICQ   Вверх
SergeCpp
Дата 22.10.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 15
Всего: 124



Template metaprogramming

Blitz++

Цитата
Blitz++ is a C++ class library for scientific computing which provides performance on par with Fortran 77/90.
It uses template techniques to achieve high performance.


Blitz++ examples, also look at FFT implementation

PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0844 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.