Я новичок в 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
или без #pragma omp barrier
Есть идеи?
@ Я также заметил, что как только я увеличим размер массива до 600 сотен, он предупредит об ошибке сегментации при выполнении файла .o. Мое первоначальное предположение, что это был диапазон int (я изменил тип массива с int[] на long[] ), нет разницы.