Hola!
¿Qué tal? ¿Mucho calor? Apenas se nota, ¿verdad?
Pues nada, amigos y amigas, hoy os traigo la entrada final, antes de revisar los últimos cambios de BigInteger y ponernos, por fin, a programar.
Vamos entonces a calcular el límite de clúster, es decir, los valores máximos que podemos dar a la arquitectura CUDA para que todo funcione de manera óptima.
¡Vamos allá!
Lo primero es lo primero.
Vamos a ver las conexiones entre funciones.
El camino más largo que podemos encontrar es
nqrt > sBipow > sMul > pAdd > addition > carryAdd
Supongamos que definimos "n" como MAX_LENGTH / 16 - en nuestro caso, 4096 / 16 = 256.
Teniendo en cuenta que en "nqrt" abrimos un clúster a sBipow para calcular los distintos candiatos, y siguendo nuestro valor de "n"
nqrt > sBipow (10 hilos)
Entre sBipow y sMul se abre un único clúster, por consiguiente
nqrt > sBipow (10 hilos) > sMul (10 hilos)
Siguiendo con el desarrollo, entre sMul y pAdd se abren "n" clústeres para calcular las operaciones parciales
nqrt > sBipow (10 hilos) > sMul (10 hilos) > pAdd (10 hilos + n clústeres)
Entre pAdd y addition, de nuevo, se abre otro grupo de "n" clústeres
nqrt > sBipow (10 hilos) > sMul (10 hilos) > pAdd (10 hilos + n clústeres) > addition (10 hilos + n^2 clústeres)
Finalmente, entre addition y carryAdd no se generan nuevos clústeres.
En resumen, tenemos n^2 clústeres + 10 hilos (que podemos redondear a 1 clúster), y por tanto: 65.537 clústeres.
En este caso, cada hilo haría una única operación; no obstante, en caso de no tener suficientes hilos activos, podríamos redefinir "n = sqrt(4096)", y por tanto, nuestro número máximo sería 4097 (mucho más asequible).
Así que, esas son nuestras cifras! la mejor opción sería 65.537, y la segunda mejor 4097 (como última alternativa, habría la posibilidad de bajar MAX_LENGTH de 4096 a 512 ;-)).
¡Hasta la próxima!
No hay comentarios:
Publicar un comentario