CUDA 之 共享内存

某些部分翻译自《CUDA by Example》

块(Block)内的并行线程将能够执行并行块无法完成的任务。

硬件将一次发射的数据块数限制在65535块。

类似地,硬件限制了每个块的线程数,我们可以用这些线程来启动内核。具体地说,这个数字不能超过设备属性结构的maxThreadsPerBlock字段指定的值。对于许多当前可用的图形处理器,这个限制是每个块512个线程,那么我们如何使用基于线程的方法来添加两个大小大于512的向量?我们将不得不使用线程和块的组合来实现这一点。

很高兴你这么问。cudac编译器处理共享内存中的变量与处理典型变量不同。它为您在GPU上启动的每个块创建变量的副本。该块中的每个线程共享内存,但线程无法看到或修改在其他块中看到的此变量的副本。这为块中的线程提供了一种很好的方法,通过这种方法,块中的线程可以在计算上进行通信和协作。此外,共享内存缓冲区物理上驻留在GPU上,而不是驻留在片外DRAM中。因此,访问共享内存的延迟往往远低于典型的缓冲区,从而使共享内存高速地执行。

你之间的沟通应该会让你兴奋,它也让我们兴奋。但生活中没有什么是免费的,线程间通信也不例外。如果我们希望在线程之间进行通信,我们还需要一种在线程之间进行同步的机制。例如,如果线程A将一个值写入共享内存,而我们希望线程B使用该值执行某些操作,则在我们知道从线程A写入完成之前,不能让线程B开始工作。在没有同步的情况下,我们创建了一个竞争条件,其中执行结果的正确性取决于硬件的不确定性细节。

虽然线程间可以通过共享内存进行通信,但是需要使用同步机制确保每个线程都执行完一定的操作以后再进行下一步。

猜你喜欢

转载自blog.csdn.net/tiao_god/article/details/107347329