我有一个随机数组,我需要将它分成4个线程,然后使用并行性找到数组中的最大数。我刚接触线程,我对pragma函数知之甚少。但是,我尝试了下一个代码。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <omp.h>
#define N 10000
int searchMax(int *a, int n){
int max, i;
max = a[0];
#pragma omp parallel for
for (i = 0; i < n; i++){
#pragma omp critical
{
if (a[i] > max)
max = a[i];
}
}
return(max);
}
int main(){
int i, arr[N], max;
time_t t;
clock_t tini, tfin;
double tdur;
srand((unsigned) time(&t));
for (i = 0; i < N; i++)
arr[i] = rand();
tini = clock();
max = arr[0];
for (i = 1; i < N; i++)
if (arr[i] > max)
max = arr[i];
tini = clock();
max = searchMax(arr, N);
tfin = clock();
tdur = (double)(tfin - tini) / CLOCKS_PER_SEC;
printf("max number: %d time: %lf\n", max, tdur);
return(0);
}
问题是这段代码只划分for循环。我不知道如何将数组划分为线程,并使每个数组都执行for循环。
答案 0 :(得分:3)
你可以让OpenMP将数组划分为线程,不用担心 - 确定公平,OpenMP会在线程之间划分数组迭代空间而不是数组本身。
我相信你可以在这里使用减少条款,如下所示。通过使用reduction子句 - 在这种特殊情况下 - ,每个线程将保持最大值(进入maxvalue
),并且在并行区域的末尾,它们将从每个线程中找到的值中选择最大值。线。这样,您可以避免使用critical子句,#pragma omp parallel for
将为您分配线程中的数组。
int searchMax(int *a, int n){
int maxvalue, i;
#pragma omp parallel for reduction(max: maxvalue)
for (i = 0; i < n; i++)
{
if (a[i] > maxvalue)
maxvalue = a[i];
}
return maxvlue;
}