2016-04-21 1 views
1

J'essaie de générer des images fractales en julia et j'aimerais utiliser plusieurs cœurs pour une exécution plus rapide. Mais les images générées sont mauvaises si je les utilise parallèlement (elles ont des lignes de mauvaise couleur, sont hors d'échelle, ...) et aussi, au lieu de 40 images, seulement environ 20 sont créées. Les images générées sont très bien si je supprime la ligne aveC#pragmaOpenmp rendering images bmp

#pragma omp parallel for 
    for (k = 0; k < 40; k++) { //for loop that creates 40 images 
     z.Im = scale;  //z and c are complex numbers 

      imeDatoteke[7] = k/10 + '0'; // file name 
      imeDatoteke[8] = k % 10 + '0'; 

      c.Im += 0.005; // imaginary part increments every image 

      for (i = 0; i < DIM - 1; i++) { //DIM is image dimension 

       z.Im -= 2 * scale/(DIM - 1); 
       z.Re = -scale; 

       for (j = 0; j < DIM - 1; j++) { 

        z.Re += 2 * scale/(DIM - 1); 

        picture[i][j] = polinom(z, c); // a function that returns color between 0 and 255 
       } 
      } 

      saveBMP(picture, DIM, DIM, imeDatoteke); //save image arrays in bpm files 

    } 

Répondre

3

Vous avez condition de course de données classique. Les threads parallèles utilisent des données communes: imeDatoteke [7], imeDatoteke [8], image [i] [j]. En tant que résultat, le thread peut utiliser des données provenant d'un autre thread pour créer une image. Vous pouvez utiliser des variables locales pour chaque thread ou utiliser des objets de synchronisation.