Разница между статическим и динамическим расписанием в 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
.
Ответы
Ответ 1
Проблема в том, что этот код не совместим с OpenMP, а несовместимые программы имеют "неуказанное" поведение. Если вы посмотрите на спецификацию OpenMP API V3.0, раздел 2.5.1 Loop Construct, в описании указано:
Счетчик итераций для каждого связанного цикла вычисляется перед входом в самый внешний петля. Если выполнение любого связанного цикла изменяет любое из значений, используемых для вычисления любая из итераций считается, что поведение неуказано.
Большая разница между типом статического и динамического расписания заключается в том, что при статичности куски могут быть несколько вычислены и запланированы на потоки во время компиляции, а при динамическом - во время выполнения (требуется больше блокировки).
Ответ 2
Разница между типом static
и dynamic
заключается в том, что при static
куски можно предварительно вычислить, а также решить, как запланировано для потоков во время самой компиляции, тогда как при dynamic
то же самое выполняется во время выполнения.
При использовании dynamic
он включает в себя некоторые сложные механизмы, такие как механизм взаимоблокировки, обработка загрузки и т.д.
Вы можете получить дополнительную информацию по адресу: http://openmp.blogspot.com.