tengo núcleo simple:OpenCL escalar del vector vs
__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];
}
Por qué cuando cambio flotante a float4, kernel se ejecuta más de un 30% más lento?
Todos los tutoriales dice, que el uso de tipos de vectores acelera la computación ...
Por el lado de host, la memoria alocated de argumentos float4 es de 16 bytes alineados y global_work_size para clEnqueueNDRangeKernel es 4 veces más pequeños.
Kernel se ejecuta en AMD HD5770 GPU, AMD-APP-SDK-v2.6.
info Dispositivo para CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT devuelve 4.
EDIT:
global_work_size = 1024 * 1024 (y mayor)
local_work_size = 256
tiempo medido usando CL_PROFILING_COMMAND_START y CL_PROFILING_COMMAND_END.
Para global_work_size más pequeño (8196 para float/2048 para float4), la versión vectorizada es más rápida, pero me gustaría saber, ¿por qué?
¿Cuáles son los valores del tamaño del trabajo global y el tamaño del grupo de trabajo? ¿A qué hora estás midiendo y cómo? –
tamaño de trabajo global = 1024 * 1024 tamaño de trabajo local = 256, mido el tiempo de clEnquueNDRangeKernel con CL_PROFILING_COMMAND_START y CL_PROFILING_COMMAND_END. Para global_work_size más pequeño (8196 para float/2048 para float4), la versión vectorizada es más rápida, pero me gustaría saber, ¿por qué? – ldanko
La diferencia entre el tamaño de trabajo más pequeño y más grande puede deberse a su caché constante. Por lo tanto, 2 preguntas: 1) si elimina la const, ¿es aún más rápido para pequeño y más lento para grande? 2) si va a algún lugar intermedio, digamos 65536 para flotar y 16384 para float4, ¿qué ocurre entonces? – user1111929