2016-04-21 2 views
1

Я пытаюсь создать некоторые фрактальные изображения джулии, и я бы хотел использовать несколько ядер для более быстрого выполнения. Но сгенерированные изображения плохие, если я использую параллель (у них есть строки неправильного цвета, выходят за рамки, ...), а также вместо 40 изображений создается только около 20. Сгенерированные изображения прекрасны, если я удаляю строку с #pragmaOpenmp rendering bmp images

#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 

    } 

ответ

3

У вас есть классическое состояние гонки данных. Параллельные потоки используют общие данные: imeDatoteke [7], imeDatoteke [8], изображение [i] [j]. В результате поток может использовать данные из другого потока для создания изображения. Вы можете использовать локальные переменные для каждого потока или использовать объекты синхронизации.