Optimizaciones en paralelo (I)

Hace unos días leí acerca del procesador de la consola PS3 y su capacidad para realizar varias operaciones aritméticas en una sola instrucción. Es decir, dado que tiene un bus de 128 bits, podría sumar 4 valores de 32 bits en una operación. Me sirvió para darle vueltas a la cabeza e intentar hacer lo mismo en mi ordenador.

La anchura del bus de un procesador es equivalente al número de cifras que puede tener la pantalla de una calculadora simple, sólo que en lugar de tratarse de dígitos decimales (del 0 al 9) son dígitos binarios (0 ó 1). El planteamiento es sencillo: supongamos que tenemos una calculadora de 12 dígitos y necesitamos sumar cuatro parejas de números de tres cifras -suponiendo que estamos seguros de que nunca nos vamos a pasar de 999-. Por ejemplo:
293 + 266
496 + 357
459 + 330
458 + 471

En lugar de realizar cuatro operaciones y dejar nueve ceros a la izquierda, podemos agrupar los números y "pegarlos" en dos sumandos:

293.496.459.458 + 266.357.330.471
Que da como resultado:
559.853.789.929

O sea, 559, 853, 789 y 929, el resultado de cada una de las operaciones por separado. Esto mismo lo hemos hecho sumando cuatro enteros de 16 bits guardándolos en estructuras de 64 bits. Basta con crear una estructura en C que almacene cuatro enteros unsigned short int y dos instancias de ésta -cada una será un sumando-.

Les damos valores y, utilizando sus punteros, hacemos casting a entero de 64 bits (unsigned long long int) y los sumamos. El resultado se puede interpretar como una estructura del mismo tipo, conteniendo los cuatro resultados.

Al procesador no le importa sumar números de 64 bits, pero sí le ahorra bastante tiempo (aproximadamente el 60%) disminuir la cantidad de operaciones que tiene que realizar. Aquí incluyo un pequeño programa en C que demuestra el ahorro de tiempo. Recordad que es necesario compilarlo en un sistema de 64 bits.

Comentarios

Entradas populares de este blog

Algoritmo de relleno

Cifrado de Vernam

Problema de las N reinas