我读了一些CUDA文档,其中提到了本地内存。(这主要是早期的文档。)设备属性报告了一个本地内存大小(每个线程)。'本地'内存是什么意思?'本地'内存是什么?'本地'内存在哪里?如何访问'本地'内存?它是__device__
内存,是吗?
设备属性还报告了全局、共享和常量内存大小。这些说法正确吗:
全局内存是__device__
内存。它具有网格范围,并且在网格(内核)的生命周期内存在。
常量内存是__device__ __constant__
内存。它具有网格范围和网格(内核)的生命周期。
共享内存是__device__ __shared__
内存。它具有单个块范围,生命周期为该块(线程)。
我认为共享内存是SM内存。即只有该单个SM可以直接访问的内存。这是一种相当受限制的资源。一个SM同时被分配了一堆块吗?这是否意味着SM可以交错执行不同的块(或不执行)?即运行块*A*线程直到它们停止。然后运行块*B*线程,直到它们停止。然后再切换回块*A*线程。或者,SM是否运行一组线程(对于块*A*),直到它们停止。然后另一组块*A*线程被交换进来。这种交换会继续进行,直到块*A*耗尽。只有在此时才开始在块*B*上工作。 我之所以问这个问题是因为共享内存。如果单个SM正在从2个不同的块中交换代码,那么该SM如何快速地交换共享内存块?(我认为后一种情况是正确的,并且没有在共享内存空间中交换。块*A*运行直到完成,然后块*B*开始执行。注意:块*A*可能是不同于块*B*的内核。)