国科大-高性能计算考试

news/2024/11/20 1:47:19/

考试比较难,课程比较繁琐.

高性能计算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;elsecolor = MPI_UNDEEFINEDkey = myid;MPI_Comm_split(MPI_COMM_WORLD, color, key, rowComm);if(myid < p*q)color = myid % q;elsecol = 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;
    }
    
  2. 卷帘方式计算值

    使用卷帘存储方式,即对于一般的m*n 矩阵和一般的处理器阵列p*q,矩阵元素aija_{ij}aij存放在处理器PklP_{kl}Pkl中,其中k=i mod p, l=j mod q。用一个8行8列的矩阵在3*2的处理器阵列进行处理,可知对于aij=astkla_{ij} = a^{kl}_{st}aij=astkl有,k=imodp,l=jmodq,s=i/p,t=j/qk=i\space{mod}\space p, l = j \space mod \space q,s = i/p, t = j/qk=i mod p,l=j mod q,s=i/p,t=j/q

  3. 广播进程的实现

    思路:
    现在第0行的行进程中广播p00p_{00}p00上的数据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. 一次性发送和接收A00A_{00}A00A20A_{20}A20

    思路:

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

    /*
    假设整个矩阵式n*n大小,矩阵按行优先存储,数据类型以float为例子
    */
    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);
    
  2. 只传输A00A_{00}A00A20A_{20}A20

    思路:
    以直接利用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 <stdio.h>
#include <mpi.h>
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;
    }
    

http://www.ppmy.cn/news/18805.html

相关文章

grant之后要跟着flush privileges吗?

在 MySQL 里面,grant 语句是用来给用户赋权的。不知道你有没有见过一些操作文档里面提到,grant 之后要马上跟着执行一个 flush privileges 命令,才能使赋权语句生效。我最开始使用 MySQL 的时候,就是照着一个操作文档的说明按照这个顺序操作的。 那么,grant 之后真的需要…

Android蓝牙开发

前言 这是我大二做的一个智能小车配套使用的APP&#xff0c;用Android的蓝牙接口实现&#xff0c;当时有些os相关的内容Thread之类还有一些Android接口、java语法&#xff0c;我其实不是很理解。学了操作系统&#xff0c;再来回顾一下&#xff0c;并整理项目代码&#xff0c;项…

第四十四章 动态规划——背包问题模型(一)

第四十四章 动态规划——背包问题模型&#xff08;一&#xff09;一、模型概述二、模型变形1、AcWing 423. 采药&#xff08;1&#xff09;问题&#xff08;2&#xff09;分析&#xff08;3&#xff09;代码2、AcWing 1024. 装箱问题&#xff08;1&#xff09;问题&#xff08;…

[LeetCode周赛复盘] 第 329 场周赛20230122

[LeetCode周赛复盘] 第 329 场周赛20230122 一、本周周赛总结二、 [Easy] 6296. 交替数字和1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6297. 根据第 K 场考试的分数排序1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6298. 执行逐位运算使字符串相等1. 题目描述2. 思路…

Adfind域中信息查询工具

下载地址&#xff1a;https://www.softpedia.com/get/Programming/Other-Programming-Files/AdFind.shtml Adfind.exe [switches] [-b basedn] [-f filter] [attr list] -b:指定一个BaseDN作为查询的根 -f:为LDAP过滤条件 attr list&#xff1a;为需要显示的属性查询域中机器 …

字符串截取(汉字,字母,数字在浏览器所占像素不同,保证截取的字符串所占像素一致)

//拆分字符串public function split(){$str 哈哈哈hu1 23456户经回来456ruy;//标准长度$withmark 200;//分段&#xff0c;转换成数组&#xff0c;然后变成凑满数据$strlen strlen($str);$strmark array();for ($i0;$i<$strlen;$i){if(mb_substr($str,$i,1)){$strmark[$i]…

【深度学习】详解 SimCLR

目录 摘要 一、引言 二、方法 2.1 The Contrastive Learning Framework 2.2. Training with Large Batch Size 2.3. Evaluation Protocol 三、用于对比表示学习的数据增广 3.1 Composition of data augmentation operations is crucial for learning good representa…

过滤器Filter总结

过滤器Filter1. 简介2. 快速入门3. 执行流程4. 使用细节4.1 拦截路径4.2 过滤器链5. 案例5.1 需求5.2 LoginFilter1. 简介 过滤器是JavaWeb三大组件之一&#xff08;Servlet、Filter&#xff0c;Listner&#xff09;&#xff1b; 作用&#xff1a; 把对资源&#xff08;servl…