簡體   English   中英

如何在遞歸中使用OpenMP

[英]How to use OpenMP with recursive

我想問一下是否有可能在我的代碼中使用openmp。

class Triangle {
public:
    void drawLine(Point from, Point to) {
        //Do something.
    }

    void drawTriangle(Point a, Point b, Point c, Triangle triangle, int level) {
        if (level == 0) {
            return;
        }
        Point ab = Point((a.x + b.x) / 2, (a.y + b.y) / 2);
        Point bc = Point((b.x + c.x) / 2, (b.y + c.y) / 2);
        Point ca = Point((c.x + a.x) / 2, (c.y + a.y) / 2);

        //Is it possible to use Open MP here?
        triangle.drawLine(a, b);
        triangle.drawLine(b, c);
        triangle.drawLine(a, c);

        //Is it possible to use open MP here too?
        drawTriangle(a, ab, ca, triangle, level - 1);
        drawTriangle(ab, b, bc, triangle, level - 1);
        drawTriangle(ca, bc, c, triangle, level - 1);
    }

int _tmain(int argc, _TCHAR* argv[])
{
    int amountOfPowers = 2
    int level =3
    Point a = Point(pow(2, amountOfPowers), 0);
    Point b = Point(pow(2, amountOfPowers), pow(2, amountOfPowers));
    Point c = Point(pow(2, amountOfPowers) - (pow(2, amountOfPowers) * sqrt(3.0) / 2), pow(2, amountOfPowers) / 2);

    Triangle triangle = Triangle();
    triangle.drawTriangle(a, b, c, triangle, level);
    system("PAUSE");
    return 0;
}

我想在drawTraingle方法中使用OpenMP。 有可能以任何方式在這里使用它嗎? 因為我想一次制作3xtriangle.drawLine()方法(在其上使用OpenMP),也想一次制作一次3xdrawTriangle方法(如果可能)。

@編輯

我嘗試過類似的方法,對嗎?

#pragma omp parallel num_threads(3)
#pragma omp single nowait
        {
#pragma omp task 
            triangle.drawLine(a, b);
#pragma omp task 
            triangle.drawLine(copyB, c);
#pragma omp task 
            triangle.drawLine(copyA, copyC);
        }

對於如此簡單而又很少的東西,最好采用順序形式而不是並行解決方案。 您只畫了三條線。 OpenMP使用預處理器指令,該指令將創建一個pthread。 創建線程需要花費時間並完成它。 因此,您的並行解決方案將比您的后續代碼效率更低。

如果您的循環具有1000次或更多次迭代,那么使用OpenMP將是一個不錯的選擇,但是在您的情況下,這是個壞主意。 在這種情況下,OpenCL解決方案將是一個好主意,因為您的情況需要使用圖形處理器的性能而不是處理器,但是即使使用OpenCL,我認為開始時也不夠快,因為您的代碼確實很小。 而且,如果您沒有圖形卡,OpenCL將使用您的處理器,並且與OpenMP花費的時間相同。 而且,OpenCL首先需要一些初始化,這將花費太多時間,並且您的順序代碼將在OpenCL解決方案開始處理您的代碼時完成。

如果要學習OpenMP,則需要找到需要並行化的情況,並考慮並行化的解決方案是更快還是更快。 您無法並行化每個解決方案,有時順序解決方案更好,並且您無需並行化它們。

暫無
暫無

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

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