使用 OpenMP 通过 c++ list/iterator 并行化两个 for 循环
Parallelize two for loops through c++ list/iterator using OpenMP
我想使用 OpenMP 并行化以下结构:
for (auto it = data.begin(); it != data.end(); ++it)
{
for (vector<my_element>::iterator it2 = it->begin(); it2 != it->end(); ++it2)
{
// code here (it2->process)
}
}
我尝试了不同的方法,但我无法使其正常工作。你能帮帮我吗?
我正在使用 gcc 5.3.0、OpenMP 4.0。到目前为止我尝试过但没有成功的解决方案是:
解决方案 1:
#pragma omp parallel
#pragma omp single
{
for (auto it = data.begin(); it != data.end(); ++it)
{
#pragma omp task firstprivate(it)
for (vector<my_element>::iterator it2 = it->begin(); it2 != it->end(); ++it2)
{
// code here (it2->process)
}
#pragma omp taskwait
}
}
解决方案 2:
#pragma omp parallel
{
for (auto it = data.begin(); it != data.end(); ++it)
{
#pragma omp single nowait
{
for (vector<my_element>::iterator it2 = it->begin(); it2 != it->end(); ++it2)
{
// code here (it2->process)
}
}
}
}
我认为你不应该打电话给 omp taskwait
。
#pragma omp parallel
{
#pragma omp single
{
for (auto it = data.begin(); it != data.end(); ++it)
{
#pragma omp task firstprivate(it)
for (vector<my_element>::iterator it2 = it->begin(); it2 != it->end(); ++it2)
{
// code here (it2->process)
}
}
}
}
我想使用 OpenMP 并行化以下结构:
for (auto it = data.begin(); it != data.end(); ++it)
{
for (vector<my_element>::iterator it2 = it->begin(); it2 != it->end(); ++it2)
{
// code here (it2->process)
}
}
我尝试了不同的方法,但我无法使其正常工作。你能帮帮我吗?
我正在使用 gcc 5.3.0、OpenMP 4.0。到目前为止我尝试过但没有成功的解决方案是:
解决方案 1:
#pragma omp parallel
#pragma omp single
{
for (auto it = data.begin(); it != data.end(); ++it)
{
#pragma omp task firstprivate(it)
for (vector<my_element>::iterator it2 = it->begin(); it2 != it->end(); ++it2)
{
// code here (it2->process)
}
#pragma omp taskwait
}
}
解决方案 2:
#pragma omp parallel
{
for (auto it = data.begin(); it != data.end(); ++it)
{
#pragma omp single nowait
{
for (vector<my_element>::iterator it2 = it->begin(); it2 != it->end(); ++it2)
{
// code here (it2->process)
}
}
}
}
我认为你不应该打电话给 omp taskwait
。
#pragma omp parallel
{
#pragma omp single
{
for (auto it = data.begin(); it != data.end(); ++it)
{
#pragma omp task firstprivate(it)
for (vector<my_element>::iterator it2 = it->begin(); it2 != it->end(); ++it2)
{
// code here (it2->process)
}
}
}
}