访问CUDA中的共享内存
Access to Shared Memory in CUDA
我将向内核传递3个大小为N
=224的数组。内核本身调用另一个函数foo(threadIdx.x)
,foo调用另一函数bar(i)
,其中i
从1变为224。第二个函数需要访问传递给内核的数组,但我现在的代码告诉我参数i
是未定义的。
我试图将数组的副本保存到共享内存中,但没有成功:
__global__ void dummy(double *pos_x_d, double *pos_y_d, double *hist_d){
int i = threadIdx.x;
hist_d[i]=pos_x_d[i]+pos_y_d[i];
__syncthreads();
foo(i);
__syncthreads();
}
主机代码看起来像:
cudaMalloc((void **) &pos_x_d,(N*sizeof(double)));
cudaMalloc((void **) &pos_y_d,(N*sizeof(double)));
cudaMalloc((void **) &hist_d,(N*sizeof(double)));
//Copy data to GPU
cudaMemcpy((void *)pos_x_d, (void*)pos_x_h,N*sizeof(double),cudaMemcpyHostToDevice);
cudaMemcpy((void *)pos_y_d, (void*)pos_y_h,N*sizeof(double),cudaMemcpyHostToDevice);
//Launch Kernel
dummy<<<1,224>>>(pos_x_d,pos_y_d,hist_d);
是否可以启动两个内核,第一个是将数据发送到共享内存。然后,第二次做计算?我还需要在第二个内核上循环,这就是为什么我首先要在共享内存中发送数据。错误来自第89、90行,这意味着它与共享内存有关。完整的代码在这里。
是否可以启动两个内核,第一个是将数据发送到共享内存。然后,第二次做计算?
不,这是不可能的。共享内存的生存期是与该共享内存相关联的线程块。线程块无法可靠地使用共享内存中不同线程块存储的值(无论是来自相同还是不同的内核启动)。
将数据从一个内核启动保存到下一个内核的唯一方法是通过全局内存(或主机内存)。
相关文章:
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 字符串共享内存映射的向量
- CUDA 使用共享内存平铺 3D 卷积实现
- 共享内存:MapViewOfFile 返回错误 5
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- 有没有办法列出所有共享内存对象的名称?
- 共享内存的升压容器是否实现锁定?
- 共享内存中的健壮互斥锁不是那么健壮
- 使用IPC/共享内存将Integer数组从C++传递到Python
- 共享内存和性能
- 在这种特殊情况下,我是否需要在共享内存中使用原子类型
- 是否可以在专用内存空间中分配一个为提升管理共享内存而创建的对象
- fork(),在C中共享内存和指针
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 提升进程间共享内存open_or_create每次都会引发异常
- 通过 mmap-ed 共享内存传递可变长度 C 字符串
- 越界访问 CUDA 共享内存
- 在共享内存中插入映射映射时出现编译器错误
- 矩阵矢量产品 CUDA 通过平铺和共享内存提高性能
- 如何更改在 c++ 中使用提升库创建的共享内存的路径