Cuda 低入住率的原因

Cuda 低入住率的原因,cuda,gpgpu,Cuda,Gpgpu,Nvidia提到了实现占用率低的几个原因,其中包括块之间工作负载的不均匀分布,这导致块囤积共享内存资源,直到块完成后才释放它们。建议减小块的大小,从而增加块的总数(当然,假设线程数保持不变) stackoverflow对此也给出了很好的解释 鉴于上述信息,正确的操作过程不应该(为了最大化性能)简单地将块的大小设置为尽可能小(等于扭曲的大小,比如32个线程)吗?也就是说,除非您需要确保更多的线程需要通过共享内存进行通信,否则我假定 鉴于上述信息,正确的做法不应该 操作(为了最大化性能)只需设置大小

Nvidia提到了实现占用率低的几个原因,其中包括块之间工作负载的不均匀分布,这导致块囤积共享内存资源,直到块完成后才释放它们。建议减小块的大小,从而增加块的总数(当然,假设线程数保持不变)

stackoverflow对此也给出了很好的解释

鉴于上述信息,正确的操作过程不应该(为了最大化性能)简单地将块的大小设置为尽可能小(等于扭曲的大小,比如32个线程)吗?也就是说,除非您需要确保更多的线程需要通过共享内存进行通信,否则我假定

鉴于上述信息,正确的做法不应该 操作(为了最大化性能)只需设置大小 尽可能小的块的大小(等于扭曲的大小,例如32 线程)

没有

如文档所示,每个多处理器的块数有一个限制,使用32个线程块时,理论上的最大占用率为25%或50%,具体取决于运行内核的硬件

鉴于上述信息,正确的做法不应该 操作(为了最大化性能)只需设置大小 尽可能小的块的大小(等于扭曲的大小,例如32 线程)

没有


如文档所示,每个多处理器的块数有一个限制,使用32个线程块时,理论上的最大占用率为25%或50%,取决于运行内核的硬件。

通常,使用尽可能小但足够大的块来饱和设备(每个块64或128个线程,具体取决于设备)是一种很好的方法,因为您可能希望同步线程或通过共享内存进行通信

拥有大量的小数据块允许GPU进行某种“自动平衡”,并保持所有SMs运行

同样的情况也适用于CPU—如果您有5个独立的TAK,每个TAK需要4秒才能完成,但您只有4个内核,那么它将在8秒后结束(在前4秒内,4个内核在前4个任务上运行,然后1个内核在最后一个任务上运行,3个内核处于空闲状态)。 如果您能够将整个工作划分为20个任务,耗时1秒,那么整个工作将在5秒内完成。因此,有很多小任务有助于利用硬件

在GPU的情况下,您可以有大量的活动块(在Titan X上,它是24个SM X 32个活动块=768个块),并且最好使用此电源。 无论如何,它并不总是真的,你们需要完全饱和设备。在许多任务中,我可以看到每个块使用32个线程(因此有50%的可能占用率)与每个块使用64个线程具有相同的性能。
最后,所有的事情都是做一些基准测试,并在给定硬件的给定情况下选择最适合您的东西。

通常,使用尽可能小的块是一种很好的方法,但它的大小足以使设备饱和(每个块64或128个线程,取决于设备)-这并不总是可能的,因为您可能希望同步线程或通过共享内存进行通信

拥有大量的小数据块允许GPU进行某种“自动平衡”,并保持所有SMs运行

同样的情况也适用于CPU—如果您有5个独立的TAK,每个TAK需要4秒才能完成,但您只有4个内核,那么它将在8秒后结束(在前4秒内,4个内核在前4个任务上运行,然后1个内核在最后一个任务上运行,3个内核处于空闲状态)。 如果您能够将整个工作划分为20个任务,耗时1秒,那么整个工作将在5秒内完成。因此,有很多小任务有助于利用硬件

在GPU的情况下,您可以有大量的活动块(在Titan X上,它是24个SM X 32个活动块=768个块),并且最好使用此电源。 无论如何,它并不总是真的,你们需要完全饱和设备。在许多任务中,我可以看到每个块使用32个线程(因此有50%的可能占用率)与每个块使用64个线程具有相同的性能。
归根结底,一切都是做一些基准测试的问题,在给定的情况下,在给定的硬件上选择最适合您的东西。

明白。那么让我重新表述一下。如果我们也确认每个SM的最大块数限制,那么我们是否应该选择尽可能小的块大小?这样做的唯一好处是,同一内核中的块可以有非常不同的执行时间。然后,额外的粒度可以帮助实现负载平衡,否则就没有必要使用soUnderstood。那么让我重新表述一下。如果我们也确认每个SM的最大块数限制,那么我们是否应该选择尽可能小的块大小?这样做的唯一好处是,同一内核中的块可以有非常不同的执行时间。然后,额外的粒度可以帮助实现负载平衡,否则这样做没有意义