c - 如何设置 openMP

标签 c parallel-processing openmp

我想在带有 Eclipse IDE 的 Windows 7 上用 C 测试 openMP。我在任何地方都找不到设置 openMP 的具体步骤。你能帮帮我吗?

最佳答案

我对 OpenMP 的了解不多,但这是我自己尝试的结果。

OpenMP 允许您告诉编译器事物应该并行运行。这是一个数到 10000000000 的示例:

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

int main(int argc, char **argv)
{
    long result = 0;
    long i;

#pragma omp parallel for reduction(+: result)
    for (i = 0; i < 10000000000; i++) {
        result++;
    }
    printf("%li\n", result);
    return EXIT_SUCCESS;
}

这将像普通的 C 程序一样编译:

$ gcc -o OpenMPTest main.c

它在我的机器上运行 30 秒:

$ time ./OpenMPTest
10000000000

real 0m30.674s
user 0m30.628s
sys 0m0.014s

向 gcc 添加 -fopenmp 选项可启用 OpenMP 支持。这就是让循环在多个线程中运行所需的全部内容。

$ gcc -o OpenMPTest main.c -fopenmp

这将双核系统上的运行时间减半至 15 秒:

$ time ./OpenMPTest
10000000000

real 0m15.840s
user 0m30.123s
sys 0m0.037s

下面是对 #pragma 行功能的简要描述:

#pragma omp

这是 openmp 命令的前缀。

parallel

告诉编译器下一条语句应该并行运行。

for reduction(+: result)

通过加法将来自并行循环的result 变量的所有值合并为一个值。删除它会导致打印出的最终数字不正确。

我知道您使用的是 eclipse,但 MSDN 文档非常适合描述 OpenMP: OpenMP in Visual C++

关于c - 如何设置 openMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8104560/

相关文章:

c - MPI - C - 发送数组表现得很奇怪

c++ - 将启用 MPICH2 的代码转换为 OpenCL 代码

c - 是否可以更快地对 0's 1' 求和?

c++ - 顺序和并行版本给出不同的结果 - 为什么?

c - 我如何在不包含 "unistd.h"的情况下使用 read() 和 write() ?

c - 释放内存后我们如何访问指针?

c++ - 将 OpenMP 与 C++ 结合使用的算法库

c - OpenMP time 和 clock() 给出两个不同的结果

c - 如何读取文件和分离值

c - Linux 中的物理位置感知用户空间内存分配(内存 Controller 亲和性)