# TARGET DATA

OpenMP* Fortran Compiler Directive: Maps variables to a device data environment for the extent of the region. This feature is only available for ifx.

## Syntax

!$OMP TARGET DATA [clause[[,] clause]... ]

loosely-structured-block

!$OMP END TARGET DATA

-or-

!$OMP TARGET DATA [clause[[,] clause]... ]

strictly-structured-block

!$OMP END TARGET DATA

clause | Is one or more of the following: DEVICE (integer-expression) IF ([TARGET DATA:] scalar-logical-expression) MAP ([[map-type-modifier[,]] map-type: ] list) SUBDEVICE ([integer-constant ,] integer-expression [ : integer-expression [ : integer-expression] ] ) USE_DEVICE_ADDR (list) USE_DEVICE_PTR (ptr-list) At most one DEVICE clause and one IF clause can appear for the construct. At least one USE_DEVICE_PTR, USE_DEVICE_ADDR, or MAP clause must appear for the construct. The map-type in a MAP clause must be TO, FROM, TOFROM, or ALLOC.
loosely-structured-block | Is a structured block (section) of statements or constructs. You cannot branch into or out of the block.
strictly-structured-block | Is a Fortran BLOCK construct. You cannot branch into or out of the BLOCK construct.

The binding task region for a TARGET DATA construct is the encountering task. The target region binds to the enclosing parallel or task region.

When a TARGET DATA construct is encountered, a new device data environment is created, and the encountering task executes the target data region.

Occurrences of a list item appearing in a USE_DEVICE_ADDR clause in the structured block of the construct are references to the device address of the item if the item has corresponding storage in the device data environment. If the list item is not mapped, it is assumed to be accessible on the target device. The host storage of a list item that has a device address may not be accessible from within the structured block. List items can include array sections.

If a list item in a USE_DEVICE_PTR clause is not of type C_PTR from the intrinsic module ISO_C_BINDING, it is treated as if it appeared in a USE_DEVICE_ADDR clause. The use of non-C_PTR types in a USE_DEVICE_PTR clause has been deprecated.

A program must not depend on any ordering of the evaluations of the clauses of the TARGET DATA directive, or on any side effects of the evaluations of the clauses, except that list items in any MAP clause are data mapped prior to the conversion of any list items in a USE_DEVICE_PTR or USE_DEVICE_ADDR clause to their device storage locations within the structured block.

List items in USE_DEVICE_PTR and USE_DEVICE_ADDR clauses can not be specified more than once in the same or any other USE_DEVICE_PTR or USE_DEVICE_ADDR clause for the construct.

A list item in a USE_DEVICE_PTR or a USE_DEVICE_ADDR clause must not be a component of a derived type.

List items in a USE_DEVICE_ADDR clause must have been mapped to the device, or be accessible on the device from the host data environment. Similarly, the value of a list item in a USE_DEVICE_PTR that is of type C_PTR must be the address of an entity that has storage in the device data environment or that is accessible on the device from the host data environment.

If a list item in a USE_DEVICE_ADDR is an array section, the designator of the base expression cannot contain any construct association selectors.

The same variable can be used in both the MAP clause and the USE_DEVICE_PTR clause or a USE_DEVICE_ADDR clause:

    !$OMP TARGET DATA MAP(X, Y) USE_DEVICE_PTR(X) USE_DEVICE_ADDR (Y)
        block
    !$OMP END TARGET DATA

Parent topic: T to Z

## See Also

OpenMP Fortran Compiler Directives
Syntax Rules for Compiler Directives
TARGET Directive
TARGET UPDATE directive
Parallel Processing Model for information about Binding Sets