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

C - Divide array into threads and find max number using parallelism

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

您可以让 OpenMP 为您将数组划分为线程,无需担心 - 公平地说,OpenMP 会将数组迭代 space 划分为线程而不是数组本身。

我相信你可以在这里使用 reduction 子句,如下所示。通过使用 reduction 子句——在这种特殊情况下——,每个线程将保留最大值(进入 maxvalue),并且在并行区域的末尾,它们将从每个线程找到的值中选择最大值线。这样,您就可以避免使用关键子句,#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;
}