共享内存 shared memory的生命周期是跟随block的生命周期的,即一份shared memory随着block的开启而开启,随着block(里所有thread)的结束而结束。
但从物理上说, shared memory里的数据并没有被清空。 如果一个新的block被分配到了这段shared memory,那么就能延续使用shared memory驻留的数据。以下的实验验证了这一点
两次kernel使用同样大小的gridDim和blockDim
1 | #include <iostream> |
输出如下:1
2
3
4
5
6======Round 0======
[block#0]sharedVar = 999
[block#1]sharedVar = 999
======Round 1======
[block#0]sharedVar = 111
[block#1]sharedVar = 999
说明shared memory的数据驻留了
改变第二次的blockDim,gridDim大小
1 | 将 dim3 grid_1(2,1,1); dim3 block_1(2,1,1); |
输出如下:1
2
3
4
5
6======Round 0======
[block#0]sharedVar = 999
[block#1]sharedVar = 999
======Round 1======
[block#0]sharedVar = 111
[block#1]sharedVar = 999
说明grid和block尺寸,并不影响shared memory的数据驻留
重置CUDA
1 | 在dim3 grid_1(2,1,1); dim3 block_1(2,1,1) 之前加上以下几行: |
输出如下:1
2
3
4
5
6======Round 0======
[block#0]sharedVar = 999
[block#1]sharedVar = 999
======Round 1======
[block#0]sharedVar = 999
[block#1]sharedVar = 999
说明cudaDeviceReset()清空了shared memory的数据