почему я не могу записывать данные в массив? - PullRequest
0 голосов
/ 06 августа 2020

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

#include <omp.h> 
#include <stdio.h>
int main(){
    int i,tmp;
    int cnt[2]={0};
    int reg[2][5000]={0};
    omp_set_num_threads(32); 
    #pragma omp parallel for private(i,tmp) shared(reg, cnt)
    for(i=0;i<10000;i++)
    {

        if(i%2==1)
        {
            #pragma omp atomic read
            tmp=cnt[1];
            if(tmp<5000)
            {
                #pragma omp atomic write
                reg[1][tmp]=i;
                #pragma omp atomic
                cnt[1]++;
            }
            
        }
        else{
            #pragma omp atomic read
            tmp=cnt[0];
            if(tmp<5000)
            {
                #pragma omp atomic write
                reg[0][tmp]=i;
                #pragma omp atomic
                cnt[0]++;
            }
            
        }
    }
    printf("%d\t%d\n", cnt[0], cnt[1]);
    for(i=0;i<100;i++)
    {
        printf("%d\t%d\n", reg[0][i], reg[1][i]);
    }
    return 0;
}

reg [0] должен содержать только четное число, а reg [1] должен содержать только нечетное число. Но в моем результате многие позиции в реге равны нулю. Я подозреваю, что он не записывает данные в рег. Как исправить код?

1 Ответ

0 голосов
/ 06 августа 2020

Результат заполнения всех элементов reg зависит от последовательного выполнения:

tmp=cnt[1];
[...]
cnt[1]++;

Однако операции atomi c не обеспечивают этого - их может быть несколько tmp получает одно и то же значение, хотя иногда между чтением tmp происходит несколько приращений. Следовательно, не все элементы reg будут заполнены.

В целом, вы можете исправить это, добавив секцию #pragma omp critical вокруг этой области, чтобы никто другой не читал или увеличивал cnt[i] . Однако это требует высокой производительности, и я не идеален для вашего фактического использования.

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