簡體   English   中英

OpenMP / C ++如何並行增加變量?

[英]OpenMP/C++ How to increment a variable in parallel for?

我有一個問題,大問題=。 我有兩個圖像(使用GDIplus),我想比較像素-像素。 當pixelA = pixelB時,變量cont應該增加。

今天,我比較兩個相等的圖像,我的回報應該是100%,但是這個回報是70%。

為什么? 我該如何解決?

看到

    #pragma omp parallel for schedule(dynamic) 
    for (int x = 0; x < height; x++){
        for (int y = 0; y < width; y++){
            int luma01 = 0, luma02 = 0;


            Gdiplus::Color pixelColorImage01;
            Gdiplus::Color pixelColorImage02;

                myImage01->GetPixel(x, y, &pixelColorImage01);
                luma01 = pixelColorImage01.GetRed() + pixelColorImage01.GetGreen() + pixelColorImage01.GetBlue();
                myImage02->GetPixel(x, y, &pixelColorImage02);
                luma02 = pixelColorImage02.GetRed() + pixelColorImage02.GetGreen() + pixelColorImage02.GetBlue();

                #pragma omp critical
                if (luma01 == luma02){
                    cont++;
                }
            }
        }

圖像之間的相等百分比

謝謝=)

在並行化解決方案之前,請確保可以按順序解決它。 在這種情況下,這意味着注釋掉#pragma並首先對其進行調試。

第一,

for (int x = 0; x < height; x++){
    for (int y = 0; y < width; y++){
        ...
        myImage01->GetPixel(x, y, &pixelColorImage01);

您對widthheight轉置,因此對於任何非正方形的圖像,您都會得到錯誤的答案。

其次,您的像素相等性指標會發生沖突。 由於您將各個顏色的亮度相加然后比較該總和,因此它會認為,例如,全紅色像素等於全藍色像素。
做這樣的事情:

if (red1 == red2 && green1 == green2 && blue1 == blue2)
    cont++;

至於並行化,這在技術上是正確的,但會給您帶來糟糕的性能。 您在if周圍放置了一個關鍵部分,這意味着如果所有工作人員都在不斷嘗試獲取該鎖。 換句話說,您有並行工作人員,但每個人都必須等待所有其他人。 換句話說,您已經序列化了並行代碼。 要解決此問題,請查找OpenMP減速器。

我很高興您的回答! 亞當,我換了Matriz的位置。 現在,我比較各個顏色! 現在,我有兩個小問題。 當我運行代碼時:

查看我的代碼結果: http : //postimg.org/image/8c1ophkz9/

使用#pragma omp parallel進行時間表(dynamic,1024)減少(+:cont)並行時間(0.763秒)(相似度的100%)順序時間(0.702秒)(相似度的100%)

使用#pragma omp parallel進行調度(動態)減少(+:cont)並行時間(0.113秒)(相似度的66%)順序時間(0.703秒)(相似度的100%)

image1等於image2。 我的代碼中有很多大腸菌病= \\我需要減少並行代碼的時間。 我不明白為什么o並行代碼比順序代碼更慢= \\

並行代碼

#pragma omp parallel for schedule(dynamic) reduction(+:cont)
                for (int x = 0; x < width; x++){
                    for (int y = 0; y < height; y++){

                        Gdiplus::Color pixelColorImage01;
                        Gdiplus::Color pixelColorImage02;

                        myImage01->GetPixel(x, y, &pixelColorImage01);
                        myImage02->GetPixel(x, y, &pixelColorImage02);
                        cont += (pixelColorImage01.GetRed() == pixelColorImage02.GetRed() && pixelColorImage01.GetGreen() == pixelColorImage02.GetGreen() && pixelColorImage01.GetBlue() == pixelColorImage02.GetBlue());


                    }

                }

順序碼

        for (int x = 0; x < width; x++){
        for (int y = 0; y < height; y++){

            Gdiplus::Color pixelColorImage01;
            Gdiplus::Color pixelColorImage02;

            myImage01->GetPixel(x, y, &pixelColorImage01);
            myImage02->GetPixel(x, y, &pixelColorImage02);
            cont += (pixelColorImage01.GetRed() == pixelColorImage02.GetRed() && pixelColorImage01.GetGreen() == pixelColorImage02.GetGreen() && pixelColorImage01.GetBlue() == pixelColorImage02.GetBlue());


        }

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM