Я только что написал свою первую программу OpenMP, которая распараллеливает простой цикл for. Я запустил код на своем двухъядерном компьютере и увидел некоторое ускорение при переходе от 1 потока к 2 потокам. Однако я запустил тот же код на школьном Linux-сервере и не увидел ускорения. Попробовав разные вещи, я наконец понял, что удаление некоторых бесполезных операторов printf привело к значительному ускорению кода. Ниже представлена основная часть кода, который я распараллелил:
#pragma omp parallel for private(i)
for(i = 2; i <= n; i++)
{
printf("useless statement");
prime[i-2] = is_prime(i);
}
Я предполагаю, что реализация printf имеет значительные накладные расходы, которые OpenMP должен дублировать с каждым потоком. Что вызывает эти накладные расходы и почему OpenMP не может их преодолеть?