SHU机组

计算机组成原理与结构体系

理论学习

b站王道机组课程

实验一二三(实验箱)

实验四(虚拟机)

前期准备

  • 看一遍老师给的教程。(虽然它是一份老掉牙的教程,但是你首先得知道自己要干什么,然后才好跟上大家吐槽的脚步。建议先全部看一遍,而且最后的问题汇总其实更应该放到教程开头才对)

  • 最好提前了解一点Linux操作系统的相关知识,不是很清楚也没关系,按照步骤把实验做一遍下来大概也就差不多了。

  • 这里是一些可能需要提前在自己电脑上安装好的东西,可能会用到的链接和教程都放在这里了,需要的请自取。

VM虚拟机下载及安装教程

Vmware官方

centos6.5下载(版本一致很重要!版本一致很重要!版本一致很重要!)


重要的事说三遍,这里说的一致是和老师给的教程里使用的版本一致,因为有的同学安装的是centos7或8甚至是Ubuntu(不同版本操作命令可能不同,安装过程也可能不会完全相同),如果你不想花费大量时间在打开CSDN上的话,建议还是装这个CentOS-6.5-x86_64-LiveCD。而且这个下载起来也快,只有600多M。之后再按照教程走就会轻松很多,直到你碰上你的第一个问题,最起码你可以不那么困难地迈出第一步。


下面是几篇避坑的博客,偷懒最好的办法是一遍就把事情做好,所以为了省时间还是值得一看的,当然你也可以等遇到问题再来查

精通 VIM ,此文就够了(linux的编辑器,和你以前使用过的编辑器可能完全不一样,做好心理准备)

虚拟机:三台虚拟机互通且连网(要是早点看到这篇我就不用花那么多时间找其他博客了,感谢原博主帮我找到了我的问题)

CentOS7虚拟机克隆,且成功互ping(仅供参考)

最后还是不得不吐槽一下老师给的参考教程版本实在是太老了,虽然我在这个很痛苦的过程中也学到了不少东西,但也带来了很多不必要的困扰,就拿centos6.5这个版本举例,现在都0202年了,官网上有的是centos7和8,那找起6.5来就是一个重复做功的过程,而教程后的链接也是失效的,简直是浪费感情。

剩下的其实就只要按照老师给的教程来就行了,直到虚拟机之间互通这里,我碰到最麻烦的问题也还是版本的问题,吐槽最多的地方也还是教程太老以及不够仔细。


问题总结

下面是我在实验过程中遇到过的一些问题,仅供参考。

首先还是回到老师给的教程上里面,如果你看的足够仔细就会发现有个地方很奇怪,那就是在修改复制的(或者说克隆)虚拟机ip这里,原来教程这里写的是

修改ip:
vim /etc/sysconfig/network-scripts/ifconfig-eth0
将IPADDR=后的ip改为192.168.224.201

但是在创建第一台虚拟机配置centos网络时是这样的

配置centos网络:
vim /etc/sysconfig/network-scripts/ifcfg-eth0
修改(或者说是输入)
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
BROADCAST=192.168.224.225 
IPADDR=192.168.224.130 
NETMASK=255.255.255.0
NETWORK=192.168.224.0 
GATEWAY=192.168.224.2 

同样是改IPADDR,为什么两个文件名不一样呢?(ifconfig-eth0和ifcfg-eth0)

这里要么是版本的问题,要么就是一个笔误,造成的后果可能就是你三台虚拟机都能ping master而不能实现真正的互通(会显示Unreachable)。

因为如果你细心的话就会发现当你在复制的虚拟机上打开ifconfig-eth0时,其实是新建了一个名为ifconfig-eth0的文件,而不是打开了复制过来的ifcfg-eth0文件。(可以自己验证一下)这里只需要注意一下即可。

我遇到的最坑的问题还是下面这个

直接复制文件导致两台虚拟机Mac相同,即物理地址和备份的虚拟机重复

我是按照教程在windows中文件中直接将一个虚拟机进行复制了两份(克隆好像就没有问题),然后用vm打开, 选择我已经复制,结果虚拟机开机的时候出现了上面的日志消息提示,导致了我无法ping 通。解决方法如下(改不了的话先关闭一下虚拟机):

如何更改Mac地址


ssh无密码验证原理:

节点A要实现无密码公钥认证连接到节点B上时,节点A是客户端,节点B是服务端,需要在客户端A上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到服务端B上。当客户端A通过ssh连接服务端B时,服务端B就会生成一个随机数并用客户端A的公钥对随机数进行加密,并发送给客户端A。客户端A收到加密数之后再用私钥进行解密,并将解密数回传给B,B确认解密数无误之后就允许A进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。重要过程是将客户端A公钥复制到B上。

第一步就出错了

教程里第一步启用shh服务找不到文件,可能是版本不一样所以命令不一样了,不过很神奇的是我在第一台虚拟机上能够使用这条命令,但是复制的那两台上无法成功运行。所以我直接参考了CentOS6.5下安装、配置SSH(最后是使用putty需要自行安装),只要确认shh正常启用就行。以下是我成功运行的一些命令

1.登录CentOS 6.5系统,使用root用户登录,如果为非root用户则执行 su 或 su - 或 su root 或 su - root 输入root密码切换为root用户。

2.查看SSH是否安装(检查是否装了SSH包)。
输入命令:rpm -qa | grep ssh 或者(rpm -qa | grep openssh)

3.查看SSH服务是否正在运行。
输入命令:/etc/init.d/sshd status 或者(service sshd status)

4.若CentOS 6.5系统中SSH服务处于非运行状态则使用(service sshd start)命令开启SSH服务;停止SSH服务命令(service sshd stop);重启SSH服务命令(service sshd restart)。为了演示效果,我这里先停止SSH服务,然后启动SSH服务,再接着重启SSH服务。[service sshd stop] -> [/etc/init.d/sshd status] -> [service sshd start]-> [service sshd restart] -> [/etc/init.d/sshd status]

[重启后可输入:netstat -antp | grep sshd 查看是否启动22端口]

5.检查sshd是否在本运行级别下设置为开机启动
输入命令:chkconfig –list sshd
CentOS 6.5系统中SSH服在本运行级别下已经设置为开机启动,如果没设置启动就使用如下命令[chkconfig –level 2345 sshd on]设置下即可。(每个级别需要分别开启)

【常见的远程SSH登录工具有:securecrt、xshell、putty等..】

使用Xshell远程访问虚拟机

先来看看按照老师给的教程能不能幸运地完成实验吧。

![很不幸,不能](https://gitee.com/henry-avery/my_pic_bed/raw/master/psc (1).png)

最后一条重启命令一看就知道应该是又把service写错成servive了。

![正常重启](https://gitee.com/henry-avery/my_pic_bed/raw/master/psc (2).png)

之后就是一路采坑,最后也不知道自己怎么搞定的,看了很多博客但好像最后都没怎么用上。

而且这里具体问题还需要具体解决,可以在这篇博客的评论区把遇到的问题发出来,让大家帮忙看看。

scp连接远程传输报错The authenticity of host …… can‘t be established.

解决linux配置ssh免密登录遇到的异常:-bash: cd: /root/.ssh: Not a directory

No such file:可能要先进入子目录(cd .ssh),然后在使用scp命令,否则找不到你要传输的文件


使用ssh实现windows主机与linxu虚拟机文件互传

这一步网上教程很多,但是可能还是不能完全符合我们的需求。

首先在主机上安装SSH Secure Shell,这个软件的下载地址是:http://ccm.net/download/download-1423-ssh-secure-shell-windows,如果打不开,请自行百度解决。

在实现互传文件之前先要令主机和虚拟机ping通,所以在这里先直接测试能不能ping通,别急着关防火墙和调整网络设置,如果之前的操作正确的话是可以直接跳过前两步的。

在cmd中输入ipconfig查看本机ip,在terminal中输入ifconfig查看虚拟机ip

虚拟机和主机相互ping不通方法总结

为了使用虚拟机而关闭防火墙这种因小失大的做法是不大可取的,其实设置防火墙很简单,以win7为例,打开控制面板 > 系统和安全 > windows防火墙 >高级设置 >入站规则 > 文件和打印机共享(回显请求 - ICMPv4-In) (专用,公用) > 右键启用 即可

注意事项:直接打开SSH Secure File Transfer输入Hostname和Username然后输入密码。

注意用户名这里不是master和slave1或2,而是你登录虚拟机时的用户名,比如我三台虚拟机用户名都是centos,否则用户名和密码不匹配会一直让你输入密码。

小波男神镇贴


RSH互通

摆脱教程之后说不定还更简单了,而且碰巧找到了一篇可能是前两届某位学长写的博客,补充了没有的rsh部分,有兴趣可以看看,反正我是不想再多看了一眼了。

centos6.5 配置ssh与rsh


连接外网

下面摘抄了关于网络配置模式的介绍,可以详细了解下,可以对配置更加清晰;

桥接 通过使用物理机网卡 具有单独ip
NAT 把物理机为路由器进行上网

下面是详细的解说:

VMWare提供了三种工作模式,它们是bridged(bridged模式)、NAT(网络地址转换模式)和host-only(主机模式)。要想在网络管理和维护中合理应用它们,了解一下这三种工作模式。

1.bridged(桥接模式)

在bridged模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器。在bridged模式下,需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信。同时,由于这个虚拟系统是局域网中的一个独立的主机系统,那么就可以手工配置它的TCP/IP配置信息,以实现通过局域网的网关或路由器访问互联网。使用bridged模式的虚拟系统和宿主机器的关系,就像连接在同一个Hub上的两台电脑。想让它们相互通讯,就需要为虚拟系统配置IP地址和子网掩码,否则就无法通信。如果想利用VMWare在局域网内新建一个虚拟服务器,为局域网用户提供网络服务,就应该选择bridged模式。
这种方式最简单,直接将虚拟网卡桥接到一个物理网卡上面,和linux下一个网卡 绑定两个不同地址类似,实际上是将网卡设置为混杂模式,从而达到侦听多个IP的能力。在此种模式下,虚拟机内部的网卡(例如linux下的eth0)直接连到了物理网卡所在的网络上,可以想象为虚拟机和host机处于对等的地位,在网络关系上是平等的,没有谁在谁后面的问题。
使用这种方式很简单,前提是可以得到1个以上的地址。

2.NAT(网络地址转换模式)

使用NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。也就是说,使用NAT模式可以实现在虚拟系统里访问互联网。NAT模式下的虚拟系统的TCP/IP配置信息是由VMnet8(NAT)虚拟网络的DHCP服务器提供的,无法进行手工修改,因此虚拟系统也就无法和本局域网中的其他真实主机进行通讯。采用NAT模式最大的优势是虚拟系统接入互联网非常简单,你不需要进行任何其他的配置,只需要宿主机器能访问互联网即可。
这种方式也可以实现Host OS与Guest OS的双向访问。但网络内其他机器不能访问Guest OS,Guest OS可通过Host OS用NAT协议访问网络内其他机器。NAT方式的IP地址配置方法是由VMware的虚拟DHCP服务器中分配一个IP ,在这个IP地址中已经设置好路由,就是指向192.168.138.1的。

如果想利用VMWare安装一个新的虚拟系统,在虚拟系统中不用进行任何手工配置就能直接访问互联网,建议你采用NAT模式。这种方式下host内部出现了一个虚拟的网卡vmnet8(默认情况下),如果有过 做nat服务器的经验,这里的vmnet8就相当于连接到内网的网卡,而虚拟机本身则相当于运 行在内网上的机器,虚拟机内的网卡(eth0)则独立于vmnet8。发现在这种方式下,vmware自带的dhcp会默认地加载到vmnet8界面上,这样虚拟机就可以使用dhcp服务。更为重要的是,vmware自带了nat服务,提供了从vmnet8到外网的地址转换,所以这种情况是一个实实在在的nat服务器在运行,只不过是供虚拟机用的。


AI科普:NVIDIA自动避障小车Jetbot &口罩识别

讲师:侯宇涛,英伟达公司GPU/CUDA应用市场总监。何琨,英伟达开发者社区高级培训师。

上机实验口罩识别就只是使用一下他们写的代码,挺无聊的。


实验五OpenMP

OpenMP入门实例与分析

实验目的

1) 在Linux平台上编译和运行OpenMP程序;

2) 在Windows平台上编译和运行OpenMP程序。

3) 掌握OpenMP并行编程基础。

实验环境

1) 硬件环境:计算机一台;

2) 软件环境:Linux、Win2003、GCC、MPICH、VS2008或其他版本Visual Studio;

实验内容

Linux下OpenMP程序的编译和运行。OpenMP是一个共享存储并行系统上的应用编程接口,支持C/C++和FORTRAN等语言,编译和运行简单的”Hello World”程序。在Linux下编辑hellomp.c源程序,或在Windows下编辑并通过附件中的FTP工具(端口号:1021)上传,用”gcc -fopenmp -O2 -o hellomp.out hellomp.c”命令编译,用”./hellomp.out”命令运行程序。

注:在虚拟机中当使用vi编辑文件时,不是以ESC键退出插入模式,可以使用“Ctrl+c”进入命令模式,然后输入wq进行存盘退出。

Linux下OpenMP环境,需要安装gcc(此处注意避坑,6.5版本太老需换源,可参考以下链接提供方法)

yum intall gcc    (在redhat, centOS 下使用,用root安装,必须保证网络畅通)

centos 6.5 yum安装报YumRepo Error: All mirror URLs are not using ftp, http[s] or file

Linux中安装gcc出现All mirror URLs are not using ftp,http[s] or file

修改镜像配置:vim /etc/yum.repos.d/CentOS-Base.repo

将配置文件中的#mirrorlist注释掉,取消注销baseurl的行,将$releasever改成你的centos的版本号,可用cat /etc/redhat-release查看

如果能够正常安装好编译器就没有什么问题了,写好代码放在不同地方跑而已。

测试代码如下:

#include 
#include 
int main()
{
int nthreads,tid;
omp_set_num_threads(8);
#pragma omp parallel private(nthreads,tid)
{
tid=omp_get_thread_num();
printf("Hello World from OMP thread %d\n",tid);
if(tid==0)
{
nthreads=omp_get_num_threads();
printf("Number of threads is %d\n",nthreads);
}
}
}

先从本地传到虚拟机上去,编译然后运行正常就OK了。

实验报告

实验目的

1) 在Linux平台上编译和运行OpenMP程序;

2) 在Windows平台上编译和运行OpenMP程序。

3) 掌握OpenMP并行编程基础。

实验环境

1) 硬件环境:计算机一台;

2) 软件环境:Linux(centOS6.5)、Win10、GCC、G++、VS2019

问题描述

对于一个大向量(所有元素全部大于 0), 把它的前半部分全部平方,后半部分全部开方取整。

将所得的新向量中的奇数个数输出。

vector v_i{}//初始给定大小的大向量(从1e100~1e10000)
vector v_ans{};//新生成的向量,大小与向量v_i相同
clock_t s, f;//记录时间
double duration;//计算时间长度

实验过程

数据量变动,大于cache

L1缓存256KB,L2缓存1.0MB,L3缓存6.0MB

纸质打印

实验结果

s :0.372000
- size of v_ans:        2522907
p :1.378000
- size of v_ans:        2522907

代码附录

/*核心代码示例*/    
s = clock();//计时开始
#pragma omp parallel for reduction(+:cnt_ans) default(shared)  num_threads(10)
//openmp并行计算,开启十个线程
    for (int i = 0; i < len; i++)
    {
        auto& e = v_i[i];
        int t = 0;

        if (i < len / 2)
        {
            t = pow(e, 2);
        }
        else
        {
            t = (int)sqrt(e);
        }
        if (t % 2 == 1)
        {
            cnt_ans += 1;//计数器,计算新向量奇数个数
        }
    }
    f = clock();//计时结束
    duration = (double)(f - s) / CLOCKS_PER_SEC;//计算计时时间
    printf("s :%f\n", duration);//输出并行计算计时时间

参考资料

linux 上查询cache 大小的方法

并行程序耗时过大问题

实验六HPL安装和测试

Linpack背景及内容

HPL与HPCG测试 (一)

(1)背景介绍

LINPACK全名Linear Equations Package,是近年来较为常用的一种计算机系统性能测试的线性方程程序包,内容包括求解稠密矩阵运算,带状的线性方程,求解最小平方问题以及其它各种矩阵运算。它最早由来自Tennessee 大学的超级计算专家Jack Dongarra提出。程序用FORTRAN编写,在此基础上还有C,JAVA等版本。Linpack使用线性代数方程组,利用选主元高斯消去法在分布式内存计算机上按双精度(64 bits)算法,测量求解稠密线性方程组所需的时间。Linpack的结果按每秒浮点运算次数(flops)表示。第一个Linpack测试报告出现在1979年的Linpack用户手册上,最初LINPACK包并不是要制订一个测试计算机性能的统一标准,而是提供了一些很常用的计算方法的实现程序,但是由于这一程序包被广泛使用,就为通过Linpack 例程来比较不同计算机的性能提供了可能,从而发展出一套完整的Linpack 测试标准。

(2)测试标准的内容

LINPACK标准可以解决的问题有:

1) 各种矩阵分解(Matrix factorization),如LU分解,Cholesky分解, Schur,Gauss分解,SVD分解,QR分解,generalized Schur分解等

2) 矢量运算(Vector operation),如Copy,Add,scalar multiple,Interchange

3) 存储模式(Storage Modes),如full,banded,symmetric

Linpack原始版本的问题规模为100×100的矩阵,目前的Linpack测试分成三个层次的问题规模和优化选择:

—- 100×100的矩阵

在该测试中,不允许对Linpack测试程序进行任何修改,哪怕是注释行。 所有的优化工作只能在编译器里完成。


—- 1000×1000的矩阵

该测试也叫“面向峰值性能的测试”,在该测试中,要求有所放宽,允许对算法和软件进行修改或替换,并尽量利用系统的硬件特点,以达到尽可能高的性能。但是所有的优化都必须保持和标准算法如高斯消去法相同的相对精度,而且必须使用Linpack的主程序进行调用。测试者可修改或替换其中的过程调用例程DGEFA 和DGESL 。其中DGEFA 是Linpack 软件包中标准的高斯消去LU 分解过程,而DGESL 是根据分解后得到的结果回代求解过程。


—- 针对大规模并行计算系统的测试,即Highly Parallel Computing。

在这一测试中,问题规模限制被取消,针对现代的并行计算机,要求最宽松,即用户可对任意大小的问题规模,使用任意个数的CPU ,使用各种优化方法(必须基于高斯消去法)来执行该测试程序,寻求最佳的测试结果。

目前,用Linpack基准测试出的最高性能指标已经成为衡量机器性能的标准之一,这个数字可以作为对系统峰值性能的一个修正。

HPL基准测试

(1)概述

HPL,即High Performance Linpack,目前已经成为国际标准的Linpack基准测试程序,其1.0版于2000年9月发布,是第一个标准的公开版本并行Linpack测试软件包,一般用于全世界TOP500超级计算机上的并行超级计算机排名。HPL测试标准的用户自由度要大很多,使用者可以选择矩阵的规模,分块大小,分解方法等等一系列的各种参数,都是按需要更改的。

HPL软件包需要在配备了MPI环境下的系统中才能运行,还需要底层有线性代数子程序包BLAS的支持(或者有另一种向量信号图像处理库VSIPL也可)。

HPL软件包不仅提供了完整的Linpack测试程序,还进行了全面细致的计时工作,最后可以得到求解的精确性和计算所花费的总时间。该软件在系统上所能达到的最佳性能值适合很多因素有关的。

(2)主算法

该软件包是用来求一个N维的线性方程组A x = b的解,首先通过选局部列主元的方法对Nⅹ(N+1)的[A b]系数矩阵进行LU分解成如下形式:

[A b]=[[L,U] y]

由于下三角矩阵L因子所作的变换在分解的过程中也逐步应用到b上,所以最后方程组的解x就可以由转化为求解上三角矩阵U作为系数矩阵的线性方程组 U x = y从而得到。

为了保证良好的负载平衡和算法的可扩展性,数据是以循环块的方式分布到一个P x Q的由所有进程组成的2维网格中。N x (N+1)的系数矩阵首先在逻辑上被分成一个个Nb x Nb大小的数据块,然后循环的分配到P x Q进程网格上去处理。这个分配的工作在矩阵的行、列两个方向同时进行。

在前面所提到的N,Nb,P,Q都是可以根据集群的具体配置和用户需要而随时修改的,也是HPL测试中十分关键和重要的几个参数。详细内容请看后面。

HPL的安装及使用

主要软件包:

hpl-2.1.tar.gz

GotoBLAS2-1.13.tar.gz

openmpi-1.6.5.tar.gz

HPL的安装过程

(1)安装gotoblas

注:出于提高性能的因数,选择GOTO BLAS,作为HPL调用的底层线性代数子程序包

目前最新版本为GotoBLAS2

下载GotoBLAS2-1.13.tar.gz

(网址https://www.tacc.utexas.edu/tacc-projects/gotoblas2)

这个网址not found,直接在学习通下载

执行步骤:

需要在虚拟机上进行,先把文件传到虚拟机上

在usr/local/mathlib/goto下解压:(随便什么位置应该都可以,我全部放在桌面了)

$ tar -zxvf GotoBLAS2-1.13.tar.gz

$ cd GotoBLAS2

$ make (TARGET=NEHALEM)

注:可直接输入#make既可 也可自己选择参数 类似

$ make CC=gcc BINARY=64 TARGET=NEHALEM

(新的intel都要有后面这个参数)

依次是编译器 库的位数和cpu的类型(architecture),具体可选择的参数可从GotoBLAS2的目录下02QuickInstall.txt的查找

(3)安装openmpi

安装tar压缩的安装包

tar -zxvf **.tar.gz

tar -jxvf **.tar.bz(或bz2)
1、用CD命令进入解压缩后的目录
2、输入编译文件命令:./configure(有的压缩包已经编译过,这一步可以省去)
3、然后是命令:make
4、再是安装文件命令:make install
5、安装完毕
————————————————
make好久之后

(4)安装HPL

又是文件名的问题,自己打开文件夹确认

(5)编译

貌似成功编译了

任务说明,mpicc写错了

快速成功

运行

没配置好结点,把结点名设置一下试试

改好结点还是遇到错误

Linux中error while loading shared libraries错误解决办法

原因:默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,通常通过源码包进行安装时,如果不指定–prefix,会将库安装在/usr/local/lib目录下;当运行程序需要链接动态库时,提示找不到相关的.so库,会报错。也就是说,/usr/local/lib目录不在系统默认的库搜索目录中,需要将目录加进去。

也可能是由于我安装位置的问题,安装共享库后要注意共享库路径设置问题,解决方法如下,第二部排错后成功

【linux排错】”error while loading shared libraries: xxx.so.x” 错误的原因和解决办法

大概用了一个多小时搞定

然后就是慢慢调参写报告了。

使用gcc编译器的情况下测试,当进程数为4时,测试结果如下表:

N NB P Q Time Gflops
1960 60 2 2 0.83 6.079
1960 80 2 2 0.84 6.015
2048 60 2 2 0.91 6.319
2048 80 2 2 0.93 6.165
1960 60 4 1 1.28 3.940
1960 80 4 1 1.27 3.949
2048 60 4 1 1.40 4.105
2048 80 4 1 1.37 4.176

复习笔记

历年卷

填空

参考资料

实验报告


   转载规则


《SHU机组》 Henry-Avery 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录