eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingOpenMP - jest szybciej czy wolniej? › Re: OpenMP - jest szybciej czy wolniej?
  • Data: 2012-03-02 16:24:02
    Temat: Re: OpenMP - jest szybciej czy wolniej?
    Od: "slawek" <s...@h...pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]


    Użytkownik "Paweł Kierski" <n...@p...net> napisał w wiadomości grup
    dyskusyjnych:jiqgak$2sv$...@i...gazeta.pl...
    > Zredukuj program do samej pętli zawierające b(i) = a(i)+a(i), puść
    > w obu wersjach. Jeśli wyeliminujesz _wszystko_ inne, a problem będzie
    > nadal, to można podejrzewać implementację OpenMP, system itp. Bez

    Wyniki, w sekundach, są takie jak niżej. Program taki jak jeszcze niżej.

    gfortran -Ofast test-omp.f95 CPU_TIME = 0.20312500
    gfortran test-omp.f95 CPU_TIME = 1.9062500
    gfortran -fopenmp test-omp.f95 CPU_TIME = 7.0000000
    gfortran -Ofast -fopenmp .... CPU_TIME = 1.0625000 - jeżeli
    wątki tworzy się tylko raz (tj. $omp parallel obejmuje CAŁY program)

    Co widać? Że fast-math jest szybka, a nawet bardzo szybka - daje "10-krotne
    przyspieszenie". Natomiast OpenMP
    sucks - wykonanie programu jest ponad 3 razy wolniejsze do "zwykłego" - i
    prawie aż 35 razy wolniejsze niż z fast-math!


    Jak mi się to przekłada? Prawdziwy program (nie test) działał przez około 10
    dni na 16 CPU. Fast math daje efekt
    jakby procesorów było 160. Natomiast z OpenMP liczyłoby się to około 1 rok.

    Nie chce mi się przekładać tego na C/C++, bo intensywnie (tzn. prawdziwy
    program) używa liczb zespolonych itd.
    Jednak ciekawe będzie sprawdzić, jak to wyjdzie w MSVC (wersje od
    Professional wzwyż mają OpenMP). Ewentualnie
    p...ć OpenMP i użyć API Windows (_beginthread() i okolice). Ewentualnie
    zrobić dobry użytek z GPU.



    !***************************************************
    ****************************************************
    ************************
    !
    ! Program test-omp - powinno skompilowac sie kazdym kompilatorem Fortranu 95
    !
    !***************************************************
    ****************************************************
    ************************

    module main


    ! stale matematyczne i fizyczne (CODATA 2006)

    real*8, parameter :: pi =
    3.14159265358979323846264338327950288419716939938D0 ! pi
    real*8, parameter :: epsilon0 =
    8.85418781762038985053656303171075026060837016660D-1
    2 ! przenikalnosc
    elektryczna prozni [F/m]
    real*8, parameter :: c = 299792458.0D0
    ! predkosc swiatla [m/s]

    integer :: n,m;

    ! I/O units

    integer :: input = 11 ! tekstowy wejsciowy plik z danymi
    integer :: output = 12 ! tekstowy wyjsciowy plik z danymi

    contains

    subroutine setup(vec)
    implicit none
    complex*16, intent(out) :: vec(:)
    integer :: i
    do i = 1,n
    vec(i) = pi*c*epsilon0;
    enddo
    end subroutine setup

    subroutine solve(v1,v2)
    implicit none
    complex*16, intent(in) :: v1(:)
    complex*16, intent(out) :: v2(:)
    integer :: i

    !$omp parallel
    !$omp do schedule(static,100)
    do i = 1,n
    v2(i) = v1(i)/c**2 + abs(epsilon0) + pi
    enddo
    !$omp end do
    !$omp end parallel
    end subroutine solve

    end module main

    program testomp

    use main
    implicit none

    real*4 stamp0 ! pomiar czasu - stempel 0
    real*4 stamp1 ! pomiar czasu - stemper 1

    integer, parameter :: nmax = 10000 ! takie duze tablice sa

    complex*16 :: vec(nmax,2)
    integer :: i1,i2,i,j
    complex*16 :: sum


    call cpu_time(stamp0)


    n = 1000
    m = 100000

    if(n.le.nmax) then
    i1 = 1
    i2 = 2

    call setup(vec(:,i1))
    do j = 1,m
    call solve(vec(:,i1),vec(:,i2))
    i1 = mod(i1,2) + 1
    i2 = mod(i2,2) + 1
    enddo
    else
    write(*,*) 'error: dimension(s)'
    endif


    call cpu_time(stamp1)
    write(*,*) 'CPU time = ', stamp1-stamp0

    sum = 0.D0
    do i = 1,n
    sum = sum + 1.D0/(1.D0+vec(i,i1)*vec(i,i1))
    enddo
    write(*,*) 'just for fun ', sum


    end program testomp

    !***************************************************
    ****************************************************
    ************************



Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: