编写OpenMP程序,求10000*10000矩阵的均值,并找到矩阵的最大值和最小值,比较共享变量和私有变量。
相关阅读
OpenMP实现求矩阵均值最大值以及最小值
OpenMP实现数据统计
Pthreads实现任务队列
Pthreads实现梯形积分
visual studio 2019配置Pthreads和OpenMP
CodeBlocks 17.12配置Pthreads和OpenMP
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <omp.h>
omp_lock_t mutex;
int Arr[10000][10000];
long long sum1 = 0, sum2 = 0, end_time1, start_time1, end_time2, start_time2;
//#pragma omp threadprivate(sum)
void create_arr(void){
srand(time(0));
for(int i = 0; i < 10000; i++)
for(int j = 0; j < 10000; j++)
Arr[i][j] = rand() % 1000;
}
int main()
{
create_arr();
int min1 = Arr[0][0], min2 = Arr[0][0];
int max1 = Arr[0][0], max2 = Arr[0][0];
start_time1 = clock();
#pragma omp parallel for reduction(+:sum1)
//{
//#pragma omp for
for(int i = 0; i < 10000; i++)
for(int j = 0; j < 10000; j++){
//#pragma omp critical
{
sum1 += Arr[i][j];
if (min1 > Arr[i][j])
min1 = Arr[i][j];
if (max1 < Arr[i][j])
max1 = Arr[i][j];
}
}
//}
end_time1 = clock();
printf("mean = %lld\n",sum1);
printf("max = %d\n", max1);
printf("min = %d\n", min1);
printf("private time = %lf\n", (double)(end_time1-start_time1)/CLK_TCK);//CLOCKS_PER_SEC)
start_time2 = clock();
#pragma omp parallel for
//{
//#pragma omp for
for(int i = 0; i < 10000; i++)
for(int j = 0; j < 10000; j++){
#pragma omp critical
{
sum2 += Arr[i][j];
if (min2 > Arr[i][j])
min2 = Arr[i][j];
if (max2 < Arr[i][j])
max2 = Arr[i][j];
}
}
//}
end_time2 = clock();
printf("mean = %lld\n",sum2);
printf("max = %d\n", max2);
printf("min = %d\n", min2);
printf("share time = %lf\n", (double)(end_time2-start_time2)/CLK_TCK);//CLOCKS_PER_SEC)
return 0;
}