With the unified memory feature now in CUDA, variables can be in the managed
memory and this makes the code a little simpler. Whereas the shared
memory is shared between threads in a thread block. See section 3.2 in CUDA Fortran.
My question is can a variable be in both the shared
and managed
memory? They would be managed
in the host but on the device, they would be shared
What type of behaviour maybe expected of this type of variable ?
I am using CUDA Fortran. I ask this question because, declaring the variable as managed
makes it easier for me to code whereas making it shared
in the device makes it faster than the global device memory.
I could not find anything that gave me a definitive answer in the documentation.
My question is can a variable be in both the shared and managed memory?
No, it's not possible.
Managed memory is created with either a static allocator (__managed__
in CUDA C, or managed
attribute in CUDA fortran) or a dynamic allocator (cudaMallocManaged
in CUDA C, or managed
(allocatable) attribute in CUDA fortran).
Both of these are associated with the logical global memory space in CUDA. The __shared__
(or shared
) memory space is a separate logical space, and must be used (allocated, accessed) explicitly, independent of any global space usage.