OpenMP: полный цикл for для каждого потока

У меня есть этот код:

#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;></given_number;>
<p>Если я запустил этот код, я получаю то, что ожидаю, но использование процессора выглядит довольно высоким. Вместо этого, если я запускаю его нормально без OpenMP, я получаю те же результаты, но использование ЦП значительно ниже, несмотря на то, что выполняется в одном потоке.</p> <p>Я не хочу указывать количество потоков, я хочу, чтобы программа выбрала максимальное количество потоков в соответствии с возможностями ЦП, но я хочу, чтобы каждый цикл <code>for выполнялся целиком в своем потоке. Как я могу это сделать?

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

1 ответ

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

  • Однако для вашего требования использование 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(); } }
    }
    </given_number;></given_number;>

licensed under cc by-sa 3.0 with attribution.