2013-01-26 2 views
1

Мне нужно выполнить некоторые тривиальные операции над изображением (в данном случае это отрицательный). Я сказал, что мне нужно рекурсивно разделить изображение на равные прямоугольники, и обрабатывать их параллельно с использованием MPI ..Рекурсивно разделить изображение и процесс параллельно

Я написал функцию для этого в моем последовательном классе обработки изображений:

void recursive_negative_helper(int x, int y, int WIDTH, int HEIGHT) 
{ 
    /* recurse until dimensions become odd, to avoid corruption of image 
     (equal sized rectangles only) */ 
    if((WIDTH&1) || (HEIGHT&1)) 
    { 
     uint8_t color[BPP]; 
     for(int i=y ; i<y+HEIGHT ; i++) 
     { 
      for(int j=x ; j<x+WIDTH ; j++) 
      { 
        get_pixel(color,i,j); 
        for(int k=0 ; k<BPP ; k++) 
         color[k] = 255-color[k]; 
        set_pixel(color,i,j); 
      } 
     } 
     return; 
    } 
    recursive_negative_helper(x  , y   , WIDTH/2, HEIGHT/2); 
    recursive_negative_helper(x+WIDTH/2, y   , WIDTH/2, HEIGHT/2); 
    recursive_negative_helper(x  , y+HEIGHT/2, WIDTH/2, HEIGHT/2); 
    recursive_negative_helper(x+WIDTH/2, y+HEIGHT/2, WIDTH/2, HEIGHT/2); 
} 

void recursive_negative() 
{ 
    recursive_negative_helper(0,0,width,height); 
} 

Я изучаю MPI в первый раз и с трудом выясняю, как это сделать параллельно. Я предполагаю, что один из способов делится на 4 и дает каждую часть процессу. Этого было бы достаточно для моего приложения! Но как я могу это сделать для любого количества процессов?

Может ли кто-нибудь помочь? Также, если возможно, отправьте псевдокод MPI, чтобы я мог визуализировать его более четко!

+0

Уточнить, действительно ли MPI является обязательным (кажется маловероятным, поскольку вы не включили ни одну линию MPI там), или чего-то относительно простого, такого как OpenMP, было бы достаточно? Кроме того, есть много примеров. Разве вы не видели никого из них? – mmgp

+0

Хотя это теоретически элегантный способ решения этой проблемы, на практике это может быть не так. Если вы работаете над достаточно большими изображениями (2^m X 2^n), программа может просто потерпеть крах, сказав, что у вас закончилось пространство стека (достигнута максимальная глубина рекурсии) – subzero

ответ

1

Я хотел бы предложить использовать OPENMP (http://openmp.org/wp/) для параллельной обработки, для вашего случая. Легко настроить и скомпилировать, чтобы оптимизировать простые циклы. Изменение кода также тривиально. Но я не уверен в обработке рекурсии, поэтому будьте осторожны или просто используйте нерекурсивную реализацию. Некоторые руководства и руководства: http://bisqwit.iki.fi/story/howto/openmp/

Смежные вопросы