随SDK提供的示例代码中的公式如下(对于DtoD传输):
bandwidthInMBs = 2.0f * ((float)(1<<10) * memSize * (float)MEMCOPY_ITERATIONS) / (elapsedTimeInMs * (float)(1 << 20));
对于DtoH和HtoD案例,开头的 2.0f 乘数不存在。为什么?这是因为对于DtoD案例,会执行两次复制操作,所以实际传输的是 memSize 的两倍吗?
此外,这个公式在物理统一系统(如Jetson TK1)上的准确度如何?是否需要 2.0f 乘数?
例如,在Jetson TK1上,我得到以下数字:
DtoH = 6.1 GB / s
HtoD = 6.1 GB / s
DtoD = 12.2 GB / s(仅仅因为乘数!)
答案 0 :(得分:0)
[将评论汇总为一个答案,希望将问题从已经困扰了四年多的CUDA标签的未答复列表中剔除]
对于DtoH和DtoH,开头不存在2.0f乘数 HtoD案件。为什么?
由于(在常规系统中)设备到主机或主机到设备的操作仅涉及设备内存中的读取或写入操作。设备到设备的操作涉及对设备内存的读取和写入,因此每字节传输涉及两倍的设备内存事务,并且占用的内存带宽增加了一倍。
这是因为对于DtoD情况,两个复制操作是 执行,所以实际上两次传输了memSize?
或多或少,是的。
此外,在物理上统一的系统(例如Jetson TK1)上,此公式的精度如何?
没有任何变化。设备到设备的传输仍然每字节传输涉及两个内存事务,因此占用了两倍的带宽。
2.0f乘数是否必要?
是的,您可能会争辩说,共享内存系统上的主机到设备传输和设备到主机传输也需要两倍的乘数,因为它们在本质上是与设备到主机相同的操作设备传输,每字节内存传输占用两倍的内存带宽。