прагма OpenMP «master» не должна быть заключена в прагму «parallel for»

Почему компилятор 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.

... отсюда и желание сохранить все обратные вызовы в главном потоке.

Заранее спасибо.

6
задан Sideshow Bob 5 October 2011 в 12:12
поделиться