mirror of
https://github.com/OpenMP/Examples.git
synced 2025-04-07 23:22:11 +01:00
53 lines
1.1 KiB
C
53 lines
1.1 KiB
C
/*
|
|
* @@name: target_ptr_map.2c
|
|
* @@type: C
|
|
* @@compilable: yes
|
|
* @@linkable: yes
|
|
* @@expect: success
|
|
*/
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#define N 100
|
|
|
|
#pragma omp declare target
|
|
int *p;
|
|
extern void use_arg_p(int *p, int n);
|
|
extern void use_global_p( int n);
|
|
#pragma omp end declare target
|
|
|
|
int main()
|
|
{
|
|
int i;
|
|
p = (int *)malloc(sizeof(int)*N);
|
|
|
|
#pragma omp target map(p[:N]) // device p attached to array section
|
|
{
|
|
for (i=0; i<N; i++) p[i] = i;
|
|
use_arg_p(p, N);
|
|
use_global_p(N);
|
|
} // value of host p is preserved
|
|
|
|
printf(" %3.3d %3.3d\n", p[1], p[N-1]);
|
|
// 003 297 <- output
|
|
|
|
free(p);
|
|
return 0;
|
|
}
|
|
|
|
//#pragma omp declare target (optional here because of prototype spec)
|
|
void use_arg_p(int *q, int n)
|
|
{
|
|
int i;
|
|
for (i=0; i<n; i++)
|
|
q[i] *= 2;
|
|
}
|
|
|
|
void use_global_p(int n)
|
|
{
|
|
int i;
|
|
for (i=0; i<n; i++)
|
|
p[i] += i; // valid since p is in declare target and called from
|
|
// inside target region where p was attached to valid memory
|
|
}
|
|
//#pragma omp end declare target (optional here because of prototype spec)
|