2016-01-06 2 views
1

У меня есть функция, которая вычисляет mandelbrot set Я пытаюсь распараллелить его, используя openMP.parallelize Mandelbrot with OpenMP

Я поставил #pragma omp parallel for private перед каждым for

static void calculer (Image * im, int nb_iter, double x_min, double x_max, double y_min, double y_max) { 

    /* Discretisation de l'ensemble */ 
    double pasx = (x_max - x_min)/im -> nb_col; 
    double pasy = (y_max - y_min)/im -> nb_lig; 
    double cy = y_min; 
    double new_zx; 
    unsigned int l,c; 
    // Calcul 
    #pragma omp parallel for private (pasx, pasy, im,nb_iter,x_min,x_max,y_min, y_max) 
    for (l = 0; l < im->nb_lig; l++) { 
     double cx = x_min; 
     #pragma omp parallel for private (cx) 

     for (c = 0; c < im->nb_col; c++) { 
      double zx = 0.0; 
      double zy = 0.0; 
      unsigned int n = 0; 
      while ( (zx*zx + zy*zy < 4.0) && (n < nb_iter)) { 
       new_zx = zx*zx - zy*zy + cx; 
       zy = 2.0*zx*zy + cy; 
       zx = new_zx; 
       ++n; 
      } 
      im->pixels[l*im->nb_col + c] = n%256; 
      cx += pasx; 
     } 
     cy += pasy; 
    } 
} 

При компиляции с использованием gcc mandelbrot.c -fopenmp -o exe, я получаю segmentation fault. Какая может быть причина?

EDIT: После выполнения vingrid я получаю это сообщение

Process terminating with default action of signal 11 (SIGSEGV) 
==10689== Access not within mapped region at address 0x0 
==10689== at 0x40105F: calculer._omp_fn.0 (in /home/haddad/Documents/TPOpenMP/TP_OpenMP/TP_Mandelbrot/exe3) 
==10689== by 0x4E39EE9: ??? (in /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0) 
==10689== by 0x5047E99: start_thread (pthread_create.c:308) 
==10689== by 0x535038C: clone (clone.S:112) 
==10689== If you believe this happened as a result of a stack 
==10689== overflow in your program's main thread (unlikely but 
==10689== possible), you can try to increase the size of the 
==10689== main thread stack using the --main-stacksize= flag. 
==10689== The main thread stack size used in this run was 8388608. 
+0

Вы пытались использовать Valgrind? – Lolmewn

+0

Вы уверены, что хотите, чтобы 'im' был приватным? Выглядит, правда, мне ... –

+0

Я прошу в OpenMP, я просто помещаю все переменные, которые я буду использовать – vikash78

ответ

6

Я пошел вперед и очистить ваш код и даже сделал изображение из него.

#include <stdlib.h> 
#include <stdio.h> 

struct Image { 
    unsigned nb_lig; 
    unsigned nb_col; 
    unsigned *pixels; 
}; 

void calculer (struct Image * im, unsigned nb_iter, double x_min, double x_max, double y_min, double y_max) { 
    double pasx = (x_max - x_min)/im -> nb_col; 
    double pasy = (y_max - y_min)/im -> nb_lig; 
    unsigned l,c; 
    #pragma omp parallel for private (c) 
    for (l = 0; l < im->nb_lig; l++) { 
     for (c = 0; c < im->nb_col; c++) { 
      double zx = 0.0, zy = 0.0, new_zx; 
      double cx = x_min + c*pasx, cy = y_min + l*pasy; 
      unsigned n = 0; 
      for(n=0; (zx*zx + zy*zy < 4.0) && (n < nb_iter); n++) { 
       new_zx = zx*zx - zy*zy + cx; 
       zy = 2.0*zx*zy + cy; 
       zx = new_zx; 
      } 
      if(n == nb_iter) n = 0; 
      im->pixels[l*im->nb_col + c] = n; 
     } 
    } 
} 

void draw_image(struct Image *im) { 
    const char charset[] = ".,[email protected]"; 
    unsigned l,c; 
    for (l = 0; l < im->nb_lig; l++) { 
     for (c = 0; c < im->nb_col; c++) { 
      unsigned n = im->pixels[l*im->nb_col + c]; 
      char p = n > 0 ? charset[n % (sizeof(charset)-1)] : ' '; 
      putchar(p); 
      if(c+1 == im->nb_col) puts(""); 
     } 
    } 
    puts(""); 
} 

int main(void) { 
    struct Image im; 
    im.nb_lig = 40; 
    im.nb_col = 80; 
    im.pixels = malloc(sizeof *im.pixels * im.nb_lig*im.nb_col); 
    unsigned nb_iter = 256; 
    calculer(&im, nb_iter, -2.5, 1.5, -2.0, 2.0); 
    draw_image(&im); 
    return 0; 
} 

Выход

 
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ccccccccccccccccccccccccc,,,,,,,,,,,,,,,,, 
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ccccccccccccccccccccccccccccccccccc,,,,,,,,,,,, 
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ccccccccccccccccccccccccccccccccccccccccccc,,,,,,,, 
,,,,,,,,,,,,,,,,,,,,,,,,,,,ccccccccccccccccccccccccccccccccccccccccccccccc,,,,,, 
,,,,,,,,,,,,,,,,,,,,,,,,ccccccccccccccccccccccccccccccccccccccccccccccccccccc,,, 
,,,,,,,,,,,,,,,,,,,,,,ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc, 
,,,,,,,,,,,,,,,,,,,,ccccccccccccccc88888888888cccccccccccccccccccccccccccccccccc 
,,,,,,,,,,,,,,,,,,,ccccccccc8888888888888888888888888ccccccccccccccccccccccccccc 
,,,,,,,,,,,,,,,,,[email protected]@@MMM8888ccccccccccccccccccccccc 
,,,,,,,,,,,,,,,,[email protected]@jaoro @MMMM8888cccccccccccccccccccc 
,,,,,,,,,,,,,,,[email protected]@@[email protected]@@MMMM88888ccccccccccccccccc 
,,,,,,,,,,,,,,[email protected]@jjawQ [email protected]@@@MM888888ccccccccccccccc 
,,,,,,,,,,,,,[email protected]@jawwwwrpQ [email protected] 
,,,,,,,,,,,,[email protected]@@@jjagM Pa   ,[email protected] 
,,,,,,,,,,,,[email protected]@@@@@@[email protected]     ,[email protected] 
,,,,,,,,,,,[email protected]@agaaaaaaaaawo,     [email protected] 
,,,,,,,,,,,[email protected]@@japP,[email protected]      EwjMM8888888cccccccccc 
,,,,,,,,,,,[email protected]@@@jawoJ  EP      [email protected] 
,,,,,,,,,,,MMMMMjjjjawgOQ8   Q      [email protected] 
,,,,,,,,,,,            [email protected] 
,,,,,,,,,,,MMMMMjjjjawgOQ8   Q      [email protected] 
,,,,,,,,,,,[email protected]@@@jawoJ  EP      [email protected] 
,,,,,,,,,,,[email protected]@@japP,[email protected]      EwjMM8888888cccccccccc 
,,,,,,,,,,,[email protected]@agaaaaaaaaawo,     [email protected] 
,,,,,,,,,,,,[email protected]@@@@@@[email protected]     ,[email protected] 
,,,,,,,,,,,,[email protected]@@@jjagM Pa   ,[email protected] 
,,,,,,,,,,,,,[email protected]@jawwwwrpQ [email protected] 
,,,,,,,,,,,,,,[email protected]@jjawQ [email protected]@@@MM888888ccccccccccccccc 
,,,,,,,,,,,,,,,[email protected]@@[email protected]@@MMMM88888ccccccccccccccccc 
,,,,,,,,,,,,,,,,[email protected]@jaoro @MMMM8888cccccccccccccccccccc 
,,,,,,,,,,,,,,,,,[email protected]@@MMM8888ccccccccccccccccccccccc 
,,,,,,,,,,,,,,,,,,,ccccccccc8888888888888888888888888ccccccccccccccccccccccccccc 
,,,,,,,,,,,,,,,,,,,,ccccccccccccccc88888888888cccccccccccccccccccccccccccccccccc 
,,,,,,,,,,,,,,,,,,,,,,ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc, 
,,,,,,,,,,,,,,,,,,,,,,,,ccccccccccccccccccccccccccccccccccccccccccccccccccccc,,, 
,,,,,,,,,,,,,,,,,,,,,,,,,,,ccccccccccccccccccccccccccccccccccccccccccccccc,,,,,, 
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ccccccccccccccccccccccccccccccccccccccccccc,,,,,,,, 
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ccccccccccccccccccccccccccccccccccc,,,,,,,,,,,, 
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ccccccccccccccccccccccccc,,,,,,,,,,,,,,,,, 
+0

Ницца, но где свободен? – Adam

+0

@Adam, вы имеете в виду 'free (im.pixels)'? Это необязательно. –

+0

Valgrind LEAK SUMMARY: определенно потеряно: 12,800 байт в 1 блоке – Adam