Swift 金属计算-将已排队的命令缓冲区排队

Swift 金属计算-将已排队的命令缓冲区排队,swift,gpgpu,metal,Swift,Gpgpu,Metal,我对金属非常陌生,我正在试验它的计算功能。 我在macOS上用Swift 3编写了以下代码: repeat { metalCommandBuffer.enqueue() metalCommandBuffer.commit() metalCommandBuffer.waitUntilCompleted() copy variable back to CPU } while {check the variable == 0} 我想执行一个计算内核,将变量复制回主机

我对金属非常陌生,我正在试验它的计算功能。 我在macOS上用Swift 3编写了以下代码:

repeat
{ 
    metalCommandBuffer.enqueue()
    metalCommandBuffer.commit()
    metalCommandBuffer.waitUntilCompleted()
    copy variable back to CPU
}
while {check the variable == 0}
我想执行一个计算内核,将变量复制回主机,并检查是否满足某些条件。如果是,则继续执行内核,直到相反

但是,我得到以下错误:

错误“将已排队的命令缓冲区排队”

我已经尝试在循环中完成commit和waituntlcomplete,但是我得到:

“提交已提交的命令缓冲区”错误

我有一点CUDA知识,因此可能有点误用金属。

谢谢。

您不能重复使用那样的命令缓冲区


您必须创建新的命令缓冲区,创建新的计算命令编码器,对命令进行编码,结束编码,然后每次通过循环提交命令缓冲区。

谢谢。是否需要处置/清除前一个缓冲区和编码器使用的内存,或者这不是必需的?当您清除或重新设置对对象的强引用,或者允许对象超出范围时,对象将被释放。Swift使用自动引用计数,因此您无需做任何特殊的操作。