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