Сокращение OpenMP с параллельной задачей - PullRequest
0 голосов
/ 25 ноября 2018

Я пытался использовать параллельное задание для выполнения сокращения, но всегда получаю 0. Вот мой код:

int sum = 0;
#pragma omp parallel reduction(+:sum)
#pragma omp single
for(int i=0; i<10; i++)
{
    #pragma omp task
    {
        printf("Thread: %d\n", omp_get_thread_num());
        int y = 5;
        sum += y;
    }
}
printf("%d\n", sum);

Но когда я использую параллельное для, результат правильный, а это 50. Может кто-нибудьподскажите, как изменить код параллельной задачи?Это моя параллель для кода, который хорошо работает:

int sum = 0;
#pragma omp parallel for reduction(+:sum)
for(int i=0; i<10; i++)
{
    printf("Thread: %d\n", omp_get_thread_num());
    int y = 5;
    sum += y;
}
printf("%d\n", sum);

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Dreamcrash ответ на месте.В OpenMP 5.0 добавлена ​​поддержка сокращения задач, но OpenMP 5.0 пока широко не поддерживается, так как только компилятор Intel поддерживает предварительный просмотр OpenMP 5.0, который включает сокращение задач.

Если вам действительно нужно использовать сокращение с задачами с OpenMP, предыдущаядо 5.0, вы можете в основном объявить переменную сокращения как threadprivate и выполнить ручное сокращение, как описано в этом разговоре .

Это будет выглядеть примерно так:

int sum = 0;
int thread_sum = 0;
#pragma omp threadprivate(sum)
#pragma omp parallel
{
    #pragma omp single
    for(int i=0; i<10; i++)
    {
        #pragma omp task
        {
            printf("Thread: %d\n", omp_get_thread_num());
            int y = 5;
            thread_sum += y;
        }
    }
    #pragma omp atomic
    sum += thread_sum
}
0 голосов
/ 25 ноября 2018

Согласно стандарту OpenMP 4.5 нельзя уменьшить переменную, которая используется в конструкторе задач.

Элемент списка, который появляется в предложении сокращения самой внутренней части.доступ к рабочему разделению или параллельной конструкции может быть недоступен в явной задаче.

Тем не менее, похоже, что эта функция будет охватываться OpenMP 5.0.Глядя на ваш код, лучше в действительности использовать параллель с предложением сокращения, в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...