C++ omp for 带条件计数器的循环(不是循环索引,不是减少)

C++ omp for loop with conditional counter (not loop index, not a reduction)

我正在并行化一个代码,其中数组 B 的元素是数组 A 的元素的函数。B 小于 A(我提前知道两个大小)并且 B[n] 仅当 A[ n] 满足一定条件。仅当 A[n] 为偶数时,代码的表示形式才将 A[n] 复制到 B[n],例如:

#include<omp.h>
#include<iostream>

bool isEven(int number)
{
    if (number%2 == 0) 
        return true;
    else 
        return false;
}

int main()
{

    int array_length = 100;
    int A [array_length] = {};
    int B [array_length/2] = {};

    // fill A with natural numbers
    for (int a=0; a<array_length; a++)
    {
        A[a] = a;
    } 


    int count = 0;
    #pragma omp parallel for 
    for (int n=0; n<array_length; n++)
    {
        if (isEven(A[n]))
        {
            #pragma omp critical
            {
                count++;
                B[(count-1)] = A[n];
            }
        }
    }


        // print values of b
    std::cout << "B is : " ;
    for (size_t i = 0; i < array_length/2; i++) {
        std::cout << B[i] << ' ';
    }
    std::cout << std::endl;

    return 0;
}

我正在尝试关键编译指示和原子编译指示的几种组合,以及计数增量,但均未成功:计数存在竞争条件,最终结果是 B 中的垃圾。任何人都知道如何制作有用吗?

您说将 A 复制到 B 是您代码的“表示”。如果计算 B 元素确实需要一些工作量,那么您可以让 A 循环按顺序完成,并创建用于计算 B 元素的任务。