Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-将数组划分为线程,并使用并行性查找最大数量_C_Arrays_Multithreading_Openmp_Pragma - Fatal编程技术网

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

C-将数组划分为线程,并使用并行性查找最大数量,c,arrays,multithreading,openmp,pragma,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]

我有一个随机数数组,我需要将它分成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);
    }
#包括
#包括
#包括
#包括
#定义N 10000
int searchMax(int*a,int n){
int max,i;
max=a[0];
#pragma-omp并行
对于(i=0;imax)
max=a[i];
} 
}
返回(最大值);
}
int main(){
int i,arr[N],最大值;
时间;
clock_t tini,tfin;
双tdur;
srand((未签名)时间(&t));
对于(i=0;i最大值)
max=arr[i];
tini=时钟();
max=searchMax(arr,N);
tfin=时钟();
tdur=(双精度)(tfin-tini)/时钟每秒;
printf(“最大数量:%d时间:%lf\n”,最大,tdur);
返回(0);
}

问题是这段代码只划分for循环。我不知道如何将数组划分为线程,并使每个线程都执行for循环。

您可以让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;
}
int searchMax(int*a,int n){
int最大值,i;
#pragma omp并行减少(最大:最大值)
对于(i=0;imaxvalue)
最大值=a[i];
}
返回最大值;
}

Seing如果关键部分生成了所有将放入线程的循环代码,那么并行性的好处将微乎其微。我建议采取分而治之的方法,但即使这样,收益也是微乎其微的。在共享内存并行计算(如OpenMP)中,您不需要跨线程划分阵列-每个线程都有相同的访问权限。在编写代码时,每个线程都会得到自己要处理的
i
值的子集,从而得到
a
的一组元素。现在,请参阅您的教程和参考资料,了解如何使用OpenMP进行缩减(特别是在max运算符上),以及如何了解共享和私有变量。如果我特别需要4个线程来完成这项工作,我是否应该添加num_线程(4)??或者它会导致与任何其他指令冲突吗?如果需要,可以在#pragma子句中添加num_线程(4),因为它们是正交的。然而,这样做会限制并行性的数量——特别是在高内核数处理器上运行时。