Frage

In OpenCL, habe ich einen Kernel, dass der Bedarf an komplexen und realen Daten zu betreiben. Ich könnte eine bedingte Anweisung stellen, dass die richtige Codezeile ruft dies zu handhaben, oder ich könnte zwei Kerne haben, dass ich anrufen und drücken Sie die bedingte Anweisung aus meinem Telefonvorwahl.

Dies ist offensichtlich schlecht für Wartbarkeit, aber ist es wichtig für die Leistung?

War es hilfreich?

Lösung

Wenn es nur eine bedingte Anweisung, nach meiner Erfahrung die Performance-Unterschied ist absolut vernachlässigbar ist, zumindest auf NVidia Hardware.

Im Grunde genommen, solange alle (oder die meisten) arbeits Elemente den gleichen Codepfad folgen, du bist in Ordnung. Da der Code-Pfad auf einem Kernel-Argumente in Ihrem Fall genommen hängt, folgen alle Arbeits-Elemente dem gleichen Weg.

Andere Tipps

Hängt etwas an, wo die bedingt ist. erster Code zur besseren Lesbarkeit, dann Leistung, nachdem Sie es haben gemessen und festgestellt, dass es ein Problem

zB. kernel_for_RGB_image und kernel_for_ABGR_image scheint wie eine vernünftige Nutzung, verschiedene Kernel effektiv zu entrollen einer tiefen inneren Schleife könnte eine größere Wartung Kopfschmerzen sein.

Ich denke, dass der beste Weg zu versuchen, tatsächlich ist und Benchmark zwei Varianten. In einigen Fällen mit mehreren bedingten Blöcken erstellt, wenn auch nur einer von ihnen ausgeführt wird, kann zu schlechter Leistung führen. Der Grund dafür ist GPRs (General Purpose Register). Der Compiler ordnet so viele Register, wie es für den ungünstigsten Fall benötigt werden,

kann ich eine solche Lösung vorschlagen: eine einzige Kernfunktion, aber mit Kompilierung-bedingter:

__kernel void work()
{
#if VAR
    // one code
#else
    // another code
#endif
}

Dann müssen Sie den Kernel mit true / false Satz VAR neu kompilieren, wenn die Bedingung zu ändern. Offensichtlich ist für den Compiler es unterscheidet sich nicht von zwei Kerne, aber für die Aufrechterhaltung kann besser sein, wenn ein Teil des Codes das gleiche für diese Kerne ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top