Почему параллельная часть кода работает медленнее последовательной?

Пытаюсь разобраться с OpenMP,пробую распараллелить простой цикл for, но по времени параллельная версия работает хуже/одинаково с версией последовательной. Почему так? Понимаю, что есть расход ресурсов на распараллеливание, но вроде должно при таком объеме данных дать хоть какой-то прирост. Компилирую с ключом -fopenmp (g++ -fopenmp filename.cpp). Был бы также крайне благодарен, если бы кто-то посоветовал хороший гайд по OpenMP.

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <iostream>
#include <chrono>
#define N 100000000
int main(void)
{
    int* a = new int[N]{};
    int* b = new int[N]{};

    auto begin = std::chrono::steady_clock::now();
    #pragma omp parallel
    {
        for (int i =0;i<N;i++)
        {
            a[i] = a[i]+1;
        }
    }
    auto end = std::chrono::steady_clock::now();
    auto elapsed_ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin);
    std::cout << "The time: " << elapsed_ms.count() << " ms\n";

begin = std::chrono::steady_clock::now();
        for (int i =0;i<N;i++)
        {
            b[i] = b[i]+1;
        }
end = std::chrono::steady_clock::now();
elapsed_ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin);
    std::cout << "The time: " << elapsed_ms.count() << " ms\n";
    return 0;
}

Ответы (1 шт):

Автор решения: KoVadim

В Вашем варианте каждая итерация цикла будет запускаться как бы в отдельным подходом. Сама итерация мелкая, поэтому накладные расходы коллосальные. Что делать? Самому сделать вложенный цикл, что бы обрабатывать блоками или использовать #pragma omp for, которая сделает это автоматом. Ваш случай описан здесь https://habr.com/ru/company/intel/blog/85273/

→ Ссылка