Pracuję nad projektem C++ za pomocą OpenCL. Używam procesora jako urządzenia OpenCL z Zauważyłem dziwny efekt uboczny podczas wywoływania funkcji OpenCL. Oto prosty test:Weird OpenCL wywołuje efekt uboczny w C++ dla wydajności pętli
#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);
}
To prosta pętla który odczytuje plik char przez char i dodaje je więc kompilator nie starają się optymalizować ją.
Mój system to Core i7-4770K, 2 TB HDD 16 GB DDR3 z systemem Ubuntu 14.10. Powyższy program, z plikiem 100 MB jako wejściem, zajmuje około 770 ms. Jest to zgodne z moją szybkością HDD. Jak na razie dobrze.
Jeśli teraz odwrócisz komentarze i uruchomisz tylko region połączeń OpenCL, zajmie to około 200ms. Znowu, jak dotąd, tak dobrze.
Buf, jeśli odkomentujesz wszystko, program zajmuje więcej niż 2000 ms. Spodziewałbym się 770ms + 200ms, ale to 2000ms. Można nawet zauważyć zwiększone opóźnienie między komunikatami wyjściowymi w pętli for. Dwa regiony (wywołania OpenCL i znaki do czytania) powinny być niezależne.
Nie rozumiem, dlaczego korzystanie z OpenCL zakłóca prostą wydajność pętli C++. To nie jest proste opóźnienie inicjowania OpenCL.
Mam kompilacji ten przykład z:
g++ weird.cpp -O2 -lOpenCL -o weird
Próbowałem też za pomocą szczęk ++, ale zdarza się to samo.
Mam to samo na OS X z g ++. 0,012s dla pierwszego tylko, 14,447 dla drugiego tylko, a następnie 14,874 dla obu. Musi to być coś na temat otwierania kolejki poleceń do procesora. – sabreitweiser