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
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)
C = 0 C [i] [j] = 0; // definir valor inicial da matriz resultante
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
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; }
Tags parallelism core-dump