почему c ++ openMP программа выполняется дольше - PullRequest
0 голосов
/ 21 октября 2019

У меня проблемы с пониманием, как это возможно. У меня длинный текстовый файл (десять тысяч строк), я читаю его в переменную text в виде строки. Я хотел бы разделить его на 200 частей. Я написал этот код с использованием директив openMP:

    std::string str[200];

    omp_set_num_threads(200);
    #pragma omp parallel 
    {
        #pragma omp for
        for (int i=0;i<200;i++)
        {
            str[i]= text.substr(i*(text.length()/200),text.length()/200);
        }
    }

, и его время выполнения составляет 231059 нас

, если я напишу его как последовательность

        for (int i=0;i<200;i++)
        {
            str[i]= text.substr(i*(text.length()/200),text.length()/200);
        }

время выполнения равно215902us

Я использую openMP неправильно или что здесь происходит

1 Ответ

1 голос
/ 21 октября 2019

substr вызывает выделение памяти и memcpy, и не более того. Таким образом, вместо 1 потока, запрашивающего у ОС некоторый ОЗУ, теперь у вас есть N потоков, запрашивающих у ОС некоторое ОЗУ одновременно. Это не очень хороший дизайн.

Разделение рабочей нагрузки для обработки группой потоков имеет смысл, когда рабочая нагрузка сильно загружает ЦП. Это не имеет никакого смысла, когда все эти потоки конкурируют за один и тот же общий ресурс (например, оперативную память). Один поток просто блокирует все остальные, пока не будет завершено каждое выделение.

...