Почему компилятор Intel не позволяет мне указать, что некоторые действия в блоке openmp , параллельном для
, должны выполняться только главный поток?
И как я могу сделать то, что я пытаюсь достичь, без такой функциональности?
Я пытаюсь обновить индикатор выполнения с помощью параллельного обратного вызова для:
long num_items_computed = 0;
#pragma omp parallel for schedule (guided)
for (...a range of items...)
{
//update item count
#pragma omp atomic
num_items_computed++;
//update progress bar with number of items computed
//master thread only due to com marshalling
#pragma omp master
set_progressor_callback(num_items_computed);
//actual computation goes here
...blah...
}
Я хочу только главный поток для вызова обратного вызова, потому что, если я не применяю его (например, используя omp critical
вместо этого, чтобы гарантировать, что только один поток использует обратный вызов одновременно), я получаю следующее исключение времени выполнения:
The application called an interface that was marshalled for a different thread.
... отсюда и желание сохранить все обратные вызовы в главном потоке.
Заранее спасибо.