Ios 在Metal中并发运行多个计算内核

Ios 在Metal中并发运行多个计算内核,ios,macos,metal,Ios,Macos,Metal,(如何)我可以在Metal中并发运行多个计算内核(我不一定需要它们同时并行运行,并发执行就足够了) 两个不同的MTLCommandQueues(在同一设备上)中的MTLCommandBuffers是否同时执行(即队列的行为是否类似于CUDA流?) 注意:我不能进一步将内核拆分为更小的子内核。我认为您不能。据我所知,GPU每次只执行一个内核。当然,在内核中,事情可以(也应该)并行完成。你到底想实现什么?@MatthijsHollemans嗨,我需要实现某种QoS(类似于GCD中的DispatchQ

(如何)我可以在Metal中并发运行多个计算内核(我不一定需要它们同时并行运行,并发执行就足够了)

两个不同的
MTLCommandQueue
s(在同一设备上)中的
MTLCommandBuffer
s是否同时执行(即队列的行为是否类似于CUDA流?)


注意:我不能进一步将内核拆分为更小的子内核。

我认为您不能。据我所知,GPU每次只执行一个内核。当然,在内核中,事情可以(也应该)并行完成。你到底想实现什么?@MatthijsHollemans嗨,我需要实现某种QoS(类似于GCD中的
DispatchQueue
QoSes),这样我就可以在需要时运行后台优先级计算内核(例如,当外部事件触发时(通过网络、用户交互等))我可以分派非常高优先级的计算任务,这意味着后台优先级的计算可以暂停,直到最高优先级的计算完成(比如中断)。(我想可能会有一个StreamingMultiprocessor可用于高优先级任务,其余的可以执行后台任务。)没有后台优先级计算内核。一个计算内核应该只运行很短的时间(如果超过10秒,它就会被终止,但某些操作的终止速度要快得多,例如,我发现如果一个循环超过0.5秒,GPU就会终止该作业)。因此,如果你想让内核一直运行(例如,处理视频帧),你必须自己安排一个计时器或其他东西。所以,如果一个高优先级的任务出现在你的计划中,那么你就要安排内核而不是低优先级的;一种调度程序,它可以将提交给它的所有内核粒度化,一次只调度内核的几个线程组,从而提供显式交错作业的可能性。这种方法的问题是,我不知道单个分派的子问题需要多长时间才能完成(即,我对子问题的执行时间没有任何上限),这意味着我无法确保在提交后立即安排最优先的任务。我承认这是金属做不到的。