У меня есть этот код: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
запускает другой поток, а остальное выполняется в потоке «мастер». Это верно?
Я попытался с помощью 'sections', прежде чем пытаться' single', и я также попытался с помощью 'nowait', я всегда получить тот же результат: моя программа запускает 17 потоков, 7 из них занимают около 12,50% от общего ЦП, даже когда обработка «простаивает». ЦП представляет собой i7 (8 потоков). –
Опубликуйте минимальный тестовый пример, ошибка должна быть где-то в другом месте. – Dikei
Я редактировал код примера в своем сообщении, потому что цикл 'for', который суммирует буферы, должен быть выполнен в основном потоке. Btw, функции 'myFunction()' 'myObject_x' просто выполняют серию очень сложных вычислений и возвращают число, я не думаю, что проблема там, потому что они отлично работают без OpenMP. Просто я не знаю, как каждый цикл 'for' запускается в своем потоке параллельно. –