openmp单线程与没有openmp

时间:2014-04-08 05:06:07

标签: openmp

在使用openmp进行多线程处理的代码中,如果将线程数设置为1,则在添加OpenMP或删除所有OpenMP内容之前,代码的时间性能是否与序列代码的时间性能相同或非常相似?

1 个答案:

答案 0 :(得分:3)

你应该做一些测试并找出答案。但答案是时间可以但不一定是不同的。请参阅此答案,了解为何可能发生这种情况May compiler optimizations be inhibited by multi-threading? 还有这一个OpenMP with 1 thread slower than sequential version

编译器可以在不使用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)。您的编译将忽略pragma语句并进行优化,就好像它们不存在一样。但是,这种方法有两个缺点。如果您使用和omp_get_wtime()等OpenMP存根函数,那么您的代码won't compile with GCC(但在ICC you can enable only the stub functions和MSVC中,即使您不启用OpenMP,它们也能正常工作)。另一个问题是,为了并行化你的功能,你经常想要从串口版本中稍微改变一下(或者有时很多),所以为了做一个公平的比较你必须比较两个独立的功能。