我有一个像这样的代码。
1)主机:启动图形内核2)主机:启动CUDA内核(所有异步调用)3)主机:在主机上做一堆数字4)返回步骤1
我的问题是这个。CUDA API保证CUDA内核即使是异步的,也可以按照启动来执行。这适用于渲染吗?可以说,我在GPU上正在进行一些相关的计算。如果我启动异步CUDA呼叫,只有在渲染完成后才执行它们?还是这两个操作会重叠?
另外,如果我在步骤2之后调用CUDA设备同步,则肯定会迫使该设备完成相关功能调用。那渲染呢?它是否会失望主机,直到渲染相关的操作也完成?
以某种方式调用cuda内核,因此不支持任何其他使用GPU的用法。主机代码的每个过程都必须在特定上下文中执行设备代码,并且唯一可以在单个设备上处于活动状态。
callig cudaDeviceSynchronize();
阻止了调用主机代码。完成所有设备代码流的执行后,控制将返回到调用主机代码。
编辑:请参阅这个非常全面但有些过时的答案,您可以研究本文,以了解最后设备的能力。简而言之,启动CUDA内核,甚至在通过丢弃一些错误通过另一个线程崩溃的设备上调用cudaSetDevice()
。如果您想通过并发的CUDA进程利用GPU,则有可能(仅Linux的机器上)在主机线程和CUDA API调用之间使用某种中层层(称为MPS)。这在我的第二个链接中描述。