2012-09-20 16 views
6

Estoy intentando ejecutar un kernel en la GPU y realizar cálculos adicionales en el host (CPU). Veo a este efecto:La ejecución del kernel OpenCL no se inicia hasta que clFinish o clWaitForEvents se llamen

sólo el núcleo necesita alrededor de 2.000 ms:

clEnqueueNDRangeKernel ...

clFinish (o clWaitForEvents, he intentado tanto)

Simulé cómputo adicional en la CPU con suspensión (10):

clEnqueueNDRangeKernel ...

sueño (10);

clFinish (o clWaitForEvents)

En teoría, el kernel debe ejecutarse en la GPU y después del sueño de 10 segundos el núcleo debe ser terminado. Pero la medición del tiempo dice que todo necesita 12000ms en lugar de 10000.

¿ClFinish o clWaitForEvents invocan al núcleo para iniciar o me perdí algo?

Estoy usando una CPU/GPU AMD Fusion y Linux.

Muchas gracias.

+0

¿Qué tan grande son sus datos? ¿Es posible que 2000 ms represente el tiempo necesario para transferir sus datos de la GPU a la CPU? – user1202136

+0

Los datos están por debajo de 1 MB. Pero no debería estar en mi medida. Copio datos en el dispositivo, comienzo a medir, ejecuto el kernel + sleep + clFinish, dejo de medir, copio los datos al host – Tomas

+0

¿Cómo está midiendo exactamente? ¿Copia sus datos al dispositivo sincrónicamente? – reima

Respuesta

2

clFinish() sólo garantiza que el núcleo se ha terminado cuando el programa pasa por delante de esta función, pero cuando el núcleo se comenzó a ejecutar no es seguro. clFlush() puede garantizar que el kernel se haya iniciado en el dispositivo mientras el programa procede con la sentencia clFlush(), pero cuándo estará terminado no es seguro, por lo que necesita clFlush() para asegurarse de que el núcleo se haya iniciado en el dispositivo, luego el tiempo (2000 ms) puede superponerse con el tiempo de inactividad (10000 ms) en el extremo del host. Espero que pueda ser útil.

Cuestiones relacionadas