Universidad de Costa Rica. Escuela de Computación. CI-0117 Programación Paralela y Concurrente
2019a. Grupo 03. Examen 02 [18-Jul-2018]. Profesor Jeisson Hidalgo-Céspedes.
Comercio en el clúster
Escriba un programa que simule el comercio entre procesos en el clúster. El programa recibirá en la entrada estándar dos números en la primera línea. El primero indica la cantidad de dinero que tendrá inicialmente cada proceso para comerciar. El segundo indica la cantidad total \$B\$ de bienes que se repartirán entre los procesos para vender. Seguidamente, después de una línea vacía, recibirá una lista de \$B\$ productos o servicios comerciables, uno por línea. Cada bien consta de las unidades disponibles, el costo por unidad, y una descripción textual no mayor a 30 caracteres. Por ejemplo, la línea 3 se lee como "cuatro aguacates a 500 (colones) cada uno".
Los bienes deben distribuirse entre los procesos usando un mapeo circular. Por ejemplo, el proceso 0 recibirá los 4 aguacates, el proceso 1 las cinco raíces de chayote, el proceso 2 los diez chiles, el proceso 0 las cinco sandías, y así sucesivamente.
Ejemplo de entrada 1:
1000 5 4 500 aguacate 5 2000 raiz de chayote 10 250 chile 5 1000 sandia 2 300 chile
Ejemplo de salida 1:
Process 1 (1000.00 -> 500.00) buys 1 aguacate (500.00) to process 0 (1000.00 -> 1500.00) Process 0 (2000.00 -> 0.00) buys 1 raiz de chayote (2000.00) to process 1 (500.00 -> 2500.00) Process 2 (1000.00 -> 500.00) buys 1 aguacate (500.00) to process 0 (1500.00 -> 2000.00) Process 1 (2500.00 -> 1500.00) buys 1 sandia (1000.00) to process 0 (0.00 -> 1000.00) Process 0 (1000.00 -> 700.00) buys 1 chile (300.00) to process 1 (1500.00 -> 1800.00) Process 1 (1800.00 -> 1300.00) buys 1 aguacate (500.00) to process 0 (700.00 -> 1200.00) Process 2 (500.00 -> 0.00) buys 1 aguacate (500.00) to process 0 (1200.00 -> 1700.00) Process 0 (1700.00 -> 1450.00) buys 1 chile (250.00) to process 2 (0.00 -> 250.00) Process 1 (1300.00 -> 300.00) buys 1 sandia (1000.00) to process 0 (1450.00 -> 2450.00) Process 0 (2450.00 -> 2150.00) buys 1 chile (300.00) to process 1 (300.00 -> 600.00) Process 0 (2150.00 -> 150.00) buys 1 raiz de chayote (2000.00) to process 1 (600.00 -> 2600.00) Process 1 (2600.00 -> 1600.00) buys 1 sandia (1000.00) to process 0 (150.00 -> 1150.00) Process 0 (1150.00 -> 900.00) buys 1 chile (250.00) to process 2 (250.00 -> 500.00) Process 1 (1600.00 -> 600.00) buys 1 sandia (1000.00) to process 0 (900.00 -> 1900.00) Process 0 (1900.00 -> 1650.00) buys 1 chile (250.00) to process 2 (500.00 -> 750.00) Process 0 (1650.00 -> 1400.00) buys 1 chile (250.00) to process 2 (750.00 -> 1000.00) Process 2 (1000.00 -> 0.00) buys 1 sandia (1000.00) to process 0 (1400.00 -> 2400.00) Process 0 (2400.00 -> 400.00) buys 1 raiz de chayote (2000.00) to process 1 (600.00 -> 2600.00) Process 0 (400.00 -> 150.00) buys 1 chile (250.00) to process 2 (0.00 -> 250.00)
Una vez que los procesos han recibido los bienes asignados, usted debe idear algún esquema de compra-y-venta de bienes usando ambos mecanismos de comunicación de MPI (punto-a-punto y colectiva) que permita a los procesos comerciar. El objetivo de su programa es tratar de que, al finalizar su ejecución, cada proceso haya comprado todos los bienes que ofrecen los otros procesos y que su presupuesto le permite.
Estos procesos son compradores compulsivos. Siempre que pueden compran cualquier cosa que esté a su alcance. De esto se aprovechan los vendedores. Está permitido a cada proceso vender la totalidad de sus bienes asignados inicialmente. En tal caso, el proceso se considera un buen vendedor. Cuando la compulsividad compite contra las habilidades de venta, las segundas ganan, y por lo tanto, un proceso no comprará un producto de otro que él mismo tiene a la venta. Por ejemplo, el proceso 2 no comprará chiles de proceso 1, ni viceversa. Tampoco tiene sentido que un proceso se compre bienes a sí mismo, ni ocurre que los procesos revendan lo que han comprado a otros. Sugerencia: trate de simular lo que ocurre en el mercado entre seres humanos.
Cada transacción se reporta en la salida estándar. Cuando la transacción se completa, el proceso que compra reporta la cantidad de dinero que tenía antes y después de la transacción, el bien que compró y su costo, y a cual proceso hizo la compra junto con el dinero que el vendedor tenía antes y después de la transacción. Asuma que en cada transacción se compra sólo una unidad del bien, aunque el comprador tenga dinero para más, con el fin de maximizar la diversidad de bienes que haya adquirido al finalizar la sesión. Su programa debe finalizar cuando ya no es posible realizar más transacciones entre los procesos.
Evaluación
-
[30%] Lectura y distribución cíclica de bienes.
-
[40%] Compra y venta de bienes usa comunicación colectiva y punto a punto.
-
[10%] Reporte de las transacciones en la salida estándar (ventas y compras).
-
[20%] Detiene el programa cuando ya no hay más transacciones en el mercado.
Su solución no debe provocar desbordes de pila, fugas de memoria, accesos inválidos, ni condiciones de carrera. No debe usar variables globales ni estáticas. Recuerde seguir buenas prácticas de programación y convenciones de estilo. Debe modularizar su código en subtareas. La única tecnología de distribución permitida para esta evaluación es MPI (Message Passing Interface). Recuerde que en el paso de mensajes no se puede enviar memoria discontinua, y que MPI no permite a un proceso enviarse mensajes a sí mismo.
Extra (10%)
-
Cree una carpeta
examenes/examen02
en su repositorio personal de control de versiones. -
Transcriba su solución del examen en papel a un archivo
solution.c
y haga el primer commit del examen. -
Haga los cambios en el código fuente hasta que su solución compile sin errores ni advertencias, y haga el segundo commit.
-
Se comunicará oportunamente si estarán disponibles casos de prueba o no en el sitio del curso.
-
Asegúrese de que su programa no produzca fugas de memoria, accesos inválidos, ni condiciones de carrera.