For inside for-Как сделать inner for parallel, не тратя время на создание потоков

Я новичок в OpenMP и
Я сталкиваюсь с такой ситуацией:

int someArray[ARRAY_SIZE];

//outer loop
for(int i = 0; i < 100; ++i) {

    //inner loop 
    for(int j = 0; i < ARRAY_SIZE; ++i) {
        //calculaations in someArray (every cell can be calculated separately)
    }

    //some code that needs to be run by only one thread - for example sorting someArray
}

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

Мое плохое решение:

int someArray[ARRAY_SIZE];

//outer loop
for(int i = 0; i < 100; ++i) {

    #pragma omp parallel num_threads(THREADS_NUMBER) shared(someArray)
    {
        //inner loop
        #pragma omp for
        for(int j = 0; i < ARRAY_SIZE; ++i) {
            //calculaations in someArray (every cell can be calculated separately)
        }
    }

    //some code that needs to be run by only one thread - for example sorting someArray
}

У вас есть идеи, как оптимизировать эту задачу?

1 ответ

  1. Когда у вас есть двойные циклы for, вы почти всегда хотите распараллелить внешний цикл. В вашем случае:

    #pragma omp parallel for
    for(int i = 0; i < 100; ++i) {
    
        for(int j = 0; i < ARRAY_SIZE; ++i) {
            //calculations in someArray (every cell can be calculated separately)
        }
    
        //some code that needs to be run by only one thread - for example sorting someArray
    }
    

    Если у вас есть 4 ЦП, это разделит 100 итераций на 25 через 4 ЦП. Это намного эффективнее, чем ваш код, который в конечном итоге, для каждой из 100 итераций, разбивает ARRAY_SIZE на ЦП (таким образом, у вас есть 100x накладные расходы).