Нов съм в OpenMP, току-що направих първия си опит, беше матрично умножение. Просто се чудя дали в openMP съществува разделител на блокове по подразбиране? следното е моят код:
#include <stdio.h>
#include <omp.h>
#define MAX_THREADS 4
#define ASIZE 500
int main()
{
/*intialization of 2 matrix*/
long matrixa [ASIZE][ASIZE];
long matrixb [ASIZE][ASIZE];
long matrixc [ASIZE][ASIZE] = {0};
for(int i=0; i<ASIZE; i++)
for(int j=0;j<ASIZE; j++)
{
matrixa [i][j] = 1;
matrixb [i][j] = j;
}
omp_set_num_threads(MAX_THREADS);
#pragma omp parallel
{
long cprivate [ASIZE][ASIZE] = {0};
#pragma omp for
for(int i =0 ;i<ASIZE; i++)
for(int j=0; j<ASIZE; j++)
for(int k=0; k<ASIZE; k++)
cprivate[i][j]+=matrixa[i][k]*matrixb[k][j];
#pragma omp critical
for(int i =0 ;i<ASIZE; i++)
for(int j=0; j<ASIZE; j++)
matrixc[i][j]+=cprivate[i][j];
//#pragma omp barrier
if(omp_get_thread_num() ==0)
for(int i=0; i<50; i++)
printf("Snap of C array %lu \n", matrixc[1][i]); //print out chunk of the first row!
}
}
Мислех, че по този начин, защото независимо дали добавя #pragma omp barrier
или не, мога да получа очаквания резултат, който трябва да бъде резултатът след пълното изпълнение на блока #pragma omp critical
.
въпроси
@ защо няма разлика със или без #pragma omp barrier
Някакви идеи?
@ Също така забелязах, че след като увелича размера на масива до 600 стотици, той ще предупреди за грешка в сегментирането при изпълнение на .o файла. Първоначалното ми предположение беше от диапазона int (промених типа на масива от int[] на long[] ), няма разлика.