Foro de elhacker.net

Programación => Ejercicios => Mensaje iniciado por: Estudiante1986 en 20 Octubre 2015, 21:23 pm



Título: Duda principiante: ¿cómo es un bucle DIRECTAMENTE paralelizable?
Publicado por: Estudiante1986 en 20 Octubre 2015, 21:23 pm
Hola a todo el mundo. Pues eso, ¿cómo es un bucle directamente paralelizable?

Más o menos, conceptualmente, sé lo que es la paralelización. También sé que existen diversos tipos de paralelización (a nivel de instrucciones, de peticiones y de datos).

Bien, pues... Lo que no sé es cómo identificar un supuesto bucle paralelizable a nivel de instrucciones. Tampoco sé lo que significa que sea "directamente" paralelizable ni lo que es "desenrollar" el bucle.

Algunos dirán que por qué pregunto todo esto que es más bien teórico, pero es que lo necesito para una asigantura.


Muchas gracias de antemano por las respuestas.


Título: Re: Duda principiante: ¿cómo es un bucle DIRECTAMENTE paralelizable?
Publicado por: El Benjo en 18 Noviembre 2015, 05:49 am
Supongo que lo de "directamente paralelizable" se refiere a que la función ejecuta ciertas instrucciones sobre un número n de elementos y puedes ejecutar un número n de hilos que trabajen sobre estos elementos. Ejemplo:

Se tiene una función que realiza la suma de los elementos de n arreglos. La forma tradicional de hacerlo sería:

Código
  1. public struct StArreglos
  2. {
  3.  public int[] Elementos;
  4. }
  5.  
  6. StArreglos[] VarArreglos;
  7.  
  8. public void SumaArreglos()
  9. {
  10.  int C;
  11.  int D;
  12.  for(C = 0; C < VarArreglos.Lenght; C++)
  13.  {
  14.    for(D = 0; D < VarArreglos[C].Elementos.Lenght; D++)
  15.    {
  16. // Suma de los elementos.
  17.    }
  18.  }
  19. }
  20.  
  21. public void main()
  22. {
  23.  VarArreglos = new StArreglos(3);
  24.  SumaArreglos();
  25. }

Esta función podríamos decir que es directamente paralelizable porque basta con reescribir la función sumar arreglos eliminando el primer bucle y pasando un índice a la función indicando sobre cual arreglo ejecutaremos la suma de sus elementos. Después, en la función main invocamos un hilo a dicha función por cada arreglo:

Código
  1. [code=csharp]public struct StArreglos
  2. {
  3.  public int[] Elementos;
  4. }
  5.  
  6. StArreglos[] VarArreglos;
  7.  
  8. public void SumaArreglos(int Indice)
  9. {
  10.  int C;
  11.    for(D = 0; D < VarArreglos[Indice].Elementos.Lenght; D++)
  12.    {
  13. // Suma de los elementos.
  14.    }
  15.  }
  16. }
  17.  
  18. public void main()
  19. {
  20.  int A;
  21.  VarArreglos = new StArreglos(3);
  22.  for(A = 0; A < VarArreglos.Lenght; A++)
  23.  {
  24. // Lanzo un hilo a la función 'SumaArreglos' por cada arreglo.
  25.  }
  26. }
[/code]

Lo de desenrrollar en bucle te lo dejo aquí:

https://es.wikipedia.org/wiki/Desenroscado_de_bucles (https://es.wikipedia.org/wiki/Desenroscado_de_bucles)

Busca la parte que dice "desenroscado de bucles estático".