Cuda 共享内存从一个内核启动持续到另一个内核启动吗?
当我试图找出共享内存是否可以被多个内核访问时,我发现有时共享内存中的数据在另一个内核访问时仍然存在,但有时不存在。此外,当cuda gdb调试程序时,前一个内核写入共享内存的数据总是可以被下一个内核读取 下面是一段测试代码,带有2gpusCuda 共享内存从一个内核启动持续到另一个内核启动吗?,cuda,Cuda,当我试图找出共享内存是否可以被多个内核访问时,我发现有时共享内存中的数据在另一个内核访问时仍然存在,但有时不存在。此外,当cuda gdb调试程序时,前一个内核写入共享内存的数据总是可以被下一个内核读取 下面是一段测试代码,带有2gpus extern __shared__ double f_ds[]; __global__ void kernel_writeToSharedMem(double* f_dev, int spd_x) { int tid_de
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 %f\n",
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();
}
...
}
4运行程序后出现的情况
1Dev0为0.12345,但Dev1为0
2 Dev0为0,但Dev1为0.12345
3 Dev0和Dev1均为0
4 Dev0和Dev1均为0.12345
在cuda中运行时,gdb 4始终是这样
这是否表明共享内存的持久性只是一个内核?共享内存是否只有在一个内核之后才会被清除或释放 共享内存保证只在分配给它的块的生命周期内有作用域。从块到块或从内核启动到内核启动的任何重复使用共享内存的尝试都是完全未定义的行为,在健全的代码设计中永远不应依赖。共享内存保证仅在分配给它的块的生命周期内具有作用域。任何从块到块或从内核启动到内核启动重复使用共享内存的尝试都是完全未定义的行为,在理智的代码设计中永远不应该依赖