Подтвердить что ты не робот

Разница между статическим и динамическим расписанием в OpenMP в C

У меня есть два одинаковых кода.

Первая

#pragma omp parallel for shared(g) private(i) schedule(dynamic, 1)
for(i = (*g).actualNumberOfChromosomes; i < (*g).maxNumberOfChromosomes; i++)
{
    AddCrossoverChromosome(g, i); // it doesnt change actualNumberOfChromosomes
    #pragma omp atomic
    (*g).actualNumberOfChromosomes++;
}

Второе

#pragma omp parallel for shared(g) private(i) schedule(static, 1)
for(i = (*g).actualNumberOfChromosomes; i < (*g).maxNumberOfChromosomes; i++)
{
    AddCrossoverChromosome(g, i); // it doesnt change actualNumberOfChromosomes
    #pragma omp atomic
    (*g).actualNumberOfChromosomes++;
}

Единственная разница в первой строке. Первый код работает нормально, но второй сбой. Почему?

Проблема находится где-то в actualNumberOfChromosomes, но я хотел бы понять, почему, а не просто решить это. Я мог бы решить это, создав добавочную переменную p и присвоив ей actualNumberOfChromosomes и изменив цикл так, чтобы i был равен p.

4b9b3361

Ответ 1

Проблема в том, что этот код не совместим с OpenMP, а несовместимые программы имеют "неуказанное" поведение. Если вы посмотрите на спецификацию OpenMP API V3.0, раздел 2.5.1 Loop Construct, в описании указано:

Счетчик итераций для каждого связанного цикла вычисляется перед входом в самый внешний петля. Если выполнение любого связанного цикла изменяет любое из значений, используемых для вычисления любая из итераций считается, что поведение неуказано.

Большая разница между типом статического и динамического расписания заключается в том, что при статичности куски могут быть несколько вычислены и запланированы на потоки во время компиляции, а при динамическом - во время выполнения (требуется больше блокировки).

Ответ 2

Разница между типом static и dynamic заключается в том, что при static куски можно предварительно вычислить, а также решить, как запланировано для потоков во время самой компиляции, тогда как при dynamic то же самое выполняется во время выполнения.

При использовании dynamic он включает в себя некоторые сложные механизмы, такие как механизм взаимоблокировки, обработка загрузки и т.д.

Вы можете получить дополнительную информацию по адресу: http://openmp.blogspot.com.