Estoy tratando de poner en paralelo un trazador de rayos en C, pero el tiempo de ejecución no está disminuyendo a medida que el número de hilos de aumentar. El código que tengo hasta ahora es:

main2(thread function):

float **result=malloc(width * sizeof(float*));
int count=0;
for (int px=0;, px<width; ++px)
{
     ...
     for (int py=0; py<height; ++py)
     {
         ...
         float *scaled_color=malloc(3*sizeof(float));
         scaled_color[0]=...
         scaled_color[1]=...
         scaled_color[2]=...

         result[count]=scaled_color;
         count++;
         ...
      }
}
...
return (void *) result;

main:
pthread_t threads[nthreads];
 for (i=0;i<nthreads;i++)
 {
      pthread_create(&threads[i], NULL, main2, &i);
 }

 float** result_handler;

 for (i=0; i<nthreads; i++)
 {
      pthread_join(threads[i], (void *) &result_handler);
      int count=0;

      for(j=0; j<width;j++)
     {
          for(k=0;k<height;k++)
          {
               float* scaled_color=result_handler[count];
               count ++;
               printf...
           }
           printf("\n");
       }
  }

main2 devuelve un float ** por lo que la imagen puede ser impresa en el fin de la función main. Alguien sabe por qué el exectution el tiempo no es caída (por ejemplo, se ejecuta más con 8 hilos que con 4 hilos cuando se supone que debe ser al revés)?

InformationsquelleAutor Trisha | 2011-03-06

3 Comentarios

  1. 3

    No es suficiente para agregar hilos, necesitamos dividir la tarea así. Parece que estamos haciendo el mismo trabajo en cada hilo, de modo que usted obtiene n copias del resultado con n hilos.

  2. 2

    Paralelismo de los programas y algoritmos generalmente no trivial para lograr y no viene sin un poco de inversión.

    No creo que trabajan directamente con los hilos, es la herramienta adecuada para usted. Trate de buscar en OpenMp, es mucho más alto nivel.

    • OpenMP es muy natural para aprender (y yo no lo uso en un serio entorno de producción, ya que es difícil abstracto), pero es 1) fácil de aprender 2) 3) fácil de usar para paralelizar enorme bucles.
    • puede usted explicar qué quiere decir con «antinatural«?
    • Siempre me pareció OpenMP la sintaxis difícil para hacer más elaborado que en la paralelización de un bucle for. En serio no tiene OO abstracción.
    • ok veo lo que quieres decir. Pero en muchas, muchas aplicaciones como el que aquí se for-bucles son el herramienta para la estructuración del código. Se piensa que el idioma original del programa, tales problemas se llama paratran 🙂
    • sí, este en particular las aplicaciones probablemente se beneficiarán de una línea de OpenMP (de ahí mi upvote).
  3. 0

    Dos cosas que están trabajando en contra de usted aquí. (1) a Menos que usted puede asignar hilos a más de un núcleo, que no podía esperar una velocidad de, en primer lugar, el uso de un solo núcleo, que el núcleo tiene la misma cantidad de trabajo por hacer si usted paralelizar el código o no. (2) Incluso con múltiples núcleos, rendimiento paralelo es exquisitamente sensible a la relación de cálculo realizado en el núcleo de la cantidad de comunicación que sea precisa entre los núcleos. Con ptrhead_join() dentro del bucle, se está incurriendo en una gran cantidad de este tipo de «parar y esperar a que el otro chico’ tipo de repercusión en el rendimiento.

Dejar respuesta

Please enter your comment!
Please enter your name here