如何使用递归的OpenMP

时间:2015-10-10 13:48:21

标签: c++ openmp

我想问一下是否有可能在我的代码中使用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方法(如果可能的话)。

@edit

我尝试了类似的东西,这是正确的吗?

#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);
        }

1 个答案:

答案 0 :(得分:0)

对于这么简单而且很少的东西,最好使用顺序形式而不是平行解决方案。你只画三行。 OpenMP使用预处理程序指令,可以创建一个pthread。创建一个线程需要花费时间并完成它。因此,您的平行解决方案的效率将低于您的后续解决方案。

如果你有1000次迭代和更多的循环,那么使用OpenMP将是一个不错的选择,但在你的情况下,这是一个坏主意。在这种情况下,OpenCL解决方案将是一个好主意,因为您的情况需要使用显卡性能而不是处理器,但即使使用OpenCL,我认为在开始使用时您的代码实际上并不快。如果你没有显卡,OpenCL将使用你的处理器,它将花费与OpenMP相同的时间。此外,OpenCL需要一些初始化,这将在开始时花费太多时间,并且您的顺序代码将在OpenCL解决方案开始处理您的代码时完成。

如果您想学习OpenMP,您需要找到需要并行化的情况,并考虑并行化解决方案是更快还是更快。您不能并行化每个解决方案,有时顺序解决方案更好,您不需要并行化它们。