Ha habido mucha discusión sobre cómo elegir #blocks & blockSize, pero aún me falta algo. Muchos de mis preocupaciones frente a esta cuestión: How CUDA Blocks/Warps/Threads map onto CUDA Cores? (Para simplificar la discusión, hay suficiente perThread & memoria perBlock límites de memoria no son un problema aquí..)bloques, hilos, warpSize
kernelA<<<nBlocks, nThreads>>>(varA,constB, nThreadsTotal);
1) Mantener el SM tan ocupado como sea posible, Debería establecer nThreads
en un múltiplo de warpSize
. ¿Cierto?
2) Un SM solo puede ejecutar un kernel a la vez. Eso es todo HWcores de ese SM ejecutando solo kernelA. (No algunos HWcores ejecutan kernelA, mientras que otros ejecutan kernelB.) Así que si solo tengo un hilo para ejecutar, estoy "perdiendo" el otro HWcores. ¿Cierto?
3) Si los problemas del programador warp funcionan en unidades de warpSize
(32 hilos), y cada SM tiene 32 HWcores, entonces el SM se utilizará por completo. ¿Qué sucede cuando el SM tiene 48 HWcores? ¿Cómo puedo mantener los 48 núcleos completos utilizados cuando el planificador está emitiendo trabajos en fragmentos de 32? (Si el párrafo anterior es verdadero, ¿no sería mejor si el planificador emitió trabajo en unidades de tamaño HWcore?)
4) Parece que el planificador warp pone en cola 2 tareas a la vez. De modo que cuando el kernel que se está ejecutando se detenga o se bloquee, se intercambie el segundo kernel. (No está claro, pero supongo que la cola aquí tiene más de 2 núcleos). ¿Es esto correcto?
5) Si mi HW tiene un límite superior de 512 hilos por bloque (nThreadsMax), eso no significa que el núcleo con 512 hilos se ejecutará más rápido en un bloque. (De nuevo, no es un problema.) Existe una buena posibilidad de que obtenga un mejor rendimiento si extiendo el kernel de 512 hilos a través de muchos bloques, no solo uno. El bloque se ejecuta en uno o muchos SM. ¿Cierto?
5a) Estoy pensando que cuanto más pequeño mejor, ¿pero importa lo pequeño que sea nBlocks
? La pregunta es, ¿cómo elegir el valor de nBlocks
que sea decente? (No necesariamente óptimo.) ¿Existe un enfoque matemático para elegir nBlocks
, o simplemente es trial-n-err.
Esta GPU tiene 192 CudaCores. Eso sería 4 SM, con 48 núcleos de hardware (HWcores). 4 * 48 = 192 – Doug