从一个内核启动到另一个内核启动的共享内存持久化
Is shared memory persistent from one kernel launch to another?
当试图找到共享内存是否可以被多个内核访问时,我发现有时共享内存中的数据在被另一个内核访问时仍然存在,但有时不是。更重要的是,当使用cuda-gdb调试程序时,上一个内核写入共享内存的数据总是可以被下一个内核读取。
下面是一段测试代码,使用2个gpu。
extern __shared__ double f_ds[];
__global__ void kernel_writeToSharedMem(double* f_dev, int spd_x)
{
int tid_dev_x = (blockDim.x * blockIdx.x + threadIdx.x);
int tid_dev_y = (blockDim.y * blockIdx.y + threadIdx.y);
int tid_dev = tid_dev_y* spd_x + tid_dev_x;
if(tid_dev < blockDim.x * blockDim.y * gridDim.x*gridDim.y)
f_ds[threadIdx.y*blockDim.x+threadIdx.x] = 0.12345;
__syncthreads()
}
__global__ void kernel_readFromSharedMem(double *f_dev, int dev_no, int spd_x)
{
int tid_dev_x = (blockDim.x * blockIdx.x + threadIdx.x);
int tid_dev_y = (blockDim.y * blockIdx.y + threadIdx.y);
int tid_dev = tid_dev_y* spd_x + tid_dev_x;
if(tid_dev < blockDim.x * blockDim.y * gridDim.x*gridDim.y)
{
f_dev[tid_dev] = f_ds[threadIdx.y*blockDim.x+threadIdx.x];
printf("threadID %d in dev [%d] is having number %fn",
tid_dev,dev_no,f_ds[threadIdx.y*blockDim.x+threadIdx.x]);
}
__syncthreads();
}
int main()
{
...
dim3 block_size(BLOCK_SIZE,BLOCK_SIZE);
im3 grid_size(spd_x/BLOCK_SIZE,spd_y/BLOCK_SIZE);
for(int i = 0; i < ngpus; i++)
{
cudaSetDevice(i);
kernel_writeToSharedMem<<<grid_size,block_size,sizeof(double)*BLOCK_SIZE*BLOCK_SIZE,stream[i]>>>(f_dev[i],spd_x);
cudaDeviceSynchronize();
cudaThreadSynchronize();
}
for(int i = 0; i < ngpus; i++)
{
cudaSetDevice(i);
kernel_reaFromSharedMem<<<grid_size,block_size,sizeof(double)*BLOCK_SIZE*BLOCK_SIZE,stream[i]>>>(f_dev[i], int i, spd_x);
cudaDeviceSynchronize();
cudaThreadSynchronize();
}
...
}
运行程序后出现四种情况:
设备0为0.12345,设备1为0;
设备0为0,设备1为0.12345;
设备0和设备1均为0;
设备0和设备1均为0.12345.
在cuda-gdb中运行时总是如此。
这是否表明共享内存的持久性只有一个内核?共享内存是否只在一个内核偶尔之后才被清除或释放?
保证共享内存的作用域只在分配给它的块的生命周期内存在。任何试图在块到块或内核启动到内核启动之间重用共享内存的行为都是完全未定义的行为,在正常的代码设计中都不应该依赖
相关文章:
- 如何创建一个空的全局类并在启动时实例化它
- 如何在内核C++中使用1920x1080x16M图形或类似的16M颜色?(VGA)
- OpenCL 在 NVIDIA 和 Intel GPU 上启动内核时CL_INVALID_COMMAND_QUEUE
- 在Windows上坚持Jupyter:内核无法启动
- 无法理解 CUDA 内核启动的行为
- 内核AIO(libaio)写入请求在启动时从保留的内存中写入时失败
- CUDA并发内核启动不工作
- Visual Studio 在调试内核驱动程序时无法启动调试会话
- 在 CUDA 5.5 中启动内核函数时发生的错误
- CUDA在使用函数指针时启动主机函数作为内核
- 在一台有n个内核的机器中,确定要启动的线程数的最佳方法是什么?(C++)
- 从一个内核启动到另一个内核启动的共享内存持久化
- 从静态初始化代码启动CUDA内核时遇到问题
- 同一个内核的多次启动是否可以访问共享变量?
- 每次启动都重复运行CUDA内核
- 让eclipse解析或忽略CUDA内核启动参数
- 内核启动指定流,但使用默认共享内存大小
- 如何启动python内核并使用ZMQ套接字进行连接
- CUDA内核使用模板启动宏
- 启动大内核时出现未知错误