Flush construct

Flush construct is used to update data in memory so other threads see the newest value, and guarantee all threads have the same view of the data. Its definition is like this:

#pragma omp flush [(list)] new-line

Check following example:

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

int main(void)
{    
    int a = 100;

    #pragma omp parallel for
    for (int i = 0; i < 2; i++)
    {
        if (0 == omp_get_thread_num())
        {
            a++;
            #pragma omp flush
        }
        else
        {
            sleep(1);
            printf("a is %d\n", a);
        }
    }

    return 0;
}

The master thread uses "#pragma omp flush" so the second thread always gets 101 from a's memory. Check the assembly code of the program:

    ......
    movq    -40(%rbp), %rax
    movl    (%rax), %eax
    leal    1(%rax), %edx
    movq    -40(%rbp), %rax
    movl    %edx, (%rax)
    mfence
    ......

We can see "#pragma omp flush" is converted to mfence instruction in x86 platform.

results matching ""

    No results matching ""