The description below applies to:
allocate
clause, except when the allocator
modifier is a
constant expression with value omp_default_mem_alloc
and no
align
modifier has been specified. (In that case, the normal
malloc
allocation is used.)
allocate
directive for variables in static memory; while
the alignment is honored, the normal static memory is used.
allocate
directive for automatic/stack variables, except
when the allocator
clause is a constant expression with value
omp_default_mem_alloc
and no align
clause has been
specified. (In that case, the normal allocation is used: stack allocation
and, sometimes for Fortran, also malloc
[depending on flags such as
-fstack-arrays].)
allocators
directive and the executable
allocate
directive for Fortran pointers and allocatables is
supported, but requires that files containing those directives has to be
compiled with -fopenmp-allocators. Additionally, all files that
might explicitly or implicitly deallocate memory allocated that way must
also be compiled with that option.
align
clause
and the alignment of the type after honoring, if present, the
aligned
(GNU::aligned
) attribute and C’s _Alignas
and C++’s alignas
. However, the align
clause of the
allocate
directive has no effect on the value of C’s
_Alignof
and C++’s alignof
.
For the available predefined allocators and, as applicable, their associated
predefined memory spaces and for the available traits and their default values,
see OMP_ALLOCATOR
– Set the default allocator. Predefined allocators without an associated memory
space use the omp_default_mem_space
memory space. See additionally
Offload-Target Specifics.
For the memory spaces, the following applies:
omp_default_mem_space
is supported
omp_const_mem_space
maps to omp_default_mem_space
omp_low_lat_mem_space
is only available on supported devices,
and maps to omp_default_mem_space
otherwise.
omp_large_cap_mem_space
maps to omp_default_mem_space
,
unless the memkind library is available
omp_high_bw_mem_space
maps to omp_default_mem_space
,
unless the memkind library is available
On Linux systems, where the memkind
library (libmemkind.so.0
) is available at runtime, it is used when
creating memory allocators requesting
omp_high_bw_mem_space
omp_large_cap_mem_space
partition
trait interleaved
; note that for
omp_large_cap_mem_space
the allocation will not be interleaved
On Linux systems, where the numa
library (libnuma.so.1
) is available at runtime, it used when creating
memory allocators requesting
partition
trait nearest
, except when both the
libmemkind library is available and the memory space is either
omp_large_cap_mem_space
or omp_high_bw_mem_space
Note that the numa library will round up the allocation size to a multiple of
the system page size; therefore, consider using it only with large data or
by sharing allocations via the pool_size
trait. Furthermore, the Linux
kernel does not guarantee that an allocation will always be on the nearest NUMA
node nor that after reallocation the same node will be used. Note additionally
that, on Linux, the default setting of the memory placement policy is to use the
current node; therefore, unless the memory placement policy has been overridden,
the partition
trait environment
(the default) will be effectively
a nearest
allocation.
Additional notes regarding the traits:
pinned
trait is supported on Linux hosts, but is subject to
the OS ulimit
/rlimit
locked memory settings.
pool_size
trait is no pool and for every
(re)allocation the associated library routine is called, which might
internally use a memory pool.
partition
trait, the partition part size will be the same
as the requested size (i.e. interleaved
or blocked
has no
effect), except for interleaved
when the memkind library is
available. Furthermore, for nearest
and unless the numa library
is available, the memory might not be on the same NUMA node as thread
that allocated the memory; on Linux, this is in particular the case when
the memory placement policy is set to preferred.
access
trait has no effect such that memory is always
accessible by all threads.
sync_hint
trait has no effect.
See also: Offload-Target Specifics