2

我使用 OpenMP 和 Intel TBB 并行化了图像卷积和 lu 分解。我正在1-8个核心上测试它。但是,当我通过分别使用 set_num_threads(1) 和 task_scheduler_init InitTBB(1) 指定一个线程来在 OPenMP 和 TBB 中的 1 个内核上尝试它时;由于 TBB 开销,与顺序代码相比,TBB 性能显示出一些小的下降,但令人惊讶的是,OpenMP 在单核上没有显示任何开销,并且性能与顺序代码完全相同(使用 Intel O3 优化级别)。我正在使用 OpenMP 循环的静态调度。这是现实的还是我做错了什么?

4

4 回答 4

2

如果仅使用一个线程运行 OpenMP 运行时,它可能不会创建任何线程。

此外,仅使用 OpenMP 并行化指令有时也会使串行代码运行得更快,因为您实际上是在为编译器提供更多信息。例如,工作共享结构告诉编译器循环的迭代是相互独立的,它可能无法自行推断,并且允许编译器使用更积极的优化策略。当然,并非总是如此,但我已经看到它发生在“真实世界的代码”中。

于 2011-10-01T18:32:47.250 回答
0

关于 OpenMP 的事情是编译器为您完成工作,它需要对顺序代码进行最少的修改,并且如果分配给每个线程的任务非常大,通常会给出一些不错的结果。我建议尝试在 c++11 上使用 Pthread 或线程测试您的代码并查看结果。

于 2015-01-31T20:51:44.380 回答
0

OpenMP 将代码的装饰部分(#pragma omg for/parallel)分叉到主线程(也可以在没有 OpenMP 的情况下执行)和其他线程中。

如果您配置为仅使用 1 个线程,则这只是主线程,在没有 OpenMP 指令的情况下执行。没有开销,因为执行路径没有分叉。

于 2012-06-14T11:12:29.533 回答
0

OpenMP 是编译器完成所有工作的地方。如果编译器知道它将始终是串行代码,它可以完全合法地跳过所有并行位。

TBB 据我了解,它基本上只是一个库。它总是需要用必要的部分来装饰你的算法,以并行和串行运行它。

于 2011-09-04T18:45:39.220 回答