我有一个类似这样的代码。
1)主机:启动图形内核2)主机:启动CUDA内核(所有异步调用) 3)主机:在主机上执行一系列数字运算4)返回步骤1
我的问题是。CUDA API保证CUDA内核即使是异步的,也会按启动顺序执行。这是否适用于渲染?假设我在GPU上进行了一些渲染相关的计算。如果我启动异步CUDA调用,它们是否只在渲染完成后才执行?或者这两个操作会重叠吗?
此外,如果我在步骤2之后调用CUDA设备同步,它肯定会强制设备完成CUDA相关函数调用。那么渲染呢?它是否会停止主机,直到渲染相关的操作也完成?
发布于 2014-02-07 10:58:36
调用CUDA内核会以某种方式锁定GPU,因此不支持GPU的任何其他用法。主机代码的每个进程必须在特定上下文中执行设备代码,并且一次只能在单个设备上激活一个上下文。
Callig cudaDeviceSynchronize();阻止调用主机代码。在完成所有设备代码流的执行后,控制权将返回给调用主机代码。
编辑:查看this非常全面但有些过时的答案,你可以研究this论文,看看哪些是最后的设备。简而言之,启动CUDA内核,甚至在正在被另一个线程并发使用的设备上调用cudaSetDevice(),都会因为抛出一些错误而崩溃。如果您希望通过并发CUDA进程利用GPU,则有可能(在纯linux计算机上)在主机线程和CUDA API调用之间使用某种类型的中间层(称为MPS)。这在我的second链接中有描述。
https://stackoverflow.com/questions/21618066
复制相似问题