Por que o aninhamento do programa no OPENMP aumenta o tempo de execução? [fechadas]

0

Eu usei dois programas paralelos diferentes: um é um programa paralelo normal em um openMP para multiplicação de matrizes e outro programa paralelo aninhado em OpenMP O tempo de execução no programa aninhado, onde o número de threads são aumentados, está ficando maior, o que idealmente deve ser menos Meu sistema é de 12 núcleos

Código aninhado: #include

incluir

incluir

incluir

define N 1000

Flutuar A [N] [N], B [N] [N], C [N] [N]; // declarando matrizes de tamanho NxN int main () { / * DECLARANDO VARIÁVEIS / int i, j, m; // índices para multiplicação de matrizes // float t_1; // Medidas de tempo de execução // clock_t c_1, c_2; / PREENCHENDO MATRIZES COM NÚMEROS ALEATÓRIOS / srand (hora (NULL)); para (i = 0; i MATRIX MULTIPLICATION * / printf ("Número máximo de encadeamentos:% i \ n", omp_get_max_threads ()); #pragma omp parallel omp_set_nested (1); // printf ("Número de threads:% i \ n", omp_get_num_threads ()); clock_t c_1 = time (NULL); // medida do tempo: inicie mm // # pragma omp paralelo para private (m, j) // #pragma omp_set_num_threads (8)

pragma omp paralelo para o cronograma (dinâmico, 1) para (i = 0; i

pragma omp paralelo para o cronograma (dinâmico, 1) para (j = 0; j

C = 0 C [i] [j] = 0; // definir valor inicial da matriz resultante

pragma omp paralelo para

para (m = 0; mB [m] [j] + C [i] [j]; } printf ("C:% f \ n", C [i] [j]); } } / TIME MEDIDA + SAÍDA / clock_t c_2 = tempo (NULL); // medida do tempo: fim mm float t_1 = (float) (c_2-c_1); // tempo decorrido para o trabalho em linha printf ("Tempo de execução:% f \ n", t_1); / PROGRAMA DE ENCERRAMENTO * / return 0; }

Normal: #include

incluir

incluir

define N 1000

Flutuar A [N] [N], B [N] [N], C [N] [N]; // declarando matrizes de tamanho NxN int main () {     / * DECLARANDO VARIÁVEIS /     int i, j, m; // índices para multiplicação de matrizes     float t_1; // Medidas de tempo de execução     relógio_t c_1, c_2;     / MATRIZES DE ENCHIMENTO COM NÚMEROS ALEATÓRIOS * /     srand (hora (NULL));     para (i = 0; i

/* MATRIX MULTIPLICATION */
printf("Max number of threads: %i \n",omp_get_max_threads());
pragma omp parallel
printf("Number of threads: %i \n",omp_get_num_threads());
c_1=time(NULL);  // time measure: start mm
pragma omp paralelo para privado (m, j)
// #pragma omp_set_num_threads(8)
for(i=0;i<N;i++) {
    for(j=0;j<N;j++) {
        // }
        C[i][j]=0.; // set initial value of resulting matrix C = 0
        for(m=0;m<N;m++) {
            C[i][j]=A[i][m]*B[m][j]+C[i][j];
        }
        printf("C: %f \n",C[i][j]);
    }
    /* TIME MEASURE + OUTPUT */
    c_2=time(NULL);  // time measure: end mm
    t_1 = (float)(c_2-c_1); // time elapsed for job row-wise
    printf("Execution time: %f \n",t_1);
    /* TERMINATE PROGRAM */
    return 0; } 
    
por Vaishali Aggarwal 03.01.2017 / 07:48

0 respostas