2012-04-22 6 views
0

イメージ(QPainter)をマージするプログラム(C++)をビルドしています。順番にそれは素晴らしい仕事ですが、OpenMPと並列化する必要があります。これどうやってするの?私は可能性のある問題は、メモリの割り当てまたはループのネストされていると思う。これは、事前に感謝:)OpenMPがループのために入れ子になっています(Qtで動作します)

int width = (x2-x1)+1; 
int height = (y2-y1)+1; 

//every image is 256x256 
QImage mapa = QImage(256*width, 256*height, QImage::Format_ARGB32_Premultiplied); 
QPainter painter(&mapa); 

painter.setCompositionMode(QPainter::CompositionMode_SourceOver); 

int x=0; 
int y=0; 


#pragma omp parallel 
{ 
char *kawalek; 

#pragma omp parallel for lastprivate(i) firstprivate(j) shared(x1, x2, y1, y2, painter) reduction(+:y, x) 
for(i=y1; i<=y2; i++){ 
    x=0; 
    #pragma omp parallel for shared(x1, x2, i, y, painter) reduction(+:x) 
    for(j=x1; j<=x2; j++){ 
     { 
     kawalek = (char*) malloc(snprintf(NULL, 0, "pobrane/%d_%d.png", j, i)+1); 
     sprintf(kawalek, "pobrane/%d_%d.png", j, i); 
     //cout << "czesc: " << kawalek << endl; 
     QImage fragment(kawalek); 
     painter.drawImage(x, y, fragment); 

     //cout << "wspolrzedne czesci x: " << x << "y: " << y << endl; 
     } 
     x+=256; 
    } 
    y+=256; 
} 
} 

painter.end(); 

mapa.save(filename); 

@Riateche、おかげで、ここで私の最初の質問です;)そのループがスピードアップしていない理由を私の次の質問は

...

#pragma omp parallel for private(i) shared(ile) 
    for(i=0; i<ile; i++){ 
     results[i].load(sciezki[i]); 
    } 

答えて

2

複数のスレッドから同時に変数mapaに書き込むことはできません。

Qtスレッドを使用する場合は、信号とスロットを使用して計算結果をメインスレッドに渡すことをお勧めします。別の方法は、メインスレッドに結果の配列を作成することです。各スレッドは、自分の結果のみを配列の1つのセルに書き込みます。すべてのスレッドが終了したら、メインスレッドは結果を読み込んでペイントする必要があります。

QImage :: load()がpngファイルを読み込むことを検討してください。それはあなたのコードよりも簡単です。

+0

>>別の方法は、メインスレッドに結果の配列を作成することです。 その配列はどのように見えますか? – bgs

+0

たとえば、 'QImage * results = new QImage [count]'です。 –

関連する問題