我正在使用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


任何想法是什么问题?

最佳答案

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



您可以看到确实产生了两个线程,但是它们的性能仅相当于一个线程。

我怀疑调用中发生了很多争用。该库可能以每个线程必须等待相邻线程完成打印才能开始的方式来实现锁定。换句话说,一次只能打印一个线程。

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

即:您正在期待这个

| 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

10-07 19:31
查看更多