У меня простое ядро:
__kernel vecadd(__global const float *A,
__global const float *B,
__global float *C)
{
int idx = get_global_id(0);
C[idx] = A[idx] + B[idx];
}
Почему, когда я изменяю float на float4 , ядро работает более чем на 30% медленнее?
Во всех уроках говорится, что использование векторных типов ускоряет вычисления ...
На стороне хоста память, выделенная для аргументов float4, выровнена на 16 байт, а global_work_size для clEnqueueNDRangeKernel в 4 раза меньше.
Ядро работает на графическом процессоре AMD HD5770, AMD-APP-SDK-v2.6.
Информация об устройстве для CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT возвращает 4.
EDIT:
global_work_size = 1024 * 1024 (и выше)
local_work_size = 256
Время измеряется с помощью CL_PROFILING_COMMAND_START и CL_PROFILING_COMMAND_END.
Для меньшего global_work_size (8196 для float / 2048 для float4) векторизованная версия быстрее, но я хотел бы знать, почему?