ho semplice kernel:OpenCL scalare vs vettore
__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];
}
Perché quando cambio galleggiante float4, kernel viene eseguito più lentamente oltre il 30%?
Tutti i tutorial dice, che utilizzando i tipi di vettore accelera calcolo ...
Sul lato host, memoria alocated per argomenti float4 è 16 byte allineati e global_work_size per clEnqueueNDRangeKernel è 4 volte più piccolo.
Il kernel gira su GPU AMD HD5770, AMD-APP-SDK-v2.6.
Info dispositivo per CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT torna 4.
EDIT:
global_work_size = 1024 * 1024 (e versioni successive)
local_work_size = 256
Tempo misurata utilizzando CL_PROFILING_COMMAND_START e CL_PROFILING_COMMAND_END.
Per le dimensioni globali global_work_size (8196 per float/2048 per float4), la versione vettoriale è più veloce, ma mi piacerebbe sapere perché?
Quali sono i valori della dimensione del lavoro globale e delle dimensioni del gruppo di lavoro? A che ora stai misurando e come? –
dimensioni lavoro globale = 1024 * 1024 dimensione lavoro locale = 256, Misuro il tempo di clEnquueNDRangeKernel utilizzando CL_PROFILING_COMMAND_START e CL_PROFILING_COMMAND_END. Per la dimensione globale global_work (8196 per float/2048 per float4), la versione vettoriale è più veloce, ma mi piacerebbe sapere perché? – ldanko
La differenza tra le dimensioni del lavoro più piccole e più grandi può essere dovuta alla cache costante. Quindi 2 domande: 1) se rimuovi il const, è ancora più veloce per i piccoli e più lento per i grandi? 2) se si va da qualche parte in mezzo, diciamo 65536 per float e 16384 per float4, cosa succede allora? – user1111929