为什么CUDA中的重叠数据传输比预期慢?

为什么CUDA中的重叠数据传输比预期慢?,cuda,Cuda,当我在特斯拉C2050上的SDK(4.0)中运行simpleMultiCopy时,我得到以下结果: [simpleMultiCopy] starting... [Tesla C2050] has 14 MP(s) x 32 (Cores/MP) = 448 (Cores) > Device name: Tesla C2050 > CUDA Capability 2.0 hardware with 14 multi-processors > scale_factor = 1.00

当我在特斯拉C2050上的SDK(4.0)中运行simpleMultiCopy时,我得到以下结果:

[simpleMultiCopy] starting...
[Tesla C2050] has 14 MP(s) x 32 (Cores/MP) = 448 (Cores)
> Device name: Tesla C2050
> CUDA Capability 2.0 hardware with 14 multi-processors
> scale_factor = 1.00
> array_size   = 4194304


Relevant properties of this CUDA device
(X) Can overlap one CPU<>GPU data transfer with GPU kernel execution (device property "deviceOverlap")
(X) Can overlap two CPU<>GPU data transfers with GPU kernel execution
    (compute capability >= 2.0 AND (Tesla product OR Quadro 4000/5000)

Measured timings (throughput):
 Memcpy host to device  : 2.725792 ms (6.154988 GB/s)
 Memcpy device to host  : 2.723360 ms (6.160484 GB/s)
 Kernel         : 0.611264 ms (274.467599 GB/s)

Theoretical limits for speedup gained from overlapped data transfers:
No overlap at all (transfer-kernel-transfer): 6.060416 ms 
Compute can overlap with one transfer: 5.449152 ms
Compute can overlap with both data transfers: 2.725792 ms

Average measured timings over 10 repetitions:
 Avg. time when execution fully serialized  : 6.113555 ms
 Avg. time when overlapped using 4 streams  : 4.308822 ms
 Avg. speedup gained (serialized - overlapped)  : 1.804733 ms

Measured throughput:
 Fully serialized execution     : 5.488530 GB/s
 Overlapped using 4 streams     : 7.787379 GB/s
[simpleMultiCopy] test results...
PASSED
[simpleMultiCopy]正在启动。。。
[Tesla C2050]具有14MP(s)x 32(芯数/MP)=448(芯数)
>设备名称:特斯拉C2050
>具有14个多处理器的CUDA能力2.0硬件
>比例系数=1.00
>阵列大小=4194304
此CUDA设备的相关属性
(十) 可以将一个CPUGPU数据传输与GPU内核执行重叠(设备属性“deviceOverlap”)
(十) 可以与GPU内核执行重叠两个CPUGPU数据传输
(计算能力>=2.0和(特斯拉产品或Quadro 4000/5000)
测量的计时(吞吐量):
Memcpy主机到设备:2.725792毫秒(6.154988 GB/s)
Memcpy设备到主机:2.723360毫秒(6.160484 GB/s)
内核:0.611264毫秒(274.467599 GB/s)
重叠数据传输的加速比理论极限:
完全没有重叠(传输内核传输):6.060416毫秒
计算可与一次传输重叠:5.449152毫秒
计算可以与两种数据传输重叠:2.725792毫秒
10次重复的平均测量计时:
执行完全序列化时的平均时间:6.113555毫秒
使用4个流重叠时的平均时间:4.308822 ms
获得的平均加速比(序列化-重叠):1.804733 ms
测量吞吐量:
完全序列化执行:5.488530 GB/s
使用4个流重叠:7.787379 GB/s
[简单副本]测试结果。。。
通过

这表明预期的运行时间是2.7毫秒,而实际需要4.3毫秒。到底是什么导致了这种差异?(我也在上发布了这个问题。)

第一次内核启动在第一次memcpy完成之前无法启动,而最后一次memcpy在最后一次内核启动完成之前无法启动。因此,存在“悬置”这会带来一些您正在观察到的开销。您可以通过增加流的数量来减小“悬置”的大小,但是流的引擎间同步会产生自己的开销


需要注意的是,重叠计算+传输并不总是有益于给定的工作负载-除了上面描述的开销问题外,工作负载本身必须花费相同的时间进行计算和数据传输。根据阿姆达尔定律,随着工作负载变为传输-f,2倍或3倍的潜在加速比下降ound或compute bound.

在第一个memcpy完成之前,第一个内核启动无法启动,而在最后一个内核启动完成之前,最后一个memcpy无法启动。因此,有一个“悬置”引入了一些您正在观察的开销。您可以减小“悬置”的大小通过增加流的数量,但是流的引擎间同步会产生自身的开销


需要注意的是,重叠计算+传输并不总是有益于给定的工作负载-除了上面描述的开销问题外,工作负载本身必须花费相同的时间进行计算和数据传输。根据阿姆达尔定律,随着工作负载变为传输-f,2倍或3倍的潜在加速比下降ound或compute-bound.

在实际应用中很重要的悬垂在本测试程序的测量中被消除。我用10000次而不是10次重复运行了该程序,得到了相同的值(小于0.01 ns的差值)您是对的,如果工作负载是传输或计算繁重的,相对增益会低得多。但我并不期望2倍或3倍的速度,而是一个运行时间,这是所涉及的三个操作中的最大值。实际运行时间几乎要长60%,这必须来自某个地方。为什么在这种情况下会有60%的速度,会发生什么对于其他GPU?虽然在实际应用中很重要,但在本测试程序中,从测量中消除了悬垂。我以10000次而不是10次重复运行了该程序,并获得了相同的值(小于0.01 ns的差值)您是对的,如果工作负载是传输或计算繁重的,相对增益会低得多。但我并不期望2倍或3倍的速度,而是一个运行时间,这是所涉及的三个操作中的最大值。实际运行时间几乎要长60%,这必须来自某个地方。为什么在这种情况下会有60%的速度,会发生什么对于其他GPU?