CUDA 定义了一些参数,我不太确定 CUDA 的行为方式,如果我必须尊重它们,或者如果我不尊重它们,它确实会运行,但可能不会获得最佳性能。
查看时cudaGetDeviceProperties
我可以看到一些参数(取自NVidia网站:https ://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__DEVICE.html#group__CUDART__DEVICE_1g1bf9d625a931d657e08db2b4391170f0 :
concurrentKernels
:设备可能可以同时执行多个内核
这只是一个标志还是有任何影响?我认为并发内核只有在使用流时才有意义,对吧?(另请参阅 asyncEngineCount)。
asyncEngineCount
:异步引擎数量
这是上面给出的可以并行运行的内核数量吗?另外,我认为这只在使用流时才有效,对吗?
这让我想到了一个关于流的更普遍的问题。总共可以使用或分配多少个流?例如,如果asyncEngineCount
是 3,那么拥有 3 个以上的流是否有意义?如果我所说的不是真的,那么分配比asyncEngineCount
.
如果我分配的流多于 asyncEngineCount 并让多个内核同时运行,会发生什么情况?假设我分配 10 个流并同时运行 10 个内核,但 asyncEngineCount 只有 3 个。CUDA 是否会一次只运行 3 个内核,而其他内核会被阻塞,直到有一个流空闲为止?
我总是将流解释为一个简单的同步对象,当调用 CUDA 异步方法时,该对象不会发出信号,以便其他方法等待该方法退出并且流设置为有信号,但这似乎是我这边的过于简单的解释?
我找不到关于异步执行和流的很好的解释,也许有更深入的见解。CUDA文档似乎没有解释细节。也许网络或书籍上有很好的解释?