![](/img/trans.png)
[英]Use of shared memory to reduce computational time of calculations inside CUDA kernel
[英]Writing to Shared Memory in CUDA without the use of a kernel
我想在main()函数中创建一个数组,输入所有正确的值,然后使该数组可立即用于共享内存中的线程。
我寻找的每个在CUDA中如何使用共享内存的示例都有线程将数据写入共享数组,但是我希望在内核启动之前我的共享数组立即可用。
任何帮助做到这一点将不胜感激。 提前致谢!
一些上下文:我想要的共享数组永远不会改变,并被所有线程读取。
编辑:显然,共享内存是不可能的。 有谁知道只读缓存是否有可能?
这是不可能的。 填充共享内存的唯一方法是使用CUDA内核中的线程。
如果您希望在启动时向内核提供一组(只读)数据,则可以使用__constant__
memory 。 可以使用文档中指示的API(即cudaMemcpyToSymbol
在主机代码上/由主机代码设置此类内存。
__constant__
内存实际上仅在每个线程将在给定的访问周期中访问相同的位置时才有用,例如
int myval = constant_data[12];
否则,请使用适当的主机API使用静态的或动态分配的普通全局内存进行初始化(动态: cudaMemcpy
,静态: cudaMemcpyToSymbol
)。
虽然您请求的特定行为无法自动实现,但这实际上是一个相当普遍的CUDA范例:
首先,让所有线程将表复制到shmem中。
同步线程
访问内核中的数据。
如果您具有相当随机的数据访问权限,并且希望平均触摸每个条目多次,则可以提高性能。 本质上,您将shmem用作托管缓存,并一次将DRAM的负载聚合到shmem中,以便多次使用。 而且,shmem对未分担的负载没有任何惩罚。
例如,您可以编写如下代码:
const int buffer_size = 8192; // assume an 8k buffer
float *device_buffer = ; // assume you have a buffer already on the device with the data you want.
my_kernel<<<num_blocks, num_threads, buffer_size>>>(..., buffer_size, device_buffer);
__global__ void my_kernel(..., int buffer_size, const float *device_buffer) {
extern __shared__ float shmem_buffer[];
for (int idx = threadIdx.x; idx < buffer_sze; idx += blockDim.x) {
shmem_buffer[idx] = device_buffer[idx];
}
__syncthreads();
// rest of your kernel goes here. You can access data in shmem_buffer;
}
换句话说,您只需要显式地编写副本即可。 由于来自DRAM的所有负载都将被完美合并,因此这应该接近最佳效率。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.