Я только начал с разработки OpenCL и пытался сравнить время выполнения CPU и GPU с одним рабочим элементом в действительно простой операции, выполнение которой должно занять некоторое время.Теперь я ожидаю, что один рабочий элемент занимает примерно столько же времени, сколько и процессор, или что он будет еще медленнее.В результате я получаю намного более быстрое выполнение для одного рабочего элемента, и для меня это не имеет смысла.
Это код ядра:
kernel void hello(global ulong *val) {
size_t i = get_global_id(0);
for (ulong k = 0; k < 100000; k++) {
for (ulong j = 0; j < 1000000; j++) {
val[i] += 1;
}
}
}
В коде хоста я измеряю время с помощью события:
cl_event event;
ret = clEnqueueTask(command_queue, kernel, 0, NULL, &event);
ret = clEnqueueReadBuffer(command_queue, memobj, CL_TRUE, 0, sizeof(cl_mem), val, 0, NULL, NULL);
ret = clFlush(command_queue);
ret = clFinish(command_queue);
clWaitForEvents(1, &event);
cl_ulong time_start;
cl_ulong time_end;
clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_QUEUED, sizeof(cl_ulong), &time_start, NULL);
clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &time_end, NULL);
double nanoSeconds = (double) (time_end - time_start);
printf("OpenCl Execution time is: %f milliseconds \n",nanoSeconds / 1000000.0);
ЦПУ выполняет код C ++, который делает то же самое, что и ядро.Результаты одинаковы, но выполнение CPU занимает около 255 секунд, а GPU - всего 0,15 миллисекунды!Я неправильно измеряю время или есть разумное объяснение этому?