在使用OpenMP进行多线程处理的代码中,如果线程数设置为一个,那么在添加OpenMP或删除所有OpenMP内容之前,代码的时间性能是否与串行代码相同或非常相似?
发布于 2014-04-08 07:06:07
你应该做些测试然后找出答案。但答案是,时间可以是,但不一定是不同的。关于为什么会发生这种情况的一个很好的例子,请参阅这个答案,多线程可以抑制编译器优化吗?和一个线程比顺序版本慢的OpenMP。
编译器可以在不使用OpenMP语句的情况下优化代码。因此,当将串行代码和并行代码与OpenMP进行比较时,您应该在不同的可执行文件中使用OpenMP和不带OpenMP,然后分别对它们进行计时。E.g
//foo.c
foo() {
for(int i=0; i<n; i++) {
}
//foo_omp.c
foo_omp() {
#pragma omp parallel for
for(int i=0; i<n; i++) {
}另一种选择是在没有OpenMP加密的情况下编译(例如在GCC中没有-fopenmp )。您的编译将忽略语用语句,并像它们不存在一样进行优化。然而,这种方法有两个缺点。如果使用和OpenMP存根函数(如omp_get_wtime() ),那么您的代码不会和GCC一起编译 (但在您只能启用存根函数。和MSVC中,即使不启用OpenMP)也能工作。另一个问题是,为了并行化您的函数,您通常希望将它从串行版本中更改一点(有时是很多),因此要进行公平的比较,无论如何您必须比较两个单独的函数。
https://stackoverflow.com/questions/22927973
复制相似问题