2016-10-25 1 views
0

Ich habe ein Programm, das ein Gradientenbild erzeugt. Wenn ich dies für meine GPU kompilieren und Blick auf den Ausgang der compile_to_lowered_stmnt ich es sehe beginnt mit (nach dem Ertrag Anweisung) ein halide_copy_to_host und startet dann die äußere Schleife. Wenn ich Funktionen neste, ist der Halogenid_copy_to_host an der gleichen Position, aber dann für die äußerste Funktion. Hinweis Ich mache nichts mit der Planung. Ich würde gerne verstehen, warum es an diesem Ort ist. Ich erwarte, dass es am Ende des Programms ist, um das Ergebnis zurück auf den Host zu kopieren, nicht erst, bevor die Berechnungen abgeschlossen sind. Und wenn ich möchte, dass das Ergebnis auf der GPU bleibt (z. B. Ausgabe auf Bildschirm), sollte der Algorithmus schneller ohne die Kopie laufen. Gibt es eine Möglichkeit, den halogenid_copy_to_host zu "entfernen"?Warum wird die letzte func in einer Reihe mit halide_copy_to_host beginnen, und wie es zu entfernen

Antwort

0

Die copy_to_host ist wahrscheinlich dort, falls der Ausgangspuffer ist auf der GPU schmutzig. Wenn dies der Fall ist und wir nicht auf den Host kopiert haben, haben Sie einen Puffer auf der CPU und der GPU, der unmöglich abzugleichen ist, ohne zu verfolgen, welche Teile des Puffers auf jeder GPU gegenüber der CPU schmutzig sind.

ist jedoch copy_to_host eine no-op, wenn die dev_dirty Flag auf false gesetzt ist, so sollte es nicht wirklich etwas in Ihrem Fall tun. Ich denke, dass es wahrscheinlich keine Kopien gibt. Wenn Sie das Flag -debug target aktivieren, können Sie selbst überprüfen.

Halide keine copy_to_host nach GPU-falls wollen Sie das Ergebnis auf der GPU zu bleiben, aus den Gründen, sagen Sie.

+0

ok, ich verstehe. Später im Code sehe ich einen Aufruf von set_dev_dirty. Woher weiß ich, welcher Teil meines Codes diese Anweisung generiert und/oder wie verhindere ich dies? – pietervanderstar

+0

Ich habe jemanden gesehen, der vorgeschlagen hat, den Hostzeiger auf NULL zu setzen, bedeutet das, dass dies nur für AOT kompilierte Halogenid funktioniert? – pietervanderstar

+0

Hat es funktioniert. Sie müssen einen Puffer verwenden und diesen Puffer an die Realisierungsfunktion übergeben. Dann können Sie es mit copy_to_host zum Host bringen, wenn Sie möchten. Wenn man sich den gesenkten Code anschaut, sieht man aber immer noch das set_dev_dirty und das copy_to_device ist ebenfalls im Code, aber es scheint, dass es nicht mehr aufgerufen wird. – pietervanderstar

Verwandte Themen