使用OpenMP的数组中的最大值

时间:2016-02-25 13:53:38

标签: concurrency openmp

我必须解决有关OpenMP的练习;这是:

  

编写OpenMP代码(您需要的最小代码片段)   获取一个整数数组(大小为NUM)并填充一个数组B(of   浮点数值B [i] = A [i] / MaxA(MaxA必须计算为   提供的代码的一部分。)

对于最终计算,我会使用

#pragma omp parallel for shared(A,B)
for(int i=0; i<NUM; i++) {
   B[i] = A[i]/MaxA;
}

我怀疑如何利用OpenMP来计算A的最大值。

我想出的唯一想法是使用并行部分来并行化递归最大计算:

第一次调用是在i = 0的情况下进行的; j = sizeOfA - 1

int max(int A[], int i, int j) {

    // Leaves conditions
    switch (j-i) {
        case 1:
        {   if( A[i]>A[j] )
                return A[i];
            else
                return A[j];
        }
                break;
        case 0:
            return A[i];
            break;
    }


    int left, right;
    #pragma omp parallel sections
    {
        #pragma omp section
        {
            left = max( A, i, i+(j-i)*0.5);
        }

        #pragma omp section
        {
            right = max( A, i+(j-i)*0.5+1, j);

        }
    }

    // Nodes conditions
    if( right > left )
        return right;
    else
        return left;

}

你认为这是一个很好的解决方案吗?你能告诉我是否有更好的解决方案/替代方案吗?

1 个答案:

答案 0 :(得分:2)

如何使用reduction子句计算[i,j]之间范围内A的最大值,而不是使用递归计算?

这样的东西
int max(int A[], int i, int j)
{
    int idx;
    int max_val; /* = 0 not needed according to Jim Cownie comment */

    #pragma omp parallel for reduction(max:max_val) 
    for (idx = i; idx < j; idx++)
       max_val = max_val > A[idx] ? max_val : A[idx];

    return max_val;
}