我正在使用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
任何想法是什么问题?
答案 0 :(得分:0)
我用i < 10000000
运行程序并检查它花了多少CPU时间。
你可以看到确实产生的两个线程,但它只提供相当于一个线程的性能。
我怀疑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