OpenMP. Нетривиальный случай

85
03 сентября 2019, 03:30

Аналог реальной программы. Как переместить создание потоков (#pragma omp parallel) в main_, но оставить funcSerial однопоточным (последовательным)? funcSerial я распараллеливать пробовал - толку мало. В реальной программе там идет очень интенсивный обмен с памятью, и более чем в два раза она не ускоряется на любом количестве ядер.

   double funcPar()
    {
        double sum[] = { 0, 0, 0, 0 };
    #pragma omp parallel
        {
    #pragma omp for
            for (int i = 0; i < 4; i++)  //loop body should be parallel (multy-threaded)
            {
                auto a = (double)i;
                sum[i] += sin(a)*cos(a); // real code is more complicated and works much longer
            }
        }//omp parallel
        return sum[0] + sum[1] + sum[2] + sum[3];
    }
    double funcSerial() //function should remain serial (single-threaded)
    {
        int K = 5000;
        double sum = 0.0;
        for (int k = 0; k < K; k++)
        {
            sum += funcPar();
        }
        return sum;
    }
    void main_() // //function body should remain serial (single-threaded)
    {
        int J = 1000;
        double sum = 0.0;
        for (int j = 0; j < J; j++)
        {
            sum += funcSerial();
        }
        printf("\n\n sum = %f \n", sum);
    }
READ ALSO
Запуск сервера на C++ Visual Studio [закрыт]

Запуск сервера на C++ Visual Studio [закрыт]

Запускаю локальный отладчик Windows(x86)

123
std::move для объекта, возвращенного функцией

std::move для объекта, возвращенного функцией

Имеется один файл maincpp, в котором определены две глобальные функции getSomeResultFromSomeFunc(), processResult() и функция main():

99
Доступ к файлу proc//mem

Доступ к файлу proc//mem

При прохождении одного из онлайн тестов наткнулся на сложный вопросВопрос формулируется примерно так:

119
Как спарсить строку?

Как спарсить строку?

Есть строка вида: "40 1234567 12"

139