Вы установили pr вне параллельной области, а затем сделали pr private, поместив его в предложение private.Это означает, что у каждого потока есть pr, но приватные переменные pr не инициализируются.Используйте firstprivate, а не private для pr, чтобы инициализировать закрытые переменные.
Однако вы ошибаетесь, считая счетчики циклов частными по умолчанию.Счетчик циклов для совместного использования (или канонического) для (т. Е. Переменной i) является частным (раздел 2.4.1 для Construct спецификации OMP V2.0).Но "J" нет.См. Спецификацию OpenMP V2.0 (которую Microsoft поддерживает в VS2008), раздел 2.7.2. Атрибуты общего доступа к данным:
Если переменная видима, когда параллельная или рабочая структуравстречается, и переменная не указана в предложении атрибута общего доступа или директиве threadprivate, тогда переменная является общей.Статические переменные, объявленные в динамическом экстенте параллельной области, являются общими.Распределенная память кучи (например, с помощью malloc () в C или C ++ или оператора new в C ++) используется совместно.(Однако указатель на эту память может быть как личным, так и общим.) Переменные с автоматической продолжительностью хранения, объявленной в динамическом экстенте параллельного региона, являются личными.
Что касается omp_get_num_threads (), возвращающего1, я могу думать только о том, что вы не скомпилировали это с включенным флагом OpenMP.