CUDA样本码带宽测试中的DeviceToDevice带宽公式

CUDA样本码带宽测试中的DeviceToDevice带宽公式,cuda,Cuda,SDK提供的示例代码中的公式如下(对于DtoD传输): bandwidthInMBs=2.0f*((浮点)(1[将评论总结成一个答案,希望将这个问题从持续四年多的CUDA标签的未回答列表中删除] DtoH和DtoH开头不存在2.0f乘数 HtoD案例,为什么 因为(在传统系统中)设备到主机或主机到设备的操作只涉及设备内存中的读或写操作。设备到设备的操作既涉及到从设备内存的读操作,也涉及到对设备内存的写操作,因此,每个传输字节涉及的设备内存事务数是原来的两倍,占用的内存带宽是原来的两倍 这是因为对

SDK提供的示例代码中的公式如下(对于DtoD传输):

bandwidthInMBs=2.0f*((浮点)(1[将评论总结成一个答案,希望将这个问题从持续四年多的CUDA标签的未回答列表中删除]

DtoH和DtoH开头不存在2.0f乘数 HtoD案例,为什么

因为(在传统系统中)设备到主机或主机到设备的操作只涉及设备内存中的读或写操作。设备到设备的操作既涉及到从设备内存的读操作,也涉及到对设备内存的写操作,因此,每个传输字节涉及的设备内存事务数是原来的两倍,占用的内存带宽是原来的两倍

这是因为对于DtoD情况,需要执行两个复制操作吗 执行,那么实际上传输了两倍的memSize

或多或少,是的

此外,该公式在物理统一系统(如Jetson TK1)上的准确度如何

没有任何变化。设备到设备的传输仍然涉及每个字节传输两个内存事务,因此消耗的带宽是原来的两倍

是否需要2.0f倍增器


是的,您可能会争辩说,共享内存系统上的主机到设备和设备到主机的传输也需要两倍乘数,因为它们本质上与设备到设备的传输操作相同,并且每字节内存传输消耗两倍的内存带宽。

@harrism任何见解都值得赞赏。DtoD测试从设备内存中读取6.1 GB/秒,并将6.1 GB/秒写入设备内存,因此设备内存总带宽为12.2 GB/秒。对于主机和设备内存为相同物理内存的系统,相同的2x倍增可能应用于HtoD和DtoH测试。我猜该应用程序根本不提供任何特殊功能这种情况下的sions。在具有离散GPU的系统的标准情况下,HtoD和DtoH情况下都需要x GB/秒的主机内存和x GB/秒的设备内存带宽,而DtoD情况下需要2 x GB/秒的设备内存带宽。@njuffa,我想这一切都归结于cudaMemcpy()的方式实际上是针对不同的复制方向实现的。因此,在离散GPU上,我猜DtoH和HtoD没有乘数,因为在PCIe上有一个使用设备DMA复制引擎的单一复制。我还知道,在离散GPU上,DtoD复制是使用SMs上驱动程序启动的Memcpy内核完成的(我猜先读后写,正如你所说的2x的原因)。所以问题是Jetson TK1驱动程序是否在不同的方向上使用相同的cudaMemcpy实现。实现与GPU连接内存的带宽无关(这是应用程序试图测量的)。该应用程序显然早于具有统一物理内存的GPU平台,显然没有适应主机和设备内存为相同物理内存的情况。您的结果提供了有用的信息:TK1可以从连接的内存读取6.1 GB/sec,同时向连接的内存写入6.1 GB/sec,总带宽为12.1GB/秒。这与64位接口上的DDR3内存一致(具有双通道DDR3的消费类PC提供约25 GB/秒)我对实施的评论是关于HtoD报告的6.1 GB/sec和DtoH 6.1与您在原始问题中询问的DtoD报告的12.2 GB/sec之间的差异。我指出,根据测试应用程序的报告方式,这些数字事实上是一致的,并且是合理的。这不是一个讨论论坛,y你现在似乎在看一些不同的问题,所以请问一个新问题。