#pragma omp flush for exchanging data between threads

Hi, I am writing a very simple example on how to use omp flush for data exchange, in the method producer-> consumer, among the streams I found a funny behavior.

int a=-1;
int flag=1;
int count=0;
#pragma omp parallel  num_threads(2)
{ 
    int TID;
    TID=omp_get_thread_num();
#pragma omp sections 
    {

#pragma omp section /////////// Producer
        {

            for(int i=0; i<9;i++)
            {
                a=i;
#pragma omp flush(a)
                flag=1;
                printf("Producer a: %d  flag:%d  TID %d \n",a,flag,TID);

                while(flag)
                {

#pragma omp flush(flag)

                }

            }
            flag=2;
#pragma omp flush(flag)

        } // end producer

#pragma omp section  /////////// Consumer
        {
            while(1) {
                count++;

                flag=0;
                while(!flag)
                {
#pragma omp flush(flag)
                }
#pragma omp flush(a)
                printf("Consumer a: %d  Flag: %d  count %d TID %d \n",a,flag,count,TID);
                if (flag==2) break; // no more data

            } // end while(1)
        }// end consumer
    }// end sections

: a: 0 flag: 1 TID 0
a: 1 : 1 TID 0
a: 1 : 1 1 TID 1
a: 2 : 1 TID 0
a: 2 : 1 2 TID 1
a: 3 flag: 1 TID 0
a: 3 : 1 3 TID 1
a: 4 flag: 1 TID 0
a: 4 : 1 4 TID 1
a: 5 flag: 1 TID 0
a: 5 : 1 5 TID 1
a: 6 flag: 1 TID 0
: 6 : 1 6 TID 1
a: 7 flag: 1 TID 0
: 7 : 1 - 7 TID 1
a: 8 flag: 1 TID 0
a: 8 : 1 8 TID 1
a: 8 : 2 count 9 TID 1

, , a = 0, . , 1, ..... a: 0 flag: 1 TID 1
a: 0 : 1 1 TID 0
a: 1 : 1 TID 1
a: 1 : 1 2 TID 0
.... ?

..... Ejd () :

int a=-1;
int flag=0;
int count=0;
#pragma omp parallel  num_threads(2)
{ 
int TID;
TID=omp_get_thread_num();
#pragma omp sections 
{
#pragma omp section  /////////// Consumer
    {

        while(1) {
            count++;
            if (flag) printf("Consumer a: %d  Flag: %d  count %d TID %d \n",a,flag,count,TID);
            flag=0;
            while(!flag)
            {
#pragma omp flush(flag)
            }
            if (flag==2) break; // no more data

        } // end while(1)
    }// end consumer

#pragma omp section /////////// Producer
    {
        for(int i=0; i<9;i++)
        {
            a=i;
            printf("Producer a: %d  flag:%d  TID %d \n",a,flag,TID);
            flag=1;
            while(flag)
            {
#pragma omp flush(flag,a)
            }

        }
        flag=2;
#pragma omp flush(flag)

    } // end producer


}// end sections    

. !

+3
1

, , . OpenMP . , . , , , :

a = ...
#pragma omp flush(a)
b = ...
#pragma omp flush(b)

(a) a, (b). .

, , , - .

, . , , .

+5

Source: https://habr.com/ru/post/1794562/


All Articles