eGospodarka.pl
eGospodarka.pl poleca

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


    Użytkownik "Edek Pienkowski" <e...@g...com> napisał w
    wiadomości grup dyskusyjnych:jiqqlu$dvn$1...@i...gazeta.pl...
    > Już się ktoś pytał: to na pewno ta pętla? Zmieniałeś jej rozmiar?

    Wysłałem właśnie przykładowy program - są co prawda 4 pętle, ale chyba widać
    o co chodzi.

    !***************************************************
    ****************************************************
    ************************
    !
    ! Program test-omp
    !
    !***************************************************
    ****************************************************
    ************************

    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 do schedule(static,1000)
    do i = 1,n
    v2(i) = v1(i)/c**2 + abs(epsilon0) + pi
    enddo
    !$omp end do
    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
    !$omp parallel

    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
    !$omp end parallel
    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: