Memory 复制到cuda中的共享内存

Memory 复制到cuda中的共享内存,memory,cuda,Memory,Cuda,在CUDA编程中,如果我们想使用共享内存,我们需要将数据从全局内存带到共享内存。线程用于传输此类数据 我在某个地方(在线参考资料)读到,最好不要让块中的所有线程都参与将数据从全局内存复制到共享内存。这样的想法是有道理的,所有的线程不是一起执行的。扭曲中的线一起执行。但我担心的是,所有的扭曲都不是按顺序执行的。比如说,一个有线程的块被分成3个线程:war p0(0-31线程)、warp 1(32-63线程)、warp 2(64-95线程)。不能保证首先执行扭曲0(我说的对吗?) 那么,我应该使用哪

在CUDA编程中,如果我们想使用共享内存,我们需要将数据从全局内存带到共享内存。线程用于传输此类数据

我在某个地方(在线参考资料)读到,最好不要让块中的所有线程都参与将数据从全局内存复制到共享内存。这样的想法是有道理的,所有的线程不是一起执行的。扭曲中的线一起执行。但我担心的是,所有的扭曲都不是按顺序执行的。比如说,一个有线程的块被分成3个线程:war p0(0-31线程)、warp 1(32-63线程)、warp 2(64-95线程)。不能保证首先执行扭曲0(我说的对吗?)


那么,我应该使用哪些线程将数据从全局内存复制到共享内存

当块被分配给多处理器时,它一直驻留在那里,直到该块中的所有线程都完成,在此期间,扭曲调度器在具有就绪操作数的扭曲之间混合。所以,如果多处理器上有一个块有三个扭曲,只有一个扭曲正在将数据从全局内存提取到共享内存,而另外两个扭曲保持空闲,可能正在等待
\uu syncthreads()
屏障,那么您将不会失去任何东西,并且您只会受到全局内存延迟的限制。抓取完成后,整经机就可以继续工作


因此,不需要保证首先执行warp0,并且可以使用任何线程。只需记住两件事,即确保尽可能多地合并访问全局内存,并避免存储组冲突。

要使用单个扭曲加载共享内存阵列,只需执行以下操作:

__global__
void kernel(float *in_data)
{
    __shared__ float buffer[1024];

    if (threadIdx.x < warpSize) {
        for(int i = threadIdx; i  <1024; i += warpSize) {
            buffer[i] = in_data[i];
        }
    }
    __syncthreads();

    // rest of kernel follows
}
\u全局__
无效内核(浮点*在_数据中)
{
__共享浮点数缓冲区[1024];
if(螺纹内径x.x<翘曲尺寸){

对于(int i=threadIdx;i是CUDA内核的已知内部变量?“如threadIdx、blockIdx.等…”我知道它是32,但从变量中获取它对于未来的GPU更安全:)