当前位置: 首页 > news >正文

并行程序设计基础——MPI不连续数据发送(2)

目录

一、地址函数

二、与函数类型有关的调用

三、下界标记类型和上界标记类型

四、打包与解包

五、小结


        上一节我们介绍了MPI不连续发送中定义不同数据类型的接口,这一节我们继续对MPI不连续数据发送的其它知识点进行介绍。开始之前,我们先以一个编程示例对上节内容进行回顾。

#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
#define NUMBER_OF_TESTS 10int main(int argc, char *argv[])
{int blocklens[2];int rank, i, j, k, n, stride, nloop;double *buf, *lbuf;double t1, t2, tmin;MPI_Aint indices[2];MPI_Datatype old_types[2];MPI_Status status;register double *in_p, *out_p;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &rank);n = 1000;stride = 24;nloop = 100000/n;buf = (double*)malloc(n*stride*sizeof(double));if(!buf){printf("Could not allocate send/recv buffer of size %d.\n", n*stride);MPI_Abort(MPI_COMM_WORLD, 1);}lbuf = (double*)malloc(n*sizeof(double));if(!lbuf){printf("Could not allocate send/recv lbuffer of size %d.\n", n);MPI_Abort(MPI_COMM_WORLD, 1);}if(rank == 0)printf("Kind\tn\tstride\ttime(sec)\tRate(MB/sec)\n");MPI_Type_vector(n, 1, stride, MPI_DOUBLE, &vec1);MPI_Type_commit(&vec1);tmin = 1000;for(k = 0; k < NUMBER_OF_TESTS; k++){if(rank == 0){MPI_Sendrecv(MPI_BOTTOM, 0, MPI_INT, 1, 14, MPI_BOTTOM, 0, MPI_INT, 1, 14, MPI_COMM_WORLD, &status);t1 = MPI_Wtime();for(j = 0; j < nloop; j++){MPI_Send(buf, 1, vec1, 1, k, MPI_COMM_WORLD);MPI_Recv(buf, 1, vec1, 1, k, MPI_COMM_WORLD, &status);}t2 = (MPI_Wtime() - t1)/nloop;if(t2 < tmin) tmin = t2;}else if(rank == 1){MPI_Sendrecv(MPI_BOTTOM, 0, MPI_INT, 0, 14, MPI_BOTTOM, 0, MPI_INT, 0, 14, MPI_COMM_WORLD, &status);for(j = 0; j < nloop; j++){MPI_Recv(buf, 1, vec1, 0, k, MPI_COMM_WORLD, &status);MPI_Send(buf, 1, vec1, 0, k, MPI_COMM_WORLD);}}}tmin = tmin / 2.0;if(rank == 0){printf("Vector\t%d\t%d\t%f\t%f\n", n, stride, tmin, n*sizeof(double)*1.0e-6/tmin);}MPI_Type_free(&vec1);blocklens[0] = 1;blocklens[1] = 1;indices[0] = 0;indices[1] = stride * sizeof(double);old_types[0] = MPI_DOUBLE;old_types[1] = MPI_UB;MPI_Type_struct(2, blocklens, indices, old_types, &vec_n);MPI_Type_commit(&vec_n):tmin = 1000;for(k = 0; k < NUMBER_OF_TESTS; k++){if(rank == 0){MPI_Sendrecv(MPI_BOTTOM, 0, MPI_INT, 1, 14, MPI_BOTTOM, 0, MPI_INT, 1, 14, MPI_COMM_WORLD, &status);t1 = MPI_Wtime();for(j = 0; j < nloop; j++){MPI_Send(buf, n, vec_n, 1, k, MPI_COMM_WORLD);MPI_Recv(buf, n, vec_n, 1, k, MPI_COMM_WORLD, &status);}t2 = (MPI_Wtime() - 1)/nloop;if(t2 < tmin) tmin = t2;}else if(rank == 1){MPI_Sendrecv(MPI_BOTTOM, 0, MPI_INT, 0, 14, MPI_BOTTOM, 0, MPI_INT, 0, 14, MPI_COMM_WORLD, &status);for(j = 0; j < nloop; j++){MPI_Recv(buf, n, vec_n, 0, k, MPI_COMM_WORLD, &status);MPI_Send(buf, n, vec_n, 0, k, MPI_COMM_WORLD);}}}tmin = tmin/2.0;if(rank == 0){printf("Struct \t%d\t%d\t%f\t%f\n", n, stride, tmin, n*sizeof(double)*1.0e-6/tmin);}MPI_Type_free(&vec_n);tmin = 1000;for(k = 0; k < NUMBER_OF_TESTS; k++){if(rank == 0){MPI_Sendrecv(MPI_BOTTOM, 0, MPI_INT, 1, 14, MPI_BOTTOM, 0, MPI_INT, 1, 14, MPI_COMM_WORLD, &status);t1 = MPI_Wtime();for(j = 0; j < nloop; j++){for(i = 0; i < n; i++)lbuf[i] = buf[i*stride];MPI_Send(lbuf, n, MPI_DOUBLE, 1, k, MPI_COMM_WORLD);MPI_Recv(lbuf, n, MPI_DOUBLE, 1, k, MPI_COMM_WORLD, &status);for(i = 0; i < n; i++)buf[i*stride] = lbuf[i];}t2 = (MPI_Wtime() - t1)/nloop;if(t2 < tmin) tmin = t2;}else if(rank == 1){MPI_Sendrecv(MPI_BOTTOM, 0, MPI_INT, 0, 14, MPI_BOTTOM, 0. MPI_INT, 0, 14, MPI_COMM_WORLD, &status);for(j = 0; j < nloop; j++){MPI_Recv(lbuf, n, MPI_DOUBLE, 0, k, MPI_COMM_WORLD, &status);for(i = 0; i < n; i++)buf[i*stride] = lbuf[i];for(i = 0; i < n; i++)lbuf[i] = buf[i*stride];MPI_Send(lbuf, n, MPI_DOUBLE, 0, k, MPI_COMM_WORLD);

http://www.mrgr.cn/news/14476.html

相关文章:

  • 软件设计模式 - 汇总
  • KESSIL A360维修
  • 计算机基础知识复习8.29
  • 设计模式相关
  • Spring八股文
  • 手机三网状态实时查询分享
  • git 如何在切换分支时不丢弃本地修改
  • Android活动(activity)与服务(service)进行通信
  • 计算机毕业设计选题推荐-游戏比赛网上售票系统-Java/Python项目实战
  • APP.vue引入子组件进行页面展示
  • dbeaver数据库工具配置连接openGauss5.X
  • 【MATLAB源码-第147期】基于matlab的QPSK调制解调在AWGN信道,瑞利信道,莱斯信道理论与实际误码率对比仿真。
  • 解决ubuntu22.04无法识别CH340/CH341和vscode espidf插件无法选择串口设备节点问题
  • 高效网络管理解决方案及“监控易”推荐
  • Spring+SpringWeb+MyBatis三大框架整合教程 实现先前后端交互搭建
  • [000-01-022].第03节:RabbitMQ中的优先级队列
  • 极光推送(JPush)赋能登虹科技,打造智慧视觉云平台新体验
  • 279. 完全平方数
  • 华为HCIA考试大纲
  • 【k8s】Kubernetes初步