Я работаю над проектом C++ с использованием OpenCL. Я использую CPU как устройство OpenCL с intel OpenCL runtimeWeird OpenCL вызывает побочный эффект на C++ для производительности цикла
Я заметил странный побочный эффект при вызове функций OpenCL. Вот простой тест:
#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);
}
Это простой цикл, который читает файл символ на гольца и добавляет их, так что компилятор не пытается оптимизировать его.
Моя система Core i7-4770K, 2TB HDD 16GB DDR3 работает Ubuntu 14.10. Программа выше, с файлом 100 Мбайт в качестве входных данных, занимает около 770 мс. Это соответствует скорости моего жесткого диска. Все идет нормально.
Если вы теперь инвертируете комментарии и запускаете только зону вызовов OpenCL, она занимает около 200 мс. Опять же, до сих пор, так хорошо.
Buf, если вы раскомментируете все, программа занимает более 2000 мс. Я ожидал бы 770 мс + 200 мс, но это 2000 мс. Вы даже можете заметить увеличение задержки между выходными сообщениями в цикле for. Предполагается, что два региона (вызовы OpenCL и считывающие символы) являются независимыми.
Я не понимаю, почему использование OpenCL мешает простой работе C++ for loop. Это не простая задержка инициализации OpenCL.
Я компиляция этого примера с:
g++ weird.cpp -O2 -lOpenCL -o weird
Я также попытался с помощью Clang ++, но это происходит то же самое.
Я получил то же самое на OS X с g ++. 0.012s только для первого, 14.447s для второго только, а затем 14.874s для обоих. Это должно быть чем-то вроде открытия очереди команд в CPU. – sabreitweiser