c - OpenMP 无法在 C 语言中工作

标签 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

知道问题是什么吗?

最佳答案

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

105.4% CPU 2 Threads

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

我怀疑 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/

相关文章:

c - 将函数数组作为参数传递给函数

mysql - MySQL InnoDB 适合这种场景吗?

powershell - 如何增加与 Powershell 3 并行的进程数?

java - 并行流中的流操作等到前一个流操作处理完所有元素

c++ - openMP 许可证信息

c++ - 使用 GMP/ARB 矩阵减少 OpenMP

c - 我添加了 MAX7320 i2c 输出芯片。如何让内核为其加载驱动程序?

c - 这段代码如何破坏我的堆栈跟踪?

c++ - 是否有任何 C 或 C++ 标准识别内存映射文件的存在?

c - 冗余 __thread 和 omp threadlocal 声明