Beruflich Dokumente
Kultur Dokumente
Practica 1
Introduccion
Introducci
on a Cilk
Cilk es un lenguaje de prop
osito general dise
nando para desarrollar programas multi-hilos y paralelos. Extiende a C incluyendo ocho palabras claves: cilk,
spawn, sync, inlet, abort, shared, private, SYNCHED. Es desarrollado por el
MIT y se puede descargar desde su p
agina web. El manual de uso tambien se
encuentra all.
Los c
odigos fuente de Cilk deben tener extensi
on .cilk y se compilan con el
compilador de Cilk cilkc con los mismos argumentos que el compilador de C.
Una vez compilado se ejecutan con:
./prog --nproc N args
donde N es el n
umero de hilos con el cual queremos correr prog y args son
argumentos al programa.
1.
El Jardn Ornamental
Por cada molinete entran N_VISITANTES personas, pero al ejecutar el programa (con --nproc 2) es difcil que el resultado sea 2*N_VISITANTES.
Explique a que se debe esto.
Ejecute el programa 5 veces con N_VISITANTES igual a 10. El programa
dio el resultado correcto siempre? Si esto es as, por que?
Cu
al es el mnimo valor que podra imprimir el programa? Bajo que circustancia?
Implemente una solucion utilizando los mutex que provee la librera de
Cilk (Cilk_lockvar).
2.
<stdio.h>
<unistd.h>
<stdlib.h>
<cilk-lib.cilkh>
}
}
cilk int main ()
{
int i;
for (i=0;i<N_FILOSOFOS;i++)
Cilk_lock_init(tenedor[i]);
for (i=0;i<N_FILOSOFOS;i++)
spawn filosofo(i);
sync;
return 0;
}
3.
Tres procesos tratan de fumar cada vez que pueden. Para hacerlo necesitan
tres ingredientes: tabaco, papel y fosforos. Cada uno tiene una cantidad ilimitada
de uno de estos ingredientes. Esto es, un fumador tiene tabaco, otro tiene papel
y el u
ltimo tiene f
osforos.
Los fumadores no se prestan los ingredientes entre ellos, pero hay un cuarto
proceso, el agente, con cantidad ilimitada de todos los ingredientes, que repetidamente pone a disposicion de los fumadores dos de los tres ingredientes elegidos
al azar. Cada vez que esto pasa, el fumador que tiene el ingrediente restante
procede a hacarse un cigarrillo y fumar.
A continuacion se puede ver una implementacion en Cilk (codigo fuente
aqu):
#include <stdio.h>
#include <stdlib.h>
#include "semaphore.cilkh"
Semaphore
Semaphore
Semaphore
Semaphore
*tabaco;
*papel;
*fosforos;
*otra_vez;
void agente()
{
for (;;) {
int caso = random() % 3;
SemaphoreP(otra_vez);
switch (caso) {
case 0:
SemaphoreV(tabaco);
SemaphoreV(papel);
break;
case 1:
SemaphoreV(fosforos);
SemaphoreV(tabaco);
break;
case 2:
SemaphoreV(papel);
SemaphoreV(fosforos);
break;
}
}
}
void fumar(int fumador)
{
printf("Fumador %d: Puf! Puf! Puf!\n", fumador);
sleep(1);
}
cilk void fumador1()
{
for (;;) {
SemaphoreP(tabaco);
SemaphoreP(papel);
fumar(1);
SemaphoreV(otra_vez);
}
}
cilk void fumador2()
{
for (;;) {
SemaphoreP(fosforos);
SemaphoreP(tabaco);
fumar(2);
SemaphoreV(otra_vez);
}
}
cilk void fumador3()
{
for (;;) {
SemaphoreP(papel);
SemaphoreP(fosforos);
fumar(3);
SemaphoreV(otra_vez);
}
}
cilk int main()
{
tabaco = SemaphoreCreate(0);
papel = SemaphoreCreate(0);
fosforos = SemaphoreCreate(0);
otra_vez = SemaphoreCreate(1);
spawn fumador1();
spawn fumador2();
spawn fumador3();
agente();
return 0;
}