2015-01-10 1 views
2

У меня есть этот код:OpenMP: имея полный «для» петли в каждую нить

#pragma omp parallel 
{ 
    #pragma omp single 
    { 
    for (int i=0; i<given_number; ++i) myBuffer_1[i] = myObject_1->myFunction(); 
    } 

    #pragma omp single 
    { 
    for (int i=0; i<given_number; ++i) myBuffer_2[i] = myObject_2->myFunction(); 
    } 
} 

// and so on... up to 5 or 6 of myObject_x 

// Then I sum up the buffers and do something with them 
float result; 
for (int i=0; i<given_number; ++i) 
    result = myBuffer_1[i] + myBuffer_2[i]; 

// do something with result 

Если я запускаю этот код, я получаю то, что я ожидал, но загрузка процессора выглядит довольно высокой. Вместо этого, если я запускаю его нормально без OpenMP, я получаю те же результаты, но использование ЦП намного ниже, несмотря на то, что работает в одном потоке.

Я не хочу указывать количество потоков, я хочу, чтобы программа выбирала максимальное количество потоков в соответствии с возможностями ЦП, но я хочу, чтобы каждый цикл for полностью запускался в своем потоке. Как я могу это сделать?

Кроме того, мое ожидание состоит в том, что цикл for для myBuffer_1 запускает поток, другой цикл for запускает другой поток, а остальное выполняется в потоке «мастер». Это верно?

ответ

0
  1. #pragma omp single имеет неявный барьер в конце концов, вам нужно использовать #pragma omp single nowait, если вы хотите, чтобы два single блока могут работать одновременно.

  2. Однако, для вашего требования, используя section может быть лучшей идеей

    #pragma omp parallel 
    { 
        #pragma omp sections 
        { 
         #pragma omp section 
         { 
          for (int i=0; i<given_number; ++i) myBuffer_1[i] = myObject_1->myFunction(); 
         } 
         #pragma omp section 
         { 
          for (int i=0; i<given_number; ++i) myBuffer_2[i] = myObject_2->myFunction(); 
         } 
        } 
    
    } 
    
+0

Я попытался с помощью 'sections', прежде чем пытаться' single', и я также попытался с помощью 'nowait', я всегда получить тот же результат: моя программа запускает 17 потоков, 7 из них занимают около 12,50% от общего ЦП, даже когда обработка «простаивает». ЦП представляет собой i7 (8 потоков). –

+0

Опубликуйте минимальный тестовый пример, ошибка должна быть где-то в другом месте. – Dikei

+0

Я редактировал код примера в своем сообщении, потому что цикл 'for', который суммирует буферы, должен быть выполнен в основном потоке. Btw, функции 'myFunction()' 'myObject_x' просто выполняют серию очень сложных вычислений и возвращают число, я не думаю, что проблема там, потому что они отлично работают без OpenMP. Просто я не знаю, как каждый цикл 'for' запускается в своем потоке параллельно. –

Смежные вопросы