Alters

BigInteger - Identificación de puntos paralelos y críticos: Funciones auxiliares

Muy buenas!

Oficialmente, este año es el tercero con más entradas de la historia del blog, y este pasado julio ha sido el mes con más entradas publicadas en el blog de toda la historia! 16 entradas, lo que supone prácticamente una entrada cada dos días!

Está bien ver este crecimiento en el blog, gracias en gran parte al proyecto BigInteger, que ha monopolizado el blog durante todo el mes (y lo que nos queda ;-)).

Ya que la parte de programación en CUDA todavía no la tengo empezada, es posible que abra la veda a otro tipo de entradas de temas que ya tengo medio preparados, para así no perder la racha del blog.

Pero, volviendo al presente, hoy nos toca finalizar el análisis de los puntos críticos de BigInteger, revisando todas las funciones de apoyo.


  • ¿No es la entrada que buscabas? Entra en el índice
  • ¿Buscas el código fuente? Aquí lo tienes

¡Vamos allá!


Ya que las funciones auxiliares son más independientes, vamos a tratarlas todas de golpe en esta entrada, como ya hicimos con el análisis básico de BigInteger.



Valores Frecuentes

Como ya se explicó, el máximo trabajo que hace esta función es dar valor a cuatro variables tipo BigInteger con valores predeterminados.

Hay que tener en cuenta, también, los siguientes factores

  • La creación de BigInteger está optimizada
  • Crear paralelamente los cuatro valores supondría abrir cuatro clústeres
  • La creación se hace una vez por ejecución, y si se invoca

Por tanto, podemos considerar que no es necesario optimizar más esta función; basta con la optimización de la creación de BigInteger para optimizar esta función.



Comparación

La función de comparación está fuertemente ligada a valores anteriores y posteriores de BigInteger.n, por lo que imposible de optimizar en gran parte.

No obstante, sí que podemos paralelizar (como en todas las funciones) la validación de los valores "a" y "b" a comparar.



Anexar

La función que anexa datos, por otra parte, sí es posible paralelizarla, ya que tenemos una base pre-construida por una parte, y una suma por otra...


En este caso, como en la mayoría de funciones, validamos "a" y "b" de manera simultánea, y sincronizamos con un semáforo.

Por otra parte, movemos los datos comunes entre "a" y "b", y hacemos el relleno de "0" de manera paralela, de manera que reducimos en gran medida el coste de esta parte (que es, por aproximación, la mitad del coste de la función).

Volvemos a sincronizar vía semáforo, y sumamos los valores (a través de la función optimizada) y finalizamos.



Display

La función de display se puede reducir a un simple clúster de funciones que muevan datos individuales de BigInteger.n al array de char proporcionado.

De esta manera, el coste se reduce a una fracción del mismo (sería como mover BigIngteger.count / 16 números).



Validación de datos

La validación de datos también pasa por un análisis de puntos críticos, ya que es la función más usada por la arquitectura.


Lo primero sería validar la longitud a partir de la dirección base el puntero.
Finalmente, se abrirían varios clúster de datos (4096 / 16), de manera que cada clúster validaría una parte de los datos, ganando así un buen pellizco en el rendimiento de la arquitectura.



Limpieza de datos

Finalmente, otra de las funciones frecuentes... la limpieza de datos.
No hablamos expresamente de esta función en puntos anteriores, pero merece la pena mencionarla ahora, con el análisis de puntos críticos.

Esta función sufriría un cambio similar al de display: se abriría un bloque de clústeres para limpiar los datos de manera paralela, ganando bastante en rendimiento.


Y hasta aquí la entrada... ya queda cada vez menos para entrar en el asunto de la programación! :-)


Hasta la próxima!

No hay comentarios:

Publicar un comentario