【发布时间】:2019-01-07 18:23:41
【问题描述】:
我有一个类似这样的程序结构:
ssize_t remain = nsamp;
while (!nsamp || remain > 0) {
#pragma omp parallel for num_threads(nthread)
for (ssize_t ii=0; ii < nthread; ii++) {
<generate noise>
}
// write noise
out.write(data, nthread*PERITER);
remain -= nthread*PERITER;
}
问题是,当我对其输出进行基准测试时,如果我使用例如:两个线程运行,有时它需要与单个线程相同的时间,有时我会获得 2 倍的加速,感觉就像有某种在我遇到的同步竞争条件中,有时我遇到了它并且事情进展顺利,有时(通常)不是。
有谁知道可能导致这种情况的原因以及在外部 while 循环内并行化一个部分的正确方法是什么?
编辑:使用 strace,我看到 很多 对 sched_yield() 的调用良好的调度模式。
【问题讨论】:
-
总是尝试并行化最外层的循环。看来
while循环和for循环可以合并为一个循环,然后应该并行化。 -
你认为它们可以如何结合?
-
我不明白while循环中
!nsamp这个条件是什么意思。 -
如果我指定 nsamp == 0 我希望它永远循环,直到我 ctrl-c 它
-
看来产生的数据总量是
nsamp,所以一个循环就可以了。如果你想要一个无限循环,无论如何你都应该使用不同的方法。