2011-07-05 18 views
10

Tengo una pregunta sobre la predicción de derivación en las GPU. Hasta donde yo sé, en las GPU, sí predican con ramas.Predicación de rama en la GPU

Por ejemplo I tienen un código como este:

if (C) 
A 
else 
B 

así que si A toma 40 ciclos y B tarda 50 ciclos para terminar la ejecución, si asumiendo por una urdimbre, tanto A como B son ejecutados, también lo hace toma en total 90 ciclos para terminar esta rama? ¿O se superponen A y B, es decir, cuando se ejecutan algunas instrucciones de A, entonces se espera la solicitud de memoria, luego se ejecutan algunas instrucciones de B, luego se espera la memoria, y así sucesivamente? Gracias

+10

Para aquellos que están tentados a editar más esta cuestión, tenga en cuenta que la predicción de bifurcación y bifurcación son ** no ** lo mismo ...... – talonmies

+0

He encontrado una buena descripción aquí: http: // www.yosefk.com/blog/simd-simt-smt-parallelism-in-nvidia-gpus.html –

Respuesta

11

Todas las arquitecturas con capacidad CUDA lanzadas hasta ahora funcionan como una máquina SIMD. Cuando hay divergencia de bifurcación dentro de un warp, ambos caminos de código son ejecutados por todos los hilos en el warp, con los hilos que no siguen el camino activo ejecutando el equivalente funcional de un NOP (creo que recuerdo que hay una ejecución condicional indicador adjunto a cada hilo en una urdimbre que permite enmascarar subprocesos no ejecutables).

Por lo tanto, en su ejemplo, la respuesta de 90 ciclos es probablemente una mejor aproximación de lo que sucede realmente que la alternativa.

+0

por lo que recuerdo, hay una instrucción de salto en CUDA asm, pero la rama será tomada por todos los hilos de urdimbre. – osgx

+2

Como ptx_isa.pdf: "Si los hilos de un warp divergen a través de una rama condicional dependiente de datos, el warp ejecuta en serie cada ruta de rama tomada, deshabilita los hilos que no están en esa ruta, y cuando todas las rutas se completan, los hilos convergen nuevamente a la misma ruta de ejecución. ". Entonces, hay una rama condicional en PTX pero todos los hilos de Warp deben tomar o no esta rama al mismo tiempo para ser uniformes (para obtener rendimiento) – osgx

+0

Gracias talonmies y osgx. Entonces, en el caso anterior, serían 90 ciclos para ejecutar el código. Pero me pregunto por qué no implementan la alternativa? Me refiero a la superposición A y B por lo que el rendimiento debe ser mayor. En ese caso, todavía funcionan de la manera SIMD, pero solo que la latencia se puede ocultar mejor (ejecutando la otra ruta de la rama)? – Zk1001