在我的代码中,我有循环,我构建和确定线性系统,并尝试解决它:
#pragma omp parallel for
for (int i = 0; i < n[0]+1; i++) {
for (int j = 0; j < n[1]+1; j++) {
for (int k = 0; k < n[2]+1; k++) {
arma::mat A(max_points, 2);
arma::mat y(max_points, 1);
// initialize A and y
arma::vec solution = solve(A,y);
}
}
}
Run Code Online (Sandbox Code Playgroud)
有时,程序会随机挂起,或者解决方案向量中的结果是NaN.如果我这样做:
arma::vec solution;
#pragma omp critical
{
solution = solve(weights*A,weights*y);
}
Run Code Online (Sandbox Code Playgroud)
然后这些问题似乎不再发生了.
当它挂起时,它会这样做,因为有些线程正在等待OpenMP屏障:
Thread 2 (Thread 0x7fe4325a5700 (LWP 39839)):
#0 0x00007fe44d3c2084 in gomp_team_barrier_wait_end () from /usr/lib64/gcc-4.9.2/lib64/gcc/x86_64-redhat-linux-gnu/4.9.2/libgomp.so.1
#1 …Run Code Online (Sandbox Code Playgroud)