1. Это race condition? Почему?
2. как разрулить?
#pragma omp parallel for.
for (int i=2; i < 10; ++i).
{.
fact[i] = i * fact[i-1];.
}.
Да, это
race condition. Используется ячейка массива, которая вычисляется другим потоком. И естественно ячейка может быть использована до того, как туда будет помещено нужное значение. Классика. Этот пример приводит Intel в нескольких своих документах. Я тоже его использовал в статье
Parallel Lint, описывая возможности Intel C++ Compiler (смотри раздел Static Analysis Implemented in Intel C++ Compiler). Кстати, это настолько классический паттерн, что Intel С++ выдает на него предупреждение в режиме /Qdiag-enable:sc-parallel{1|2|3}. Наш анализатор
VivaMP пока молчит, но скоро тоже научится ругаться и на это.
Как исправить. Тут дело сложнее. Самое верное видимо будет избрать другой алгоритм вычисления. Тут аналогия такая. Нет никакого смысла как-то мучиться, пытаясь распараллелить, например, сортировку пузырьком. Просто следует использовать алгоритм параллельной сортировки (см. статью "
Параллельные алгоритмы обработки данных").