Supongamos que yo programo en algún lenguaje de programación compilado (por ejemplo C), un loop sencillo que por ejemplo hace:
Arreglo[1..n]
for i = 1 ... n do
Arreglo[i] = Arreglo[i] * 2
end for
Claramente este loop es 100 % paralelizable porque cada unidad de procesamiento puede tomar un i y las lecturas y escrituas van a ser independientes entre si. Una primer duda que tengo, ¿qué tan inteligentes son los compiladores para detectar este tipo de situaciones, de tal manera que nosotros podemos programar tranquilamente sin atención ni esfuerzo explícito en indicar cómo queremos que se haga la paralelización (que es la idea del curso creo, generar código donde el paralelismo le indique al compilador cómo se debe hacer de forma explícita y al mismo timepo favorecer el paralelismo implicito (teniendo en cuenta localidad de cache , etc)).
Por otro lado supongamos que el compilador detecta la posibilidad de paralelizar, entonces, en tiempo de compilación el compilador traduce el código en C a un conjunto de instrucciones en lenguaje ensamblador,
¿Es en este punto en que el compilador ya tiene que tener la inteligencia para poder generar diferentes "piezas de còdigo ensamblador" independientes entre sí y distribuibles entre los cores de un procesador (por ejemplo)?
O el lenguaje en ensamblador que se genera, se genera igual y el paralelismo se resuleve a nivel de hardware en el propio procesador?
Una última pregunta, en el ejemplo anterior, es claro que lo ideal sería tener "n" unidades de cómputo independientes , para que cada uno tome una fila, en un contexto de unidades de procesamiento homogenea.
Sin embargo, esto va a depender de la cantidad de recursos que el programa tenga asignado . Me surgen dos preguntas
1- El compilador sabe de antemano los recursos que tiene asignados por el SO? Por ejemplo, como en la clase de ayer que ya podíamos asumir de primera que teníamos 4 procesadores.
2- ¿Es el SO el que se encarga de asignar los recursos en general, siempre se asignan de antemano, o se puede hacer un poco a demanda, lo que requeriría, si no entiendo mal, mucha intervención del SO, o toda esa lógica está a programado a nivel de hardware, entre por ejemplo, los diferentes cores de un mismo multi-core?
3- El SO asigna recursos a nivel de procesador, o a nivel de core de procesador?
gracias!!
Arreglo[1..n]
for i = 1 ... n do
Arreglo[i] = Arreglo[i] * 2
end for
Claramente este loop es 100 % paralelizable porque cada unidad de procesamiento puede tomar un i y las lecturas y escrituas van a ser independientes entre si. Una primer duda que tengo, ¿qué tan inteligentes son los compiladores para detectar este tipo de situaciones, de tal manera que nosotros podemos programar tranquilamente sin atención ni esfuerzo explícito en indicar cómo queremos que se haga la paralelización (que es la idea del curso creo, generar código donde el paralelismo le indique al compilador cómo se debe hacer de forma explícita y al mismo timepo favorecer el paralelismo implicito (teniendo en cuenta localidad de cache , etc)).
Por otro lado supongamos que el compilador detecta la posibilidad de paralelizar, entonces, en tiempo de compilación el compilador traduce el código en C a un conjunto de instrucciones en lenguaje ensamblador,
¿Es en este punto en que el compilador ya tiene que tener la inteligencia para poder generar diferentes "piezas de còdigo ensamblador" independientes entre sí y distribuibles entre los cores de un procesador (por ejemplo)?
O el lenguaje en ensamblador que se genera, se genera igual y el paralelismo se resuleve a nivel de hardware en el propio procesador?
Una última pregunta, en el ejemplo anterior, es claro que lo ideal sería tener "n" unidades de cómputo independientes , para que cada uno tome una fila, en un contexto de unidades de procesamiento homogenea.
Sin embargo, esto va a depender de la cantidad de recursos que el programa tenga asignado . Me surgen dos preguntas
1- El compilador sabe de antemano los recursos que tiene asignados por el SO? Por ejemplo, como en la clase de ayer que ya podíamos asumir de primera que teníamos 4 procesadores.
2- ¿Es el SO el que se encarga de asignar los recursos en general, siempre se asignan de antemano, o se puede hacer un poco a demanda, lo que requeriría, si no entiendo mal, mucha intervención del SO, o toda esa lógica está a programado a nivel de hardware, entre por ejemplo, los diferentes cores de un mismo multi-core?
3- El SO asigna recursos a nivel de procesador, o a nivel de core de procesador?
gracias!!