流调度顺序

时间:2013-02-12 16:53:16

标签: cuda cuda-streams

我看待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

1 个答案:

答案 0 :(得分:3)

使用CUDA流允许程序员通过将相关操作放在同一个流中来表达工作依赖性。不同流中的工作是独立的,可以同时执行。

在没有HyperQ的GPU上(计算能力1.0到3.0),您可以获得错误的依赖关系,因为DMA引擎或计算的工作被放入单个硬件管道中。计算能力3.5带来HyperQ,允许多个硬件管道,你不应该得到错误的依赖。 simpleHyperQ示例说明了这一点,documentation显示的图表更清楚地解释了什么。

简单地说,在没有HyperQ的设备上,您需要先进行广度的工作以获得最大的并发性,而对于使用HyperQ的设备,您可以进行深度优先启动。避免错误依赖很容易,但不必担心它更容易!