我看待Process One& amp;过程二(下面),相当于它们花费相同的时间。我错了吗?
allOfData_A= data_A1 + data_A2
allOfData_B= data_B1 + data_B2
allOFData_C= data_C1 + data_C2
Data_C is the output of the kernel operation of both Data_A & Data_B. (Like C=A+B)
The HW supports one DeviceOverlap (concurrent) operation.
流程一:
MemcpyAsync data_A1 stream1 H->D
MemcpyAsync data_A2 stream2 H->D
MemcpyAsync data_B1 stream1 H->D
MemcpyAsync data_B2 stream2 H->D
sameKernel stream1
sameKernel stream2
MemcpyAsync result_C1 stream1 D->H
MemcpyAsync result_C2 stream2 D->H
过程二:(操作相同,顺序不同)
MemcpyAsync data_A1 stream1 H->D
MemcpyAsync data_B1 stream1 H->D
sameKernel stream1
MemcpyAsync data_A2 stream2 H->D
MemcpyAsync data_B2 stream2 H->D
sameKernel stream2
MemcpyAsync result_C1 stream1 D->H
MemcpyAsync result_C2 stream2 D->H
答案 0 :(得分:3)
使用CUDA流允许程序员通过将相关操作放在同一个流中来表达工作依赖性。不同流中的工作是独立的,可以同时执行。
在没有HyperQ的GPU上(计算能力1.0到3.0),您可以获得错误的依赖关系,因为DMA引擎或计算的工作被放入单个硬件管道中。计算能力3.5带来HyperQ,允许多个硬件管道,你不应该得到错误的依赖。 simpleHyperQ示例说明了这一点,documentation显示的图表更清楚地解释了什么。
简单地说,在没有HyperQ的设备上,您需要先进行广度的工作以获得最大的并发性,而对于使用HyperQ的设备,您可以进行深度优先启动。避免错误依赖很容易,但不必担心它更容易!