我有一个在我的 GPU (GeForce 690) 上运行并使用单个块的内核。它在大约160
几微秒内运行。我的计划是分别启动8
这些内核,每个内核只使用一个块,因此每个内核都将在单独的 SM 上运行,然后它们将同时运行,希望在大约160
几微秒内。
但是,当我这样做时,总时间会随着每个内核线性增加:320
如果我运行2
内核,则为微秒,内核约为490
微秒3
,等等。
我的问题:我是否需要在某处设置任何标志以使这些内核同时运行?还是我必须做一些不明显的事情?
我有一个在我的 GPU (GeForce 690) 上运行并使用单个块的内核。它在大约160
几微秒内运行。我的计划是分别启动8
这些内核,每个内核只使用一个块,因此每个内核都将在单独的 SM 上运行,然后它们将同时运行,希望在大约160
几微秒内。
但是,当我这样做时,总时间会随着每个内核线性增加:320
如果我运行2
内核,则为微秒,内核约为490
微秒3
,等等。
我的问题:我是否需要在某处设置任何标志以使这些内核同时运行?还是我必须做一些不明显的事情?
正如@JackOLantern 所指出的,并发内核需要使用流,这是GPU 上所有形式的异步活动调度所必需的。一般来说,它还需要计算能力为 2.0 或更高的 GPU。如果您在应用程序中不使用流,则所有 cuda API 和内核调用都将按照它们在代码中发出的顺序依次执行,从一个调用/内核到下一个调用/内核没有重叠。
请查看JackOlantern 引用的并发内核 cuda 示例,而不是在这里提供完整的教程。
另请注意,由于各种原因,在 Windows 上实际见证并发执行可能会更加困难。如果您运行并发内核示例,它将很快指示您所在的环境(操作系统、驱动程序等)是否提供并发执行。