Difference between target and target openMP data?

The target construct offloads the area of ​​code from the host to the target device. The variables p, v1, v2is clearly displayed on the target device using the proposals map. target data also do the same

Then what is meant:

  • "The design creates variables that will be preserved throughout the entire target data area."
  • "Creating a new device data environment"

in relation to the design of the "target data",

I mean, what differences exist in the unloading mechanism between these codes:

void vec_mult1(float *p, float *v1, float *v2, int N)
{
    int i;
    init(v1, v2, N);
#pragma omp target map(to: v1[0:N], v2[:N]) map(from: p[0:N])
#pragma omp parallel for
    for (i=0; i<N; i++)
        p[i] = v1[i] * v2[i];
    output(p, N);
}


void vec_mult2(float *p, float *v1, float *v2, int N)
{
    int i;
    init(v1, v2, N);
#pragma omp target device(mic0) data map(to: v1[0:N], v2[:N]) map(from: p[0:N])
    {
    //this code runs on accelerator card
#pragma omp target //if we omit it what difference will it make ? 
#pragma omp parallel for
        for (i=0; i<N; i++)
            p[i] = v1[i] * v2[i];
    }
    output(p, N);
}

void vec_mult3(float *p, float *v1, float *v2, int N)
{
    int i;
    init(v1, v2, N);
#pragma omp target data map(to: v1[0:N], v2[:N]) map(from: p[0:N])
    {

        //target construct omitted
#pragma omp parallel for
        for (i=0; i<N; i++)
            p[i] = v1[i] * v2[i];
    }
    output(p, N);
}

I tried to execute them, but I can not notice the significant differences between them.

+4
2

target data , . . , , , .

:

int data[N];

#pragma omp target
#pragma omp for
for (int i = 0; i < N; i++)
   data[i] *= 2;

// Do something else

#pragma omp target
#pragma omp for
for (int i = 0; i < N; i++)
   data[i] += 5;

target . data tofrom. , :

  • data
  • data
  • // Do something else
  • data
  • data

, // Do something else data, . data 5 - , 2. target data. , , target. :

int data[N];

#pragma omp target data map(tofrom: data)
{
   #pragma omp target
   #pragma omp for
   for (int i = 0; i < N; i++)
      data[i] *= 2;

   #pragma omp target update from(data)

   // Do something else

   #pragma omp target
   #pragma omp for
   for (int i = 0; i < N; i++)
      data[i] += 5;
}

target , target data ( , ). , :

  • data
  • data
  • // Do something else
  • data

data // Do something else, target data, target update 3.

, OpenMP, / .

+4

#pragma omp target data , - . #pragma omp target .

, :

  • vec_mult1 vec_mult2 ;
  • vec_mult3 , .
+1

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


All Articles