我是库达的新手,我有几个关于共享记忆的问题:
谢谢!
发布于 2018-09-07 11:07:59
让我首先指出,共享内存首先是编程模型的抽象,通过该模型暴露了硬件的某一特性(快速的片上内存)。在CUDA编程模型中,网格中的每个块(内核启动)获得相同数量的共享内存。这取决于内核函数所需的静态分配共享内存量以及内核启动中指定的任何额外的动态共享内存。
是的,目前的情况是这样。然而,这与您可能认为的编写CUDA程序的方式不太相关,因为:
当启动内核时,可以指定每个块需要多少共享内存。然后通知每个多处理器可以容纳多少块。所以,不是块的数量定义了每个块获得多少共享内存,而是反过来:每个块所需的共享内存量是决定每个多处理器上可以驻留多少块的因素之一。
当涉及到GPU编程时,您会想了解延迟、隐藏和占用,因为这些都是非常基本的主题。有关不同GPU体系结构的内存子系统的更多细节,请查看CUDA编程指南。
最后,由于GPU内核的SIMD (SIMT)特性,实际的程序执行发生了翘曲。当这种扭曲(目前,这实际上意味着一组32个线程)执行共享内存访问时,当该指令生成的共享内存请求被服务时,银行冲突将是一个问题。对于多个翘曲的共享内存请求是否可以并行处理,并没有进行真正的记录。我的猜测是,每个SM只有一个单元来处理共享内存请求,因此答案是否定的。
不能将cudaMemcpy()输入共享内存。只有同一块的设备线程才能访问共享内存,并且只有在该块运行时它才会持续。
https://stackoverflow.com/questions/52220535
复制相似问题