У меня есть структура программы, подобная этой:
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?
Edit: используя strace, я вижу lot вызовов sched_yield (). Вероятно, это заставляет меня выглядеть так, будто я много работаю с процессором, но я борюсь с планировщиком за хорошую шаблон планирования.