мой openmp ржавый, но на ум приходит #pragma omp flush [(list)]
директива flush в openmp может использоваться для идентификации точки синхронизации , которая определяется как точка выполнения программы, где исполняющий поток должен иметь согласованное представление о памяти. Для согласованного представления памяти предъявляются требования 2 : все операции чтения / записи памяти до и после Директива сброса должна выполняться либо до или после . это часто называют забором памяти . Страница 163, параллельное программирование в openmp Чандрой, Дагумом, Кором, Майданом, Макдональдом, Меноном; 2001
И в книге приведено гораздо более подробное описание этого, а также упоминание о переменных, которые не сохраняются в буфере / регистре в любой точке синхронизации, что в соответствии с вашим опубликованным кодом не выполняется.
с очень небольшим количеством отправленного кода, и я не знаю, как и когда вы проверяете vec[i]
, так что это будет мое первое предположение ... а затем проверка версий операционной системы linux, компилятора C и задействованы версии openmp ...
но я не ожидаю, что обновление ОС, обновление компилятора или обновление версии openmp исправят то, что вы испытываете, скорее всего, ваш код
очень похоже на то, что происходит в стандартном C, когда вы делаете printf("hello")
без следующего fflush(stdout)
, когда вы делаете , а не do printf("hello\n")
. \n
приводит к тому, что внутренняя очистка происходит в большинстве всех систем, что считается само собой разумеющимся.