eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingOpenMP - jest szybciej czy wolniej?Re: OpenMP - jest szybciej czy wolniej?
  • Path: news-archive.icm.edu.pl!news.icm.edu.pl!wsisiz.edu.pl!newsfeed2.atman.pl!newsfe
    ed.atman.pl!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-a-01.new
    s.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
    From: "slawek" <s...@h...pl>
    Newsgroups: pl.comp.programming
    References: <4f4feb4d$0$1271$65785112@news.neostrada.pl><jip3ao$9u9$...@n...news.atma
    n.pl><4f501330$0$26703$65785112@news.neostrada.pl><jip477$asl$...@n...new
    s.atman.pl><4f50b4a4$0$26698$65785112@news.neostrada.pl>
    <jiqdm3$dvn$5@inews.gazeta.pl>
    <4f50bea4$0$1268$65785112@news.neostrada.pl>
    <jiqgak$2sv$1@inews.gazeta.pl>
    In-Reply-To: <jiqgak$2sv$1@inews.gazeta.pl>
    Subject: Re: OpenMP - jest szybciej czy wolniej?
    Date: Fri, 2 Mar 2012 17:24:02 +0100
    MIME-Version: 1.0
    Content-Type: text/plain; format=flowed; charset="utf-8"; reply-type=response
    Content-Transfer-Encoding: 8bit
    X-Priority: 3
    X-MSMail-Priority: Normal
    Importance: Normal
    X-Newsreader: Microsoft Windows Live Mail 14.0.8117.416
    X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8117.416
    Lines: 140
    Message-ID: <4f50f420$0$1231$65785112@news.neostrada.pl>
    Organization: Telekomunikacja Polska
    NNTP-Posting-Host: 62.69.202.124
    X-Trace: 1330705440 unt-rea-b-01.news.neostrada.pl 1231 62.69.202.124:64625
    X-Complaints-To: a...@n...neostrada.pl
    Xref: news-archive.icm.edu.pl pl.comp.programming:195916
    [ ukryj 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: