我无法并行化嵌套的 for 循环。代码看起来像这样
for( k = 0; k < m; k++ ) {
for( i = 0; i < k; i++ ) {
s = 0.0;
#pragma omp parallel for default(none) shared(i, k, q, m, n) private(j) reduction(+:s)
for( j = 0; j < n; j++ ) {
s += q[ i ][ j ] * q[ k ][ j ];
}
}
}
由于在“k”和“i”循环下多次创建和销毁线程时的开销,这段代码可以工作,但运行速度非常慢。
理想情况下我想要这样的东西
#pragma omp parallel default(none) shared(i, k, q, m, n, s) private(j)
for( k = 0; k < m; k++ ) {
for( i = 0; i < k; i++ ) {
s = 0.0;
#pragma omp for reduction(+:s)
for( j = 0; j < n; j++ ) {
s += q[ i ][ j ] * q[ k ][ j ];
}
}
}
并行区域仅创建一次。但是,我得到的结果不正确。我认为这是因为变量 's' 是共享的。
有没有办法让's'共享并仍然执行减少?
谢谢!
PS 我不能并行化“k”或“i”循环,因为它们依赖于以前的迭代。