Keresés

Hirdetés

!! SZERVERLEÁLLÁS, ADATVESZTÉS INFORMÁCIÓK !!
Talpon vagyunk, köszönjük a sok biztatást! Ha segíteni szeretnél, boldogan ajánljuk Előfizetéseinket!

Új hozzászólás Aktív témák

  • pomorski

    őstag

    válasz Silεncε #14870 üzenetére

    +kovisoft

    Köszi mindkettőtöknek, majd ha időm engedi átírom kicsit az ominózus részt. Az "omp critical"-t szoktam használni, de most az sem segített.

  • pomorski

    őstag

    Sziasztok,

    egy kis okosságra/segítségre volna szükségem többszálas (openmp) programozás kapcsán. Adott egy fortran kód, amit mi írtunk, néhányezer soros egyszálas. Kimértük, hogy vannak olyan részek, amik végrehajtása nagyon-nagyon időigényes, ezért kézenfekvő volt az ötlet, hogy párhuzamosítani kellene openmp segítségével az időigényes blokkokat a lehető legtriviálisabb módon. Az egyik ilyen időigényes blokk az alábbi:
    .
    .
    .
    .
    .
    jb=0
    do ib=1,elteres
    do kb=1,mutato(ib)
    jb=jb+1
    jk=0
    do ik=1,elteres
    do kk=1,mutato(ik)
    jk=jk+1
    if (ib.eq.ik)then
    sl_tmp=0._dp
    if(kb.eq.kk)sl_tmp=egyedi_proton_spe(jb,jk,mm/2,n_of_sdet,s)
    if(s(jb)%neutron.eq.s(jk)%neutron.and.kb.ge.kk)then
    sl_tmp1=egyedi_proton_tbint(jb,jk,mm/2,n_of_sdet,s)
    ujhmatp(ib)%hh(kk,kb)=sl_tmp+sl_tmp1
    ujhmatp(ib)%hh(kb,kk)=sl_tmp+sl_tmp1
    endif
    endif
    enddo
    enddo
    enddo
    enddo
    .
    .
    .
    .
    .
    ezt az alábbi módon openmp-sítettem (a legbelső vastag betűvel szedett részt):
    .
    .
    .
    .
    .
    jb=0
    do ib=1,elteres
    do kb=1,mutato(ib)
    jb=jb+1
    jk=0
    do ik=1,elteres

    !$omp parallel &
    !$omp private(kk,sl_tmp,sl_tmp1) &
    !$omp reduction(+:jk)
    !$omp do

    do kk=1,mutato(ik)
    jk=jk+1
    if (ib.eq.ik)then
    sl_tmp=0._dp
    if(kb.eq.kk)sl_tmp=egyedi_proton_spe(jb,jk,mm/2,n_of_sdet,s)
    if(s(jb)%neutron.eq.s(jk)%neutron.and.kb.ge.kk)then
    sl_tmp1=egyedi_proton_tbint(jb,jk,mm/2,n_of_sdet,s)
    ujhmatp(ib)%hh(kk,kb)=sl_tmp+sl_tmp1
    ujhmatp(ib)%hh(kb,kk)=sl_tmp+sl_tmp1
    endif
    endif
    enddo

    !$omp end do
    !$omp end parallel

    enddo
    enddo
    enddo
    .
    .
    .
    .
    .
    de sajnos hülyeséget számol a progi, ha őt -openmp kapcsolóval fordítom le. Ha nem rakom be eme kapcsolót, és a fordító egyszálas üzemmódban fordítja, akkor tökéletes eredményt számol a progi, -csak lassan ugyebár.

    “Ökölszabályként” tudom, hogy ami értéket kap az “private”, ami felösszegződik, annál használni kell a reduction-t. Illetve azt is, tudom, hogy időként szükség van a “shared”-re is. Sok mindent kipróbáltam, de a kód csak nem akar megfelelő lenni többszálas fordítás esetén. Ötlet?

    szerk: Sajnos csak így sikerült beilleszteni a kódot, a formázás eltűnt, bocs.

Új hozzászólás Aktív témák