2017-06-21 4 views
0

Ich bin sehr neu in Metal und experimentiere mit seinen Rechenfunktionen. Ich habe das folgende Stück Code in Swift 3 auf macOS geschrieben:Metal Compute - Einen bereits in die Warteschlange eingereihten Befehlspuffer in die Warteschlange stellen

repeat 
{ 
    metalCommandBuffer.enqueue() 
    metalCommandBuffer.commit() 
    metalCommandBuffer.waitUntilCompleted() 
    copy variable back to CPU 
} 
while {check the variable == 0} 

Ich möchte den Host einen Rechenkern, kopieren Sie die Variable auszuführen zurück und überprüfen, ob eine bestimmte Bedingung erfüllt ist. Wenn dies der Fall ist, führe den Kernel weiter aus, bis es anders läuft.

Allerdings bekomme ich folgende Fehlermeldung:

error 'enqueue an already enqueued command buffer'

Ich habe versucht, nur die, die in der Schleife binden und waitUntilCompleted aber dann bekomme ich:

error 'commit an already committed command buffer'

Ich habe ein bisschen von CUDA Wissen und als Folge davon kann ich Metal etwas missbrauchen.
Danke.

Antwort

2

Sie können einen solchen Befehlspuffer nicht wiederverwenden.

Sie müssen einen neuen Befehlspuffer erstellen, einen neuen Compute-Befehlscodierer erstellen, die Befehle codieren, die Codierung beenden und dann den Befehlspuffer jedes Mal durch die Schleife übergeben.

+0

Danke. Muss der Speicher des vorherigen Puffers und Encoders gelöscht/gelöscht werden oder ist das nicht notwendig? – GreenApples53

+0

Die Objekte werden freigegeben, wenn Sie die starken Referenzen auf diese Objekte löschen oder zurücksetzen oder sie außerhalb des Bereichs zulassen. Swift verwendet die automatische Referenzzählung, sodass Sie nichts Besonderes tun müssen. –

Verwandte Themen