Разница между статическим и динамическим расписанием в 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,

2 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам