OpenMP与OpenMPI介绍与简单程序编写

2023-05-16

首先说一下OpenMP与OpenMPI的区别。

OpenMP主要是在单机上进行并行,是基于共享内存的,共享内存就是多个核(包括单CPU多核和多CPU多核(都是单机))共享一个内存,只要是单台计算机都可以认为是共享内存,MP代表多线程的意思(Multi-Processing),其无法进行跨节点运算,并且OpenMP的库是默认集成在g++或者gcc里的;

OpenMPI则是用来进行多处理器,跨节点并行,OpenMPI是基于分布式内存,对于多台计算机组成的集群就是属于分布式内存。其中MPI是消息传递接口的意思(Message Passing Interface),OpenMPI也可以在单机上进行运行,但是由于其不同的核心之间的数据不是共享的,需要进行通信,因此速度不如OpenMP,常见的并行化策略是,在跨节点上采用OpenMPI编程,而在每个计算节点上采用OpenMP编程。

1、OpenMP编程
上面我说过,OpenMP是集成在g++和gcc里的,因此不需要进行安装。
首先我们可以采用一个简单的程序来判断 自己的电脑支不支持OpenMP.

#include <stdio.h>

int main()
{
    #if _OPENMP
        printf("support openmp\n");
    #else
        printf("not support openmp\n");
    #endif
    return 0;
}

其编译命令需要加上 -fopenmp

gcc -fopenmp -o check_opm check_omp.C

运行直接采用./+可执行文件即可。

./check_opm

然后我们进行hello world程序的编写

#include <stdio.h>

int main(void) 
{
	#pragma omp parallel num_threads(6)
	{
	printf("Hello, world. \n");
	}
	
	return 0;
}

依然是直接./+可执行文件

./hello

输出结果:
在这里插入图片描述
2、OpenMPI编程

OpenMPI编程需要事先编译安装OpenMPI,这里给出一个安装教程

OpenMPI有许多内置函数,这里不进行详述,直接给出hello world的代码

#include <mpi.h>
#include <stdio.h>

int main(int argc, char** argv){
    //初始化MPI环境
    MPI_Init(NULL, NULL);

    //获取进程数
    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);

    //获取进程的等级
    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

    //获取进程的名字
    char processor_name[MPI_MAX_PROCESSOR_NAME];
    int name_len;
    MPI_Get_processor_name(processor_name, &name_len);

    //打印helloworld
    printf("Hello world from processor %s, rank %d out of %d processors\n",processor_name, world_rank, world_size);

    //关闭MPI环境
    MPI_Finalize();
}

OpenMPI程序的编译是mpicc指令

mpicc -o hello hello.c

其程序运行命令为mpirun -n 并行核数 ./可执行文件

mpirun -n 2 ./hello

其运行结果为:
在这里插入图片描述
从这里可以看出,OpenMPI在编程时,不需要在代码里指定核数(进程数),而OpenMP则需要事先指定,不然会按照电脑最大核数进行运行。

就先介绍到这里。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenMP与OpenMPI介绍与简单程序编写 的相关文章

  • OpenGL 与 OpenMP 总是出现段错误

    我的程序中有一个循环 它将用像素 GL POINTS 填充 3D 立方体 因此为了加快速度 我想我可以使用 OpenMP 并在我的多核处理器中分离这个 for 循环 问题是 每当我在循环中使用 OpenMP 时 程序都会出现段错误 以下是循
  • 为什么 OpenMP 缩减子句对于静态调度循环是不确定的?

    我一直在从事一个多 GPU 项目 在该项目中我在获得非确定性结果方面遇到了问题 当我发现由于 CPU 上执行的归约子句而获得非确定性结果时 我感到很惊讶 在书里使用 OpenMP 下一步据说 线程组合其值来构建的顺序 共享结果的价值是不确定
  • 使用 MPI_Gather openmpi c 收集字符串

    我想为每个进程生成一个字符串 然后收集所有内容 但是每个进程中创建的字符串是通过附加整数和字符来创建的 我仍然无法正确收集所有内容 我可以一一打印所有部分字符串 但如果我尝试打印 rcv string 我只会得到一个部分字符串 或者可能会出
  • 创建数组时使用 OpenMP 时出现分段错误

    我在访问 for 循环内的数组时遇到分段错误 我想做的是生成 DNA 字符串的所有子序列 当我在 for 中创建数组时 就发生了这种情况 读了一段时间后 我发现openmp限制了堆栈大小 所以使用堆来代替会更安全 所以我更改代码以使用mal
  • OMP 线程私有对象未被破坏

    底线 如何确保 threadprivate 实例被正确销毁 背景 接听时这个问题 https stackoverflow com questions 32347008 confused about firstprivate and thre
  • OMP:OMP PARALLEL DO 和 OMP DO 之间有什么区别(根本没有并行指令)

    好的 我希望以前没有问过这个问题 因为在搜索中找到这个问题有点棘手 我查阅了F95手册 但仍然觉得含糊不清 For the simple case of DO i 0 99
  • 具有子例程和函数的 Fortran OpenMP

    免责声明 我很确定这个问题已经在某个地方得到了回答 但我自己和另一个人一直在努力搜索 但没有结果 我有一个看起来像这样的代码 PROGRAM main omp parallel do omp private somestuff shared
  • 通过向量 OpenMP C 进行矩阵乘法 [重复]

    这个问题在这里已经有答案了 我正在尝试用 C OpenMP 通过向量乘法编写矩阵 但是当我添加处理器时我的程序会变慢 1 proc 1 3 s 2 proc 2 6 s 4 proc 5 47 s 我在我的电脑 核心 i5 和我们学校的集群
  • osx 和 clion,找不到 omp.h

    如何说服 cmake 在 CLion 内 我有可用的 OpenMP 标头 我正在尝试编译这个项目SCD https github com DAMA UPC SCD我收到以下错误 15 Building CXX object tools se
  • 如何提高 OpenMP 代码的性能?

    我目前正在尝试提高我的代码的并行性能 但我对 OpenMP 仍然是新手 我必须迭代一个大容器 在每次迭代中从多个条目读取并将结果写入单个条目 下面是我正在尝试做的一个非常简单的代码示例 data是一个指向数组的指针 其中存储了许多数据点 在
  • OpenMP 通过三重 for 循环并行化矩阵乘法(性能问题)

    我正在使用 OpenMP 编写一个矩阵乘法程序 为了缓存方便 实现乘法 A x B 转置 行 X 行而不是经典的 A x B 行 x 列 以获得更好的缓存效率 这样做时 我遇到了一个有趣的事实 对我来说这是不合逻辑的 如果在这段代码中我并行
  • 顺序和并行版本给出不同的结果 - 为什么?

    我有一个嵌套循环 L 和 A 是完全定义的输入 pragma omp parallel for schedule guided shared L A reduction dummy for i k 1 i
  • MPI_Send() 和 MPI_Ssend() 之间的区别?

    I know MPI Send 是一个阻塞调用 它会等待直到可以安全地修改应用程序缓冲区以供重用 为了使发送调用同步 应该与接收者握手 我们需要使用MPI Ssend 我想知道两者之间的区别 假设我需要在进程之间发送固定数量的字节 哪一个应
  • 时间:2019-03-07 标签:c++openmp和threadprivate

    我遇到的情况是 在一台计算机 具有高性能节点的集群 上有一个代码 可以编译 但在我的个人电脑上却不能 错误是 var declared threadprivate after first use pragma omp threadpriva
  • 由于文件 libmpi.so.1 丢失而出错

    我使用 Omnet 和 Veins 进行模拟 直到我昨晚从 Ubuntu 15 升级到 16 04 LTS 之前它都工作正常 现在 我在尝试运行模拟时收到以下错误 error while loading shared libraries l
  • Qt 支持 OpenMP 吗?

    我在 Visual Studio 项目中使用 OpenMP 目前非常认真地考虑更改为 QT Creator Visual Studio 不是很糟糕吗 我对微软的期望更高 但无论如何 QT Creator 支持 OpenMP 吗 如果出现这种
  • gcc 自动矢量化(未处理的数据引用)

    我不明白为什么这样的代码没有用 gcc 4 4 6 进行矢量化 int MyFunc const float pfTab float pfResult int iSize int iIndex for int i 0 i lt iSize
  • 在 openMP C++ 中并行化许多嵌套 for 循环

    你好 我是 C 新手 我编写了一个可以运行的代码 但是由于许多嵌套的 for 循环 它很慢 我想通过 openmp 来加速它 任何可以指导我的人 我尝试使用 pragma omp 并行 前ip循环并在这个循环中我使用了 pragma omp
  • 基于任务的编程:#pragma omp task 与 #pragma omp parallel for

    考虑到 void saxpy worksharing float x float y float a int N pragma omp parallel for for int i 0 i lt N i y i y i a x i And
  • 并行迭代器

    我正在设计一个 C 数据结构 用于图形 供并行代码 使用 OpenMP 使用 假设我想要一个能够迭代所有元素 节点 的方法 当然 这个迭代将是并行的 是否可以使用迭代器来实现此目的 迭代器应该是什么样子才能实现并行访问 在这种情况下 您会建

随机推荐