OpenMP无法在C中工作

时间:2014-04-23 07:43:38

标签: c parallel-processing openmp

我正在使用Mac OS X并按照此处的说明(http://hpc.sourceforge.net)安装gcc。

我在C中有以下简单程序:

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

int main(int argc, 
         char **argv)
{

    int i;

    #pragma omp parallel num_threads(2)
    {
        #pragma omp for private(i)
        for (i = 0; i < 10; ++i)
        {
            printf("%d\n", i);
        }
    }

}

编译如下:

gcc -o test -fopenmp test.c

结果是

./test
0
1
2
3
4
5
6
7
8
9

任何想法是什么问题?

1 个答案:

答案 0 :(得分:0)

我用i < 10000000运行程序并检查它花了多少CPU时间。

105.4% CPU 2 Threads

你可以看到确实产生的两个线程,但它只提供相当于一个线程的性能。

我怀疑printf电话中发生了很多争用。库可能正在实现锁定,每个线程必须等待相邻的线程才能开始打印。换句话说,一次只能打印一个线程。

上述实验结果证实了这一点。

I.e:你期待这个

| Thread 1 | Thread 2 |
| printf   | printf   |
| printf   | printf   |
| printf   | printf   |
| printf   | printf   |
| printf   | printf   |

当它可能更像是

| Thread 1 | Thread 2 |
| printf   |          |
|          | printf   |
|          | printf   |
| printf   |          |
| printf   |          |

具有讽刺意味的是,在没有OpenMP

的情况下编译时,这个程序的运行速度要快得多
$ gcc -O3 -fopenmp omp.c
$ time ./a.out > /dev/null
^C

real    0m16.743s
user    0m3.679s
sys     0m13.954s
$ gcc -O3 omp.c
$ time ./a.out > /dev/null

real    0m1.790s
user    0m1.740s
sys     0m0.005s