Die folgenden Codes fügen zwei Vektoren mit boost.compute bzw. opencl c ++ - Wrapper hinzu. Das Ergebnis zeigt, dass boost.compute fast 20-mal langsamer ist als der opencl C ++ - Wrapper. Ich frage mich, ob ich boost.compute missbrauche oder es ist in der Tat langsam. Plattform: win7, vs2013, boost 1.55, boost.compute 0.2, ATI Radeon HD 4600
Code verwendet den C ++ - Wrapper:
%Vor%Der Code verwendet boost.compute:
%Vor% Der Kernel-Code, der von der Funktion transform()
in Boost.Compute generiert wird, sollte fast gleich sein identisch mit dem Kernel-Code, den Sie in der C ++ - Wrapper-Version verwenden (auch wenn Boost.Compute etwas abrollt).
Der Grund dafür, dass Sie einen Unterschied in den Timings feststellen, besteht darin, dass Sie in der ersten Version nur die Zeit messen, die benötigt wird, um den Kernel einzuordnen und die Ergebnisse dem Host zuzuordnen. In der Boost.Compute-Version messen Sie auch die Zeit, die benötigt wird, um den transform()
-Kernel zu erstellen, zu kompilieren und dann auszuführen. Wenn Sie einen realistischeren Vergleich wünschen, sollten Sie die Gesamtausführungszeit für das erste Beispiel einschließlich der Zeit messen, die für das Einrichten und Kompilieren des OpenCL-Programms benötigt wird.
Diese Initialisierungsstrafe (die dem Laufzeitkompilierungsmodell von OpenCL inhärent ist) wird in Boost.Compute etwas gemildert, indem kompilierte Kernel während der Laufzeit automatisch zwischengespeichert werden (und optional auch offline zur Wiederverwendung bei der nächsten Ausführung des Programms zwischengespeichert werden) ). Der Aufruf von transform()
ist nach dem ersten Aufruf viel schneller.
P.S. Sie können auch die Core-Wrapper-Klassen in Boost.Compute verwenden (wie device
und < a href="http://kylelutz.github.io/compute/boost/compute/context.html"> context
) zusammen mit den Container-Klassen (wie vector<T>
) und weiterhin eigene benutzerdefinierte Kernel ausführen.
Tags und Links c++ boost opencl boost-compute