Нет результата с использованием openmp - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь добавить все члены массива, используя openmp, таким образом

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
    int v[] ={1,2,3,4,5,6,7,8,9};
    int sum = 0;
    #pragma omp parallel private(v, sum)
    {
        #pragma reduction(+: sum)
        {
            for (int i = 0; i < sizeof(v)/sizeof(int); i++){
                sum += v[i];
            }

        }
    }
    printf("%d\n",sum);
}

Но когда я печатаю sum, результат будет 0

1 Ответ

0 голосов
/ 21 октября 2018

Вы очень озадачены атрибутами совместного использования данных и совместного использования для OpenMP.Этот ответ не пытается научить вас правильно, а лишь дает вам конкретный конкретный пример.

Ваш код не имеет никакого смысла и не компилируется.

Вам не нужно многократное использованиерегионы или тому подобное, и есть только две переменные.v - который определен снаружи, читается всеми и должен быть shared - что это неявно, потому что он определен снаружи.Затем есть sum, который является редукционной переменной.

Кроме того, вам необходимо применить расстановку (for) к циклу.В итоге это выглядит так:

int v[] ={1,2,3,4,5,6,7,8,9};
int sum = 0;
#pragma omp parallel for reduction(+: sum)
for (int i = 0; i < sizeof(v)/sizeof(int); i++){
    sum += v[i];
}
printf("%d\n",sum);

Обратите внимание, что в этом примере есть private переменные.Закрытые переменные очень опасны, потому что они неинициализированы внутри параллельной области, просто не используйте их явно.Если вам нужно что-то локальное, объявите это внутри параллельной области.

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