假设主机内存中有一个大的int
数组,内核的线程读或写,并且不能保存在GPU全局内存中。当合并对阵列元素的访问时,我们可以期望从/到主机存储器的突发读/写,其接近PCI-Express通道的理论带宽。但是,当读取或写入完全是零星的(非合并)时,带宽与理论最大带宽的比较是多少?
根据here的下图,对于每个写入事务,应该有一个128位长的数据包。但它假定32位寻址(考虑UVA需要64位机器)和4字节作为数据大小。如果这些假设成立,那么可以预期写入的最大带宽的四分之一和读取的七分之一。我对么?这些假设是真的吗?
我使用uint
数组设计并执行了上述问题的测试。我获得的带宽大约为480 MB / s,用于PCI-Express链路上的重度偶发读取和大量偶发写入,带宽约为6.6 GB / s,显示速度减慢13到14倍。怎么解释?
答案 0 :(得分:1)
只有NVIDIA肯定知道 - 它可能与只能从其中一个内存分区访问的主机内存有关 - 但这是已知的映射固定内存的性能限制。从The CUDA Handbook的p127-128开始:“使用合并的内存事务访问映射固定内存非常重要(第5.2.9节)。未合并内存事务的性能损失从6x到2x不等。但即使在SM 2上也是如此.x和后来的GPU,其缓存应该是一个过时的考虑因素合并,惩罚是重要的。“
听起来在最近的硬件上惩罚甚至更高。