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 元素的任务。
我正在并行化一个代码,其中数组 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 元素的任务。