CUDA中未并发运行的内核

CUDA中未并发运行的内核,cuda,Cuda,我有一个内核,运行在我的GPU GeForce 690上,使用一个块。它的运行时间约为160微秒。我的计划是分别启动其中8个内核,每个内核只使用一个块,因此每个内核将在单独的SM上运行,然后它们都将并发运行,希望在160微秒左右 然而,当我这样做时,总时间随着每个内核线性增加:如果我运行2个内核,则为320微秒;如果运行3个内核,则为490微秒,以此类推 我的问题是:我需要在某个地方设置任何标志以使这些内核同时运行吗?或者我必须做一些不明显的事情吗?正如@JackOLantern所指出的,并发内

我有一个内核,运行在我的GPU GeForce 690上,使用一个块。它的运行时间约为160微秒。我的计划是分别启动其中8个内核,每个内核只使用一个块,因此每个内核将在单独的SM上运行,然后它们都将并发运行,希望在160微秒左右

然而,当我这样做时,总时间随着每个内核线性增加:如果我运行2个内核,则为320微秒;如果运行3个内核,则为490微秒,以此类推


我的问题是:我需要在某个地方设置任何标志以使这些内核同时运行吗?或者我必须做一些不明显的事情吗?

正如@JackOLantern所指出的,并发内核需要使用流,这是GPU上所需要的。一般来说,它还需要具有2.0或更高计算能力的GPU。如果在应用程序中不使用流,则所有cuda API和内核调用都将按代码中发出的顺序顺序顺序执行,从一个调用/内核到下一个调用/内核没有重叠

与其在这里给出完整的教程,不如回顾一下Jackolanten引用的


还请注意,由于各种原因,在windows上实际见证并发执行可能会更加困难。如果您运行concurrent kernels示例,它将很快指示您在操作系统、驱动程序等中的环境是否提供并发执行。

因为@JackOLantern指示并发内核需要使用流,这是GPU上所需的。一般来说,它还需要具有2.0或更高计算能力的GPU。如果在应用程序中不使用流,则所有cuda API和内核调用都将按代码中发出的顺序顺序顺序执行,从一个调用/内核到下一个调用/内核没有重叠

与其在这里给出完整的教程,不如回顾一下Jackolanten引用的


还请注意,由于各种原因,在windows上实际见证并发执行可能会更加困难。如果您运行concurrent kernels示例,它将很快指示您所在的操作系统、驱动程序等环境是否提供并发执行。

您是否使用streams?也许我错了,但是如果你只是单独运行8个内核,它们将在默认流中按顺序执行。看一看CUDA安装中提供的concurrentKernels SDK示例。@JackOLantern所说的很可能是真的:如果不为每个内核定义流,那么相同的流将按顺序执行所有操作。因此,您需要显式定义8个cudaStream_t。我有几乎相同的图形卡,它可以在上面工作,所以这可能就是正在发生的事情。您使用的是streams吗?也许我错了,但是如果你只是单独运行8个内核,它们将在默认流中按顺序执行。看一看CUDA安装中提供的concurrentKernels SDK示例。@JackOLantern所说的很可能是真的:如果不为每个内核定义流,那么相同的流将按顺序执行所有操作。因此,您需要明确定义8个cudaStream_t。我有一个几乎相同的图形卡,它可以在上面工作,所以这可能就是正在发生的事情。