0

我看到流程一和流程二(如下)的方式是相同的,因为它们花费的时间相同。我错了吗?

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
4

1 回答 1

3

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

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

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

于 2013-02-12T17:38:50.420 回答