Протестировал пропускную способность PCIe с OpenCL, и я получаю странные результаты.
Я использую PCIe 3, x16.
DATA_SIZE = 2097152 (int)
Размер данных в байтах = 8,388608 МБ
Код следующий:
struct timeval tv1, tv2;
gettimeofday(&tv1, NULL);
err=clEnqueueWriteBuffer(the_queue, dev_buffer, CL_TRUE, 0, (size_t)sizeof(int)*DATA_SIZE, (void *)host_buffer, 0, NULL, &event);
if (err != CL_SUCCESS) {
printf("Error:clEnqueueWriteBuffer:dbuff_in(code %d)\n\n", err );
exit(0);
}
clFinish(the_queue);
gettimeofday(&tv2, NULL);
printf ("Total time = %f seconds\n",
(double) (tv2.tv_usec - tv1.tv_usec) / 1000000 +
(double) (tv2.tv_sec - tv1.tv_sec));
err=clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_END,sizeof(cl_ulong), &end, NULL);
if (err != CL_SUCCESS) {
printf("Error in profiling !!!Err code %d\n\n", err );
exit(0);
}
err=clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_START,sizeof(cl_ulong), &start, NULL);
if (err != CL_SUCCESS) {
printf("Error in profiling !!!Err code %d\n\n", err );
exit(0);
}
transfertime=transfertime+(end - start) * 1.0e-6f;
printf("%f ",transfertime/1000);
При запуске этого кода я получаю следующие результаты:
Общее время = 11,2 мс
Время передачи = 0,02 мс
Примечание: я использовал два разных метода для измерения времени передачи: один использует информацию профилирования OpenCL, другой - просто измерение начала и конца кода.
Принимая во внимание, что пропускная способность PCIe3 x16 составляет 15,62884615 ГБ, теоретическое время передачи моих данных составит ~ 0,54 мс.
Используя профилирование для бенчмаркинга, я получил результат, который примерно на 25 быстрее, чем теоретический максимум PCIe3, при использовании стандартного бенчмаркинга (начало-конец кода) я получил результат, ~ 20 раз меньше теоретической скорости.
Не могли бы вы поделиться своим опытом с этим.
Какой правильный способ оценки? И вообще, почему поведение так странно?
PS. Устройство ПЛИС (ВУ9П)