我使用的是 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 时间。
您可以看到确实生成了两个线程,但它仅提供相当于一个线程的性能。
我怀疑 printf
中发生了很多争用。称呼。该库可能以一种方式实现锁定,即每个线程必须等待相邻线程完成打印才能开始。换句话说,一次只能有一个线程进行打印。
上面的实验结果证实了这一点。
即:你在期待这个
| 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
关于c - OpenMP 无法在 C 语言中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23237986/