我想问一下是否有可能在我的代码中使用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);
}
答案 0 :(得分:0)
对于这么简单而且很少的东西,最好使用顺序形式而不是平行解决方案。你只画三行。 OpenMP使用预处理程序指令,可以创建一个pthread。创建一个线程需要花费时间并完成它。因此,您的平行解决方案的效率将低于您的后续解决方案。
如果你有1000次迭代和更多的循环,那么使用OpenMP将是一个不错的选择,但在你的情况下,这是一个坏主意。在这种情况下,OpenCL解决方案将是一个好主意,因为您的情况需要使用显卡性能而不是处理器,但即使使用OpenCL,我认为在开始使用时您的代码实际上并不快。如果你没有显卡,OpenCL将使用你的处理器,它将花费与OpenMP相同的时间。此外,OpenCL需要一些初始化,这将在开始时花费太多时间,并且您的顺序代码将在OpenCL解决方案开始处理您的代码时完成。
如果您想学习OpenMP,您需要找到需要并行化的情况,并考虑并行化解决方案是更快还是更快。您不能并行化每个解决方案,有时顺序解决方案更好,您不需要并行化它们。