Прежде всего, OpenMP не может волшебным образом определить зависимость от вашего кода.Вы несете ответственность за правильность кода для распараллеливания.
Для безопасного распараллеливания цикла for func
не должно иметь зависимостей потока, переносимых в цикле , или зависимости между итерациямиособенно для чтения-после-записи.Кроме того, вы должны проверить, что нет статических переменных.(На самом деле, в этом коротком ответе гораздо сложнее записать условия безопасного распараллеливания.)
Ваше описание func
говорит о том, что func
запишет переменную в другое место.Если это так, вы можете безопасно распараллелить, поставив pragma omp parallel for
, если другие вычисления не зависят от запрета распараллеливания.
Ваш прототип func
: func(int i, int client_num, const vector<int>& vec)
Существует vector
, но это константа, поэтому vec
не должно иметь никакой зависимости.Одновременное чтение из разных потоков безопасно.
Однако вы говорите, что вывод отличается.Это означает, что что-то было не так.Невозможно сказать, в чем проблемы.Показ прототипа функции никогда не помогает;нам нужно знать, какие вычисления выполняются func
.
Тем не менее, некоторые шаги для диагностики:
- Проверьте зависимость в вашем коде.Вы не должны иметь зависимости, показанные ниже.Обратите внимание, что массив
A
имеет зависимость переноса цикла, которая предотвратит распараллеливание:
for (int k = 1; k <N; ++k) A[k] = A[k-1]+1;
- Проверка
func
является повторно входящей или поточно-ориентированной,В основном статические и глобальные переменные могут убить ваш код.Если это так, вы можете решить эту проблему путем приватизации .В OpenMP вы можете объявить эти переменные в предложении private
.Также в OpenMP есть threadprivate
прагма.