IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Docker上进行MPI编程 -> 正文阅读

[系统运维]Docker上进行MPI编程

**

一、前言

**
关于Docker的安装见博文windows安装Docker
本文涉及的MPI编程为求两个矩阵的乘积,语言为C++
**

二、安装MPI

**
1.因为我们使用的语言是C++,需要gcc或g++支持C++编程,所以查看Docker内哪些镜像有g++

docker search g++

在这里插入图片描述
2.选择其中一个镜像拉取

docker pull eclipse/cpp_gcc

在这里插入图片描述
3.查看当前所有镜像

docker images

在这里插入图片描述
发现拉取成功。

4.用镜像生成容器,并进入命令行

docker run -it -u root --net=host eclipse/cpp_gcc /bin/bash

5.后续下载MPI编程所需要的配置文件时,需要访问国外仓库,我们可以把源换为国内的,速度更快。

sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
cat /etx/apt/sources.list
rm -Rf /var/lib/apt/lists/*
apt-get update

在这里插入图片描述
在这里插入图片描述
6.安装mpich和libeigen3-dev

apt install mpich   
apt install libeigen3-dev

7.退出容器,查看容器id

exit
docker ps -a

在这里插入图片描述8.用容器id查找容器全名Id,并记住全名,在下一步要用到

docker inspect id

在这里插入图片描述
**

三、运行MPI

**
1.退出Docker后,将自己写好的mpi代码从本机复制到镜像文件夹内并查看。注:这里我的mpi代码文件为testmpi.cpp;注意区分容器名(id)和容器全名(Id)

docker cp 本机代码路径 容器全名:/home/user/代码文件名
docker start 容器名
docker exec -it -u root 容器名 bash
cd /home/user
ls

可以看到该文件
在这里插入图片描述
2.复制mpi编译所需的libmpi.so到当前目录下

cp /usr/lib/libmpi.so /home/user/
cd /home/user
ls

在这里插入图片描述
3.mpi编译

g++  testmpi.cpp libmpi.so -o mpi
ls

在这里插入图片描述
4.运行结果

mpiexec -n 4 ./mpi

其中,4为设置的进程数
在这里插入图片描述
在这里插入图片描述
5.testmpi.cpp代码如下

#include <stdio.h>
#include <mpich/mpi.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include<omp.h>
#include<iostream>
using namespace std;
//生成随机矩阵
int *generate_matrix(int size)
{
	srand((unsigned)time(NULL) + (unsigned)rand());
	int *matrix;
	matrix = (int *)malloc(sizeof(int) * size*size);
	for (int i = 0; i < size*size; i++)
	{
		matrix[i] = rand() % 10;
	}
	return matrix;
}
//输出矩阵
void print_matrx(int *a, int size)
{
	for (int i = 0; i < size; i++)
	{
		for (int j = 0; j < size; j++)
		{
			printf("%d ", a[i*size + j]);
		}
		printf("\n");
	}
	printf("\n");
}
//矩阵相乘
int * Multiplication(int a[], int b[], int size, int line)
{
	int *result;
	int temp = 0;
	result = (int *)malloc(sizeof(int) * size*size);
//#pragma omp parallel for num_threads(2)
	for (int i = 0; i < line; i++)
	{
		for (int j = 0; j < size; j++)
		{
			temp = 0;
			for (int k = 0; k < size; k++)
				temp += a[i*size + k] * b[k*size + j];
			result[i*size + j] = temp;
		}
	}
	return result;
}
int main(int argc, char *argv[])
{
	clock_t time1, time2;
	int size = 16, rank, line, num;
	time1 = clock();
	MPI_Init(&argc, &argv);
	MPI_Comm_rank(MPI_COMM_WORLD, &rank);
	MPI_Comm_size(MPI_COMM_WORLD, &num);
	int *matrix1;
	int *matrix2;
	int *matrix3;
	int *resultMg;
	int *revMg;
	int *resultMg0;
	line = size / num ;  //num为进程数,line为每个进程的行数
	matrix1 = (int*)malloc(sizeof(int)*size*size);
	matrix2 = (int*)malloc(sizeof(int)*size*size);
	matrix3 = (int*)malloc(sizeof(int)*size*size);
	resultMg = (int*)malloc(sizeof(int)*size*line);
	resultMg0 = (int*)malloc(sizeof(int)*size*line);
	revMg = (int*)malloc(sizeof(int)*size*line);
	if (rank == 0)
	{
		matrix1 = generate_matrix(size);
		matrix2 = generate_matrix(size);

		printf("matrix1 is :\n");
		print_matrx((int *)matrix1, size);

		printf("matrix2 is :\n");
		print_matrx((int *)matrix2, size);

		resultMg0=Multiplication(matrix1,matrix2, size, line);
		for (int m = 0; m < line; m++)
			for (int n = 0; n < size; n++)
				matrix3[m*size + n] = resultMg0[m*size + n];

		for (int i = 1; i < num; i++)
			MPI_Send(matrix2, size*size, MPI_INT, i, 0, MPI_COMM_WORLD);

		for (int i = 1; i < num; i++)
			MPI_Send(matrix1 + i*line*size, size*line, MPI_INT, i, 1, MPI_COMM_WORLD);

		for (int i = 1; i < num; i++)
		{
			MPI_Recv(resultMg, line*size, MPI_INT, i, 3, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
			for (int m = 0; m < line; m++)
				for (int n = 0; n < size; n++)
					matrix3[(i*line + m)*size + n] = resultMg[m*size + n];
		}
		time2 = clock();
		print_matrx((int *)matrix3, size);
		cout << time2 - time1 << endl;
		free(matrix1);
		free(matrix2);
		free(matrix3);
		free(revMg);
		free(resultMg);
	}
	else {
		MPI_Recv(matrix2, size*size, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
		MPI_Recv(revMg, size*line, MPI_INT, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
		resultMg = Multiplication(revMg, matrix2, size, line);
		MPI_Send(resultMg, line*size, MPI_INT, 0, 3, MPI_COMM_WORLD);
	}

	MPI_Finalize();
	return 0;
}
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-12 23:53:40  更:2021-10-12 23:55:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 18:48:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码