c++ - 如何通过递归使用 OpenMP

标签 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 方法。

@编辑

我试过类似的方法,是否正确?

#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,你需要找到一个需要并行化的情况,并思考并行化的解决方案是更快还是更慢。您无法并行化每个解决方案,有时顺序解决方案更好,您不需要并行化它们。

关于c++ - 如何通过递归使用 OpenMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33054688/

相关文章:

c++ - 为工厂创建抽象工厂有意义吗?

javascript - 如何在HTML JavaScript 中调用mfc C++ 函数以及如何在mfc C++ 中调用JavaScript 函数?

c++ - 如何在C++中销毁对象

cuda - 多 GPU CUDA 推力

c++ - 装饰器与策略模式(与?)扩展功能

android - 共享对象、符号、C/C++ lib 链接和加载

c - 使用openmp优化MSE算法

c++ - 启用 openmp 时出错 - "ld: library not found for -lgomp"和 Clang 错误

algorithm - 用于检测无向图中循环的最佳并行算法

syntax - 如何在 Fortran 中对数组使用归约?