Разница между статическим и динамическим расписанием в OpenMP в C - PullRequest
12 голосов
/ 24 ноября 2010

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

Первый

#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 ]

15 голосов
/ 03 мая 2011

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

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

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

13 голосов
/ 25 января 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...