【发布时间】:2016-10-27 15:57:38
【问题描述】:
我需要计算z 的值,将它们推入数组B 和s2。
我尝试使用omp parallel for 并行化处理。
我看到的一个问题是,如果我不将 B[i][j] += z 和 s2[i] += z 语句放在 critical 部分中,我会看到很多 NaN 值正在生成。
只是想知道是否有办法将z 值写入单独的数组(每个线程一个数组)并在最后合并它们。
非常感谢任何帮助。
#pragma omp parallel
{
double z;
#pragma omp parallel for
for(int t=1; t<n; t++) {
double phi_i[N];
double obs_j_seq_t[N];
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
z=phi_i[i]*trans[i*N + j]*obs_j_seq_t[j]*beta[t*N+j]/c[t];
#pragma omp critical
{
B[i][j] += z;
s2[i] += z;
}
}
}
}
}
【问题讨论】:
-
如果可以使用
std::async,为什么还要使用预处理器? -
您是否尝试过为每个
z积累使用omp atomic?这比使用临界区要好得多,特别是在没有冲突的情况下(线程访问不同的位置)。另一方面,您是否试图在所有线程中划分嵌套的 for 循环迭代?目前,每个线程都在并行执行所有迭代。你可以考虑在那里使用#pragma omp for collapse(2)。
标签: c++ multithreading parallel-processing openmp