Foreign-runtime support for Nvidia GPUs (GNU libgomp)

#### 12.2.1 OpenMP `interop` – Foreign-Runtime Support for Nvidia GPUs ¶

On Nvidia GPUs, the foreign runtimes APIs are the CUDA runtime API, the CUDA driver API, and HIP, the C++ Heterogeneous-Compute Interface for Portability that is—on CUDA-based systems—a very thin layer on top of the CUDA API. By default, CUDA is used. The interop object is created using OpenMP’s `interop` directive or, implicitly, when invoking a `declare variant` procedure that has the `append_args` clause. In either case, the `prefer_type` modifier determines whether CUDA, CUDA driver, or HSA is used.

When specifying the `targetsync` modifier, a CUDA stream is created using the `CU_STREAM_DEFAULT` flag.

Invoke the Interoperability Routines on an interop object to obtain the following properties. For properties with integral (int), pointer (ptr), or string (str) data type, call `omp_get_interop_int`, `omp_get_interop_ptr`, or `omp_get_interop_str`, respectively. Note that `device_num` is the OpenMP device number while `device` is the CUDA, CUDA Driver, or HIP device number.

When using HIP with C and C++, the `__HIP_PLATFORM_NVIDIA__` preprocessor macro must be defined before including the HIP header files.

For the API routine call, add the prefix `omp_ipr_` to the property name; for instance:

    omp_interop_rc_t ret;
    int device_num = omp_get_interop_int (my_interop_obj, omp_ipr_device_num, &ret);

Available properties for a CUDA runtime API interop object:

Property | C data type | API routine | value (if constant)
--- | --- | --- | ---
`fr_id` | `omp_interop_fr_t` | int | `omp_fr_cuda`
`fr_name` | `const char *` | str | `"cuda"`
`vendor` | `int` | int | `11`
`vendor_name` | `const char *` | str | `"nvidia"`
`device_num` | `int` | int |
`platform` | N/A |  |
`device` | `int` | int |
`device_context` | N/A |  |
`targetsync` | `cudaStream_t` | ptr |

Available properties for a CUDA driver API interop object:

Property | C data type | API routine | value (if constant)
--- | --- | --- | ---
`fr_id` | `omp_interop_fr_t` | int | `omp_fr_cuda_driver`
`fr_name` | `const char *` | str | `"cuda_driver"`
`vendor` | `int` | int | `11`
`vendor_name` | `const char *` | str | `"nvidia"`
`device_num` | `int` | int |
`platform` | N/A |  |
`device` | `CUdevice` | int |
`device_context` | `CUcontext` | ptr |
`targetsync` | `CUstream` | ptr |

Available properties for an HIP interop object:

Property | C data type | API routine | value (if constant)
--- | --- | --- | ---
`fr_id` | `omp_interop_fr_t` | int | `omp_fr_hip`
`fr_name` | `const char *` | str | `"hip"`
`vendor` | `int` | int | `11`
`vendor_name` | `const char *` | str | `"nvidia"`
`device_num` | `int` | int |
`platform` | N/A |  |
`device` | `hipDevice_t` | int |
`device_context` | `hipCtx_t` | ptr |
`targetsync` | `hipStream_t` | ptr |