国科大-高性能计算考试

考试比较难,课程比较繁琐。把老师每节课留的课后题都做一些,考试基本就是这些东西

高性能计算2022 加粗样式 考试

1. 启动MPI程序时系统生成的是1维程序···

  1. 写出一个子程序或函数生成行和列通讯子

    思路:
    首先进行参数合法性的检查,然后将通信子对应的进程组进行划分,再将通信子对应的进程组进行列划分,最后将通信子中的进程编号使用MPI_Comm_rank进行分发

int getComm(int myid, int np, int p, int q, int myrow,int mycol, MPI_Comm *rowComm,MPI_Comm *colComm){
    if(np < p * q) return 1;
    int key, color;
    if(myid < p * q)
        col = myid / q;
    else
        color = MPI_UNDEEFINED
    key = myid;
    MPI_Comm_split(MPI_COMM_WORLD, color, key, rowComm);
    if(myid < p*q)
        color = myid % q;
    else
        col = MPI_UNDEEFINED;
    key = myid;
    MPI_Comm_split(MPI_COMM_WORLD, color,key,colComm);
    if(myid < p*q){
        MPI_Comm_rank(colComm, &myrow);
        MPI_Comm_rank(rowComm, &mycol);
    }
    return 0;
}
  1. 卷帘方式计算值

    使用卷帘存储方式,即对于一般的mn 矩阵和一般的处理器阵列pq,矩阵元素a i j a_{ij}a ij ​存放在处理器P k l P_{kl}P k l ​中,其中k=i mod p, l=j mod q。用一个8行8列的矩阵在3*2的处理器阵列进行处理,可知对于a i j = a s t k l a_{ij} = a^{kl}_{st}a ij ​=a s t k l ​有,k = i m o d p , l = j m o d q , s = i / p , t = j / q k=i\space{mod}\space p, l = j \space mod \space q,s = i/p, t = j/q k =i m o d p ,l =j m o d q ,s =i /p ,t =j /q

  2. 广播进程的实现

    思路:
    现在第0行的行进程中广播p 00 p_{00}p 00 ​上的数据A,此时整行都有该数据,然后再各个列通讯子中广播到整列

int broadcastRowCol(int myid, int np, int myrow, int mycol, float *a, int count, MPI_Comm rowComm,MPI_Comm colComm){
    if(myrow == 0)
        MPI_Bcast(a, count, MPI_FLOAT, 0, rowComm);
    MPI_Bcast(a, count, MPI_FLOAT, 0, colComm);
}

2. 分块矩阵

  1. 一次性发送和接收A 00 A_{00}A 00 ​和A 20 A_{20}A 20 ​

    思路: 使用MPI_Type_vector 函数构建一个vector 的类型,命名为submat,然后使其extent ,即延伸尺寸正好可以覆盖第一行和第二行矩阵块,然后我们如果使用两个submat 变量,第一个submat 变量传输的内容是A 00 A_{00}A 00 ​ ,但其延伸尺寸覆盖过了第一行其他矩阵块和第二行矩阵块,第二个submat 的起点正好是A 20 A_{20}A 20 ​ ,可以传输A 20 A_{20}A 20 ​ 矩阵块。


MPI_Datatype submat_base, submat;
MPI_Type_vector(m, m, n, MPI_FLOAT, &submat_base);
int array_of_blocklens[2] = {1,1};
int array_of_disps[2] = {0,2*m*n*sizeof(float)};
MPI_Datatype array_of_types[2] = {submat_base, MPI_UB};
MPI_Type_struct(2, array_of_blocklens, array_of_disps,                             array_of_types, &submat);
MPI_Type_commit(&submat);
  1. 只传输A 00 A_{00}A 00 ​和A 20 A_{20}A 20 ​

    思路:
    以直接利用MPI_Type_indexed 将所需的内容索引到数据类型里就行了。沿用第1 问中的假设条件,先进行赋值块大小和块间隔,然后更正第二个矩阵块的间隔,最后提交结果

MPI_Datatype submat;
int *array_of_blocklens = new int[2 * m];
int *array_of_disps = new int[2 * m];
for(int i=0; i<2*m; i++){
    array_of_blocklens[i] = m;
    array_of_disps[i] = i * n;
}
for(int i=m; i<2*m; i++)
    array_of_disps[i] = (i + 2 * m) * n;
MPI_Type_indexed(2*m, array_of_blocklens, array_of_disps,                           MPI_FLOAT, &submat);
MPI_Type_commit(&submat);

3. 自定义数据结构的分发

思路:
采用MPI_Type_struct 方法,将需要传输的内容整合成一个MPI 结构体进行传输。首先初始化进程环境,然后获取通信子的进程编号和进程个数,再使用MPI的进行自定义数据类型和打包

#include
#include
typedef struct{
    int m[3];
    float a[2];
    char c[5];
}dataType;
int main(int argc, char**argv)
{
    MPI_Init(&argc, &argv);
    int rank, size;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Datatype newType;
    int blocks[3] = {3, 2, 5};
    MPI_Aint disps[3] = {0, 12, 20};
    MPI_Datatype types[3] = {MPI_INT, MPI_FLOAT, MPI_CHAR};
    MPI_Type_struct(3, blocks, disps, types, &newType);
    MPI_Type_commit(&newType);
    dataType t1 = {{1, 2, 3}, {4.0, 5.0}, {'a', 'b', 'c', 'd', '\0'}};
    dataType t2;
    if (rank == 0)
        MPI_Send(&t1, 1, newType, 1, 0, MPI_COMM_WORLD);
    else{
        MPI_Recv(&t2, 1, newType, 0, 0, MPI_COMM_WORLD,
        MPI_STATUS_IGNORE);
        printf("%d %d %d %f %f %s\n", t2.m[0], t2.m[1], t2.m[2],                     t2.a[0], t2.a[1],
        t2.c);
    }
    MPI_Type_free(&newType);
    MPI_Finalize();
}

4. MPI_Allgather的实现

  1. 一个如何实现的详细并行方法

    思路:
    MPI_Alltoall 的功能是全交换,即各个进程都在向所有进程发送对应的分段,同时从所以进程接收发来的分段。这里给出一种简单的实现方式,即每个进程使用一个循环向其他进程发送分段,同时循环中接受其他进程发来的分段,而自己发给自己的部分直接使用memcpy 拷贝

  2. MPI_Allgather子程序的实现
int myAlltoall(const void *sendbuf, int sendcount,
               MPI_Datatype sendtype, void *recvbuf, int recvcount,                    MPI_Datatype recvtype, MPI_Comm comm)
{
    int rank, size;
    int type_size;
    MPI_Type_size(sendtype, &type_size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    for (int i = 0; i < size; ++i){
    if (i == rank){
        memcpy(sendbuf + i * sendcount * type_size, recvbuf +
               i * recvcount *type_size, sendcount * type_size);
        continue;
    }
    MPI_Send(sendbuf + i * sendcount * type_size, sendcount,
             sendtype, i, 0, MPI_COMM_WORLD);
    MPI_Recv(recvbuf + i * recvcount * type_size,
             recvcount, recvtype, i, 0,
    MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    }
    return 0;
}

Original: https://blog.csdn.net/qq_43840665/article/details/128749341
Author: 逆羽飘扬
Title: 国科大-高性能计算考试

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/814363/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Flask Web框架( 一 )

    1.Flask简介 flask是一款非常流行的python Web框架,它出生于2010年,作者是Armin Ronacher。说出来比较让人惊讶,本来这个项目只是作者在愚人节的一…

    Python 2023年8月12日
    062
  • python—全文上下查找

    python—全文上下查找 原创 夕陌2022-07-19 11:24:15©著作权 文章标签 html 导包 参数说明 文章分类 Python 后端开发 ©著作权归作…

    Python 2023年5月25日
    067
  • 目标检测,使用最新的yolov7训练自己的数据集,从零开始的手把手教程

    目录 一、获取大佬的yolov7源码 二、配置深度学习环境 三、准备数据集 四、用yolo v7训练自己的数据集 五、用训练好的模型测试 六、用训练好的模型预测 一、获取大佬的yo…

    Python 2023年10月9日
    074
  • git的介绍和使用

    git介绍 什么是git git是一种版本控制器 – 控制的对象是开发的项目代码 什么是版本控制器 &#x5B8C;&#x6210; &#x53…

    Python 2023年10月31日
    064
  • Java安全之CC3

    前言 上一篇文章学习了Java中加载字节码的⼀些⽅法,其中介绍了 TemplatesImpl,TemplatesImpl 是⼀个可以加载字节码的类,通过调⽤其 newTransfo…

    Python 2023年10月15日
    064
  • size mismatch问题:训练权重不匹配问题

    在测试二阶段和三阶段模型的时候程序一直报错: RuntimeError: Error(s) in loading state_dict for Eff:size mismatch …

    Python 2023年8月2日
    0260
  • 利用Kafka的Assign模式实现超大群组(10万+)消息推送

    引言 IM即时通信场景下,最重要的一个能力就是推送:在线的直接通过长连接网关服务转发,离线的通过APNS或者极光等系统进行推送。 本文主要是针对在线用户推送场景来进行总结和探讨:如…

    Python 2023年10月21日
    048
  • 【强化学习PPO算法】

    强化学习PPO算法 一、PPO算法 二、伪代码 三、相关的简单理论 * 1.ratio 2.裁断 3.Advantage的计算 4.loss的计算 四、算法实现 五、效果 六、感悟…

    Python 2023年8月1日
    058
  • pandas中dropna函数_Pandas简易入门(二)

    目录: 处理缺失数据 制作透视图 删除含空数据的行和列 多行索引 使用apply函数 本节要处理的数据来自于泰坦尼克号的生存者名单,它的数据如下 pclass,survived,n…

    Python 2023年8月8日
    051
  • Installing MySQL-5.7.35 on CentOS 7.9

    一、Installation MySQL-5.7.35 on CentOS 7.9 1 下载地址 https://downloads.mysql.com/archives/comm…

    Python 2023年10月19日
    051
  • 莫烦pytorch学习笔记(一)

    莫烦pytorch学习笔记(一) 本笔记主要为了记录学习内容,方便日后回顾,如果有错误之处欢迎评论区指正! numpy与torch对比 numpy中处理的数据类型是矩阵(多维列表)…

    Python 2023年8月27日
    052
  • 网络爬虫是什么?怎么学python爬虫

    网络爬虫又称网络蜘蛛、网络机器人,它是一种按照一定的规则自动浏览、检索网页信息的程序或者脚本。网络爬虫能够自动请求网页,并将所需要的数据抓取下来。通过对抓取的数据进行处理,从而提取…

    Python 2023年8月1日
    044
  • linux系统中利用QT实现语音识别项目的操作方法

    大家好,今天主要和大家分享一下,如何使用linux系统上的语音识别项目的操作方法与实现。 目录 第一:语音识别基本简介 第二:语音识别产品申请账号 第三:具体代码实现 第一:语音识…

    Python 2023年11月9日
    044
  • GGCNN笔记

    先上总结: 需要RGB图片 进行标注 r.png ——main_label.py—–> Label.txt —&#…

    Python 2023年8月24日
    062
  • drf 过滤、排序、分页、异常处理

    内容概要 过滤 排序 分页 异常处理 内容详细 过滤 过滤是 涉及到查询数据的接口才需要过滤功能 DRF 中使用的过滤方式: 1、 内置过滤类 在请求数据中用”sear…

    Python 2023年5月24日
    085
  • Python三目运算符(三元运算符)用法详解(含Python代码)

    一、前言 三目运算符,又称条件运算符,是计算机语言(c,c++,java等)的重要组成部分。它是唯一有3个操作数的运算符,有时又称为三元运算符。 定义: 对于条件表达式 b ? x…

    Python 2023年8月1日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球