Ich arbeite an einem C++ - Projekt, das OpenCL verwendet. Ich benutze die CPU als ein OpenCL-Gerät mit der intel OpenCL runtimeWeird OpenCL ruft Nebeneffekt auf C++ für Schleife Leistung
Ich bemerkte einen seltsamen Nebeneffekt beim Aufruf von OpenCL-Funktionen. Hier ist ein einfacher Test:
#include <iostream>
#include <cstdio>
#include <vector>
#include <CL/cl.hpp>
int main(int argc, char* argv[])
{
/*
cl_int status;
std::vector<cl::Platform> platforms;
cl::Platform::get(&platforms);
std::vector<cl::Device> devices;
platforms[1].getDevices(CL_DEVICE_TYPE_CPU, &devices);
cl::Context context(devices);
cl::CommandQueue queue = cl::CommandQueue(context, devices[0]);
status = queue.finish();
printf("Status: %d\n", status);
*/
int ch;
int b = 0;
int sum = 0;
FILE* f1;
f1 = fopen(argv[1], "r");
while((ch = fgetc(f1)) != EOF)
{
sum += ch;
b++;
if(b % 1000000 == 0)
printf("Char %d read\n", b);
}
printf("Sum: %d\n", sum);
}
Es ist eine einfache Schleife, die eine Datei char von char liest und fügt sie so dass der Compiler nicht versucht, es zu optimieren aus.
Mein System ist ein Core i7-4770K, 2 TB HDD 16 GB DDR3 Ubuntu 14.10. Das obige Programm mit einer Datei von 100 MB als Eingabe benötigt ungefähr 770 ms. Dies entspricht meiner HDD-Geschwindigkeit. So weit, ist es gut.
Wenn Sie jetzt die Kommentare invertieren und nur die OpenCL-Aufrufregion ausführen, dauert es etwa 200 ms. Nochmal so weit, so gut.
Buf, wenn Sie alle auskommentieren, dauert das Programm mehr als 2000ms. Ich würde 770ms + 200ms erwarten, aber es sind 2000ms. Sie können sogar eine erhöhte Verzögerung zwischen den Ausgabenachrichten in der for-Schleife bemerken. Die beiden Regionen (OpenCL-Aufrufe und Lesezeichen) sollen unabhängig sein.
Ich verstehe nicht, warum die Verwendung von OpenCL mit einer einfachen C++ for-Schleife Leistung stört. Es ist keine einfache OpenCL-Initialisierungsverzögerung.
Ich Kompilieren dieses Beispiel mit:
g++ weird.cpp -O2 -lOpenCL -o weird
Ich habe auch versucht Clang ++ verwenden, aber es passiert das gleiche.
Ich habe das gleiche unter OS X mit g ++. 0,012s nur für das erste, 14,447s nur für das zweite und dann 14,874s für beide. Es muss etwas über das Öffnen der Befehlswarteschlange für die CPU sein. – sabreitweiser