C++, OpenMp

di il
5 risposte

C++, OpenMp

Ciao ragazzi, non riesco a capire perchè la parallelizzazione del ciclo for non fa variare le performances al variare del numero di threads:
-si tratta di un programma che fa la convoluzione 2d di una matrice, se può essere utile, e ripete la convoluzione per k terazioni-

for(int k=0;k<50;k++){

//export OMP_NUM_THREADS

sum =0;


#pragma omp for schedule(static)//nowait
for(int x=0;x<righe;++x){
for( y=0;y<colonne;++y){
for( i=0;i<righe_k;++i){

for(j=0;j<colonne_k;++j){
a = x+i-righe_k/2; if(a<0) a = righe+(x+i-righe_k/2); else if(a>=righe) a = a-righe;
b = y+j-colonne_k/2; if(b<0) b = colonne+(y+j-colonne_k/2); else if(b>=colonne) b = b-colonne;

sum = sum+matr[a]*matr_k2[j];
}

}

temp_matr[x][y] = sum ;

sum=0;
}
}

#pragma omp barrier

#pragma omp for schedule(static)//nowait
for(int x=0;x<righe;++x){
for( z=0;z<colonne;++z){

matr[x][z]=temp_matr[x][z];
}
}

//#pragma omp barrier

}

}

5 Risposte

  • Re: C++, OpenMp

    Come regoli il numero di threads?
    Con la variabile d'ambiente?

    Prova a stamparti il numero di thread prima del ciclo.

    Comunque non funziona!
    Non puo' funzionare!

    Sei sicuro che sum si possa utilizzare cosi'?
  • Re: C++, OpenMp

    Oddio scusa, ho saltato le prime righe della parte parallela del codice:
    P.s. il numero di threads lo seleziono con SET_NUM_THREADS=..

    #pragma omp parallel private(myid, nproc, a, b, sum, z, y, i, j)
    {
    myid= omp_get_thread_num();
    nproc= omp_get_num_threads();


    //if(myid==0) cout<<matr_k[0][0];

    for(int k=0;k<50;k++){

    //export OMP_NUM_THREADS

    sum =0;


    #pragma omp for schedule(static)//nowait
    for(int x=0;x<righe;++x){
    for( y=0;y<colonne;++y){
    for( i=0;i<righe_k;++i){
    //#pragma ivdep //discards any data dependencies assumed by compiler
    // #pragma vector aligned //all data accessed in the loop is properly aligned
    for(j=0;j<colonne_k;++j){
    a = x+i-righe_k/2; if(a<0) a = righe+(x+i-righe_k/2); else if(a>=righe) a = a-righe;
    b = y+j-colonne_k/2; if(b<0) b = colonne+(y+j-colonne_k/2); else if(b>=colonne) b = b-colonne;

    sum = sum+matr[a]*matr_k2[j];
    }

    }

    temp_matr[x][y] = sum ;

    sum=0;
    }
    }

    #pragma omp barrier

    #pragma omp for schedule(static)//nowait
    for(int x=0;x<righe;++x){
    for( z=0;z<colonne;++z){

    matr[x][z]=temp_matr[x][z];
    }
    }

    //#pragma omp barrier

    }

    }
  • Re: C++, OpenMp

    Modifica i post per usare i tag
    , se no, non si capisce nulla.
    
    E che cosa e' [b]SET_NUM_THREADS=..[/b]?
    
    Di sicuro, il numero di thread lo imposti con:
    
    [b]#pragma omp parallel num_threads(N)[/b]
  • Re: C++, OpenMp

    Che vuol dire modifica i post per usare i tag?
    Comunque ho usato export OMP_NUM_THREADS= ..ma anche con ..num_threads(N) non migliora le performances anche se sono sicuro che crea i threads perchè li ho fatti stampare a schermo..
    Scusa la confusione ma stavo dando i numeri dopo un giorno passato a programmare -.-
  • Re: C++, OpenMp

    Il codice lo devi racchiudere tra i tag \[code\] ... \[/code\] (senza '\'!).

    Confronta il tuo codice con questo:
    
    
    #include <stdio.h>
    #include <time.h>
    #include <omp.h>
    #include <pthread.h>
    #include <unistd.h>
    
    long tstamp() {
        time_t ts = time(0);
        return ts;
    }
    
    /*
     * 
     */
    int main(int argc, char** argv) {
        
        long now = tstamp();
        long r;
        int nthreads = 0;
        
        #pragma omp parallel
        {
            nthreads = omp_get_num_threads();
        }
        
        printf("begin [%d] ...\n", nthreads);
        
        #pragma omp parallel
        for(int i=0; i<1; ++i)
        {
            int tflags[24] = { 0 };
            int j;
    
            #pragma omp for 
            for(j=0; j<48; j+=1)
            {
                int tid = omp_get_thread_num();
                if (!tflags[tid]) {
                    tflags[tid] = 1;
                    printf("%d\n", tid);
                }
                
                for(int h=0; h<1000; ++h)
                {
                    for(int k=0; k<100; ++k)
                    {
                        r += (k*h+j*i);
                    }
                }
            }
        }
        
        printf("end in %ld s\n", (tstamp() - now), r);
    
        return 0;
    }
    
    A naso, direi che l' omp for non si trova dentro un blocco omp parallel
Devi accedere o registrarti per scrivere nel forum
5 risposte