C - 将数组划分为线程并使用并行性查找最大数量

时间:2017-11-20 03:24:01

标签: c arrays multithreading openmp pragma

我有一个随机数组,我需要将它分成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循环。

1 个答案:

答案 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;
}