Странное поведение пропускной способности PCIe при использовании в OpenCL - PullRequest
1 голос
/ 13 марта 2019

Протестировал пропускную способность 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П)

...