有两个连续的循环,第二个循环中有一个减少子句。
#pragma opm parallel
{
#pragma omp for
for (size_t i = 0; i < N; ++i)
{
}
#pragma omp barrier
#pragma omp for reduction(+ \
: sumj)
for (size_t i = 0; i < N; ++i)
{
sumj = 0.0;
for (size_t j = 0; j < adjList[i].size(); ++j)
{
sumj += 0;
}
Jac[i, i] = sumj;
}
}
为了减少创建线程的开销,我想保留线程并在第二个循环中使用它们,但是出现以下错误lib.cpp:131:17: error: reduction variable ‘sumj’ is private in outer context
#pragma omp for reduction(+ \
^~~
如何解决?
最佳答案
我不确定您要做什么,但似乎这样的事情会满足您的期望:
#pragma omp parallel
{
#pragma omp for
for (size_t i = 0; i < N; ++i)
{
}
#pragma omp barrier
#pragma omp for
for (size_t i = 0; i < N; ++i)
{
double sumj = 0.0;
for (size_t j = 0; j < adjList[i].size(); ++j)
{
sumj += 0;
}
Jac[i, i] = sumj;
}
}
在内部循环中出现“omp for”的情况下,reduce将很有用。
关于c++ - openmp两个连续循环,归约子句问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64753313/