Autores: MARTÍNEZ BATLLE, Victor 736478@unizar.es ROYO MENESES, Diego 740338@unizar.es
Última modificación: 2018/10/21 Web del proyecto: /~https://github.com/vmbatlle/reversi
-
main.c: fichero fuente principal.
-
patron_volteo_arm_c.asm: Implementación en ensamblador manteniendo la llamada a la función en C (paso 3).
-
patron_volteo_arm_arm.asm: Implementación en ensamblador aplicando la técnica de inlining de la función
ficha_valida(...)
dentro depatron_volteo_arm_arm(...)
(paso 4). -
test_bench.c: Biblioteca para verificación automática (paso 5).
-
timer2.c: Biblioteca para las mediciones de tiempo (paso 6 y 7).
-
reversi8_2018.c: Modificado para incluir la lógica de pruebas (
patron_volteo_test(...)
paso 5) y nuevas implementaciones depatron_volteo(...)
en C (patron_volteo_c_iter(...)
ypatron_volteo_c_iter_inline
de los apartados opcionales). -
patron_volteo_arm_iter.asm: Implementaciones en ensamblador cambiando la estrategia algorítmica por una iterativa (opcional).
-
patron_volteo_arm_c(...)
en fichero patron_volteo_arm_c.asm. -
patron_volteo_arm_arm(...)
en fichero patron_volteo_arm_arm.asm. -
patron_volteo_c_iter(...)
del fichero fichero reversi8_2018.c es la versión iterativa en C del apartado opcional. -
patron_volteo_c_iter_inline(...)
del fichero reversi8_2018.c es una nueva versión iterativa en C, empleando la estrategia de inlining, al igual que aplica el compilador en -O2. -
patron_volteo_arm_iter(...)
del fichero patron_volteo_arm_iter.asm es una primera versión iterativa equivalente apatron_volteo_c_iter_inline(...)
. -
patron_volteo_arm_iter_v2(...)
del fichero patron_volteo_arm_iter.asm es la versión más eficiente. La estrategia algorítmica equivale apatron_volteo_c_iter_inline(...)
.
timer2_inicializar()
,timer2_empezar()
,timer2_leer()
ytimer2_parar()
en fichero timer2.c.
Para las pruebas se usa un puntero a función praton_volteo_implementacion
. Este puntero apunta a la función de la implementación que se desee probar en cada caso.
Sigue la estrategia propuesta en el guión de prácticas. Se invoca a patron_volteo_test(...)
y ésta a su vez invoca a todas las implementaciones. Se ha aprovechado un generador de movimientos aleatorios para jugar una partida entera a reversi usando este método de pruebas.
Se podrán dar más explicaciones sobre el generador aleatorio en la defensa del proyecto.
Resultado erróneo: La función patron_volteo_test(...)
no retornará el control en caso de producirse una inconsistencia entre los resultados de las implementaciones. Además, situando breakpoints en el lugar marcado se permite repetir paso a paso la ejecución de la implementación que ha fallado.
Resultado correcto: La ejecución de reversi8()
termina normalmente. Se debe establecer un breakpoint al final de dicha función.
Estudia casos considerados críticos y aplica sobre ellos todas las implementaciones de patron_volteo(...)
. Compara los resultados de todas las implementaciones.
Los casos se encuentran descritos en la biblioteca test_bench.c.
Resultado erróneo: La función test_version(...)
(fichero test_bench.c) devolverá un valor FALSE
y en la correspondiente variable local a reversi8()
se almacenará dicho valor (p. ej. result1 = 0
).
Resultado correcto: El valor almacenado será TRUE
.
Se debe establecer un breakpoint al final de cada iteración del bucle para poder consultar el resultado de la ejecución.
Resultado: El valor almacenado en cada variable será el tiempo empleado para la ejecución de la implementación correspondiente para cada uno de los cuatro casos probados.
Mediante el generador de movimientos aleatorios se juega la misma partida completa con cada implementación de patron_volteo(...)
. Al finalizar un juego se comparan los tablero para comprobar que, al aplicar los mismo movimientos de fichas negras, los tableros resultantes son iguales.
Resultado erróneo: La ejecución se detiene en un bucle /* ERROR */
al comprobar que los tableros no coinciden al finalizar cada partida.
Resultado correcto: La ejecución se detiene en un bucle /* FIN */
si todos los tableros han sido iguales.
Pruebas de la biblioteca de medición de tiempo pedidas en el paso 7. Implementadas en main.c.
Resultado: El tiempo medido en microsegundos queda alamcenado en las variables tiempo*
.
-
"El día de la corrección se debe realizar la verificación automática." utilizar TEST_BENCH_1. Descomentado
#define TEST_BENCH_1
y estableciendo breakpoints dentro de la funciónpatron_volteo_test(...)
y al final dereversi8()
. -
"Durante la corrección de la práctica deberéis tener todo preparado para hacer estas mediciones." Utilizar TEST_BENCH_TIMER2 descomentando en
#define
en main.c. -
Los datos de rendimiento se presentarán en formato impreso.