Leistung: boost.compute vs. opencl C ++ - Wrapper

8

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%     
cqdjyy01234 28.05.2014, 02:40
quelle

2 Antworten

9

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.

    
Kyle Lutz 29.05.2014, 06:50
quelle
2
  1. Ich bin mir fast sicher, dass boost.compute größere Initialisierungskosten hat. Versuchen Sie viel komplexere Aufgabe, ist 8Kb Vektorhinzufügung zu einfach.
  2. Messen Sie in beiden Fällen die Ausführungszeit des OpenCL-Kernels. Es ist dasselbe, als der einzige Grund ist Overhead von boost.compute Seite.
  3. Überprüfen Sie, ob die Speicherzuweisungsflags für beide Fälle identisch sind.
Roman Arzumanyan 28.05.2014 14:27
quelle

Tags und Links