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