国科大-高性能计算编程-作业六
作业题目
提交内容一:编译运行代码、执行算例、统计运行时间并绘制加速比曲线GhostExchange3D_ArrayAssign
创建并进入build文件夹,执行cmake ..及make来编译可执行文件
运行算例一mpirun -np 1 ./GhostExchange -x 1 -y 1 -z 1
运行算例二mpirun -np 4 ./GhostExchange -x 1 -y 2 -z 2
运行算例三mpirun -np 8 ./GhostExchange -x 2 -y 2 -z 2
数据统计
thread_num
stencil
boundary condition
ghost cell
total
1
5.431515
0.790956
0.047246
6.325972
4
0.890351
0.142488
0.553822
1.605789
8
0.533962
0.075818
0.599633
1.219806
CartExchange3D_Neighbor
创建并进入build文件夹,执行cmake ..及ma ...
国科大-高性能计算编程-作业五
作业题目
提交内容一:CUDA线程布局和内存层次线程布局在CUDA中,线程的布局从小到大总共有三个层次,分别为线程、线程块、网格
线程(Thread):
线程是CUDA程序的最小执行单元
每个线程可以独立执行代码,并拥有自己的寄存器(局部内存)
线程块(Block):
线程块是一定数量的线程的集合,它们可以共享一块共享内存
每个线程块内的线程可以通过同步原语进行协调
网格(Grid):
网格是线程块的集合
一个CUDA内核可以启动多个线程块,所有这些块构成一个网格
网格可以是一维、二维或三维的结构
内存层次CUDA在内存管理方面也存在很多个层次
寄存器(Registers):
每个线程拥有自己的寄存器,这是最快的存储形式
用于存储局部变量和临时计算结果
共享内存(Shared Memory):
由同一线程块内的所有线程共享
访问速度比全局内存快很多,但容量有限
适用于频繁访问的数据,可以显著提高性能
全局内存(Global Memory):
所有线程都可以访问的内存区域
访问速度较慢,但容量较大
通常用于存储从CPU传输的数据或大规模数据集
常量内存 ...
国科大-高性能计算编程-作业四
作业题目
提交内容一解释SplitStencil_opt1.c程序功能SplitStencil_opt1.c程序使用多线程来执行一个分割式计算模板(Stencil)的优化算法,主要用于数值模拟中的数组数据处理。程序通过OpenMP实现并行化,加速数组的初始化、数据清洗(flushing),以及模板计算。
程序流程
初始化:使用多线程初始化一个二维数组,设置特定区域的初始值。
清洗数据:对一个辅助数组进行循环的数据清洗操作。
模板计算:执行核心的模板计算,涉及到数组的读取和更新。
性能监控:记录并输出程序的初始化、清洗和模板计算的时间。
主要函数说明
main():程序入口,负责数组的分配、并行区域的定义和执行,以及性能统计。
SplitStencil():核心的模板计算函数,处理数组的更新。
malloc2D():辅助函数,用于分配二维数组的空间。
cpu_timer_start() 和 cpu_timer_stop():计时函数,用于监控各部分的执行时间。
程序注释#include <stdio.h>
#include <stdlib.h>
#in ...
国科大-高性能计算编程-作业三
作业题目
提交内容一:改写代码原代码编译运行结果
使用avx进行向量化
编译运行结果
代码详情
bool Convolve1D_Ks5_F64_cpp_AVX(double *__restrict__ y, const double * __restrict__ x, const double* __restrict__ kernel, int64_t num_pts) {
constexpr int64_t kernel_size = 5;
constexpr int64_t ks2 = kernel_size / 2;
if (num_pts < kernel_size) {
return false;
}
for (int64_t i = ks2; i < num_pts - ks2; i += 4) {
__m256d k2 = _mm256_set1_pd(kernel[ks2 - 2 ...
国科大-高性能计算编程-作业二
作业题目
提交内容一:平台信息
本次作业在Windows平台上进行了内容实现,具体平台信息如下
Windows平台
系统:Win11-23H2
CPU:i9-13900HX(x86)
内存:64G
IDE:CLion
编译器:MinGW
提交内容二:原代码、SoA及各优化方式的运行结果原代码的运行结果
SoA方式的运行结果
SoA方式下使用内存对齐进行优化的运行结果
SoA方式下使用循环展开进行优化的运行结果
数据统计
muladd,timing
sum
timing
AoS
731870us
4582696570
59257us
SoA
261313us
4582696570
17589us
SoA_Align
307924us
4582696570
17527us
SoA_Unrolling
263744us
4582696570
17353us
提交内容三:分析各个版本的代码
在windows中,无法使用perf进行代码的性能分析,因此我采用very sleepy对各个版本的代码进行分析
为了使效果更加明显,我将各个版本的代码以函数的形 ...
国科大-高性能计算编程-作业一
作业题目
提交内容一:平台信息
本次作业在Windows平台及MacOs平台上均测试了homework1.cpp的运行,具体平台信息如下
Windows平台
系统:Win11-23H2
CPU:i9-13900HX(x86)
内存:64G
IDE:CLion
编译器:MinGW
MacOs平台
系统:MacOs-14.3
CPU:M2(arm)
内存:16G
IDE:CLion
编译器:Clang
提交内容二:代码运行时间
本次作业分别在两个平台上使用-O0 -O1 -O2 -O3编译homework1.cpp,并记录四种优化条件下代码的运行时间,具体结果如下
Windows平台-O0编译
-O1编译
-O2编译
-O3编译
数据总览
Win-MinGW
Vecadd Timing/us
Matrix Multiply Timing/us
Pi Timing/us
-O0
3224
2557602
4074
-O1
2669
2310377
1001
-O2
2009
2344274
1017
-O3
2000
2358837
1651
M ...
2023年国科大杨力祥《高级操作系统》期末思考题汇总
1.为什么开始启动计算机的时候,执行的是BIOS代码而不是操作系统自身的代码?因为刚开始启动计算机的时候,计算机的内存还没有初始化。由于CPU只能执行内存中的代码,因此需要把操作系统从软盘或硬盘中加载到内存上。这就需要硬件主动加载BIOS程序,由BIOS准备好中断向量表和中断服务程序,接着通过中断将引导程序bootsect加载到内存里。再通过后续的一系列执行,操作系统的代码才能位于内存中,供CPU执行。
2.为什么BIOS只加载了一个扇区,后续扇区却是由bootsect代码加载?为什么BIOS没有直接把所有需要加载的扇区都加载?因为操作系统和BIOS通常是由不同的团队进行开发的。为了能够协调工作,双方按照固定的约定进行代码的开发。对于BIOS来说,它接收到启动命令后就将启动扇区的代码加载至0x07c00(BOOTSEG)处,至于启动扇区里的内容是什么,BIOS一概不管。而后续的代码则由操作系统自己的bootsect代码进行加载,这些代码由编写操作系统的团队负责。这样构建可以让BIOS和操作系统的设计团队按照自己的意愿进行代码设计,使内存规划更加灵活。如果BIOS直接把所有需要加载的扇区 ...
FISCO BCOS区块链系统新增节点时无法同步数据的原因及解决方法
问题内容
最近在搭建FISCO BCOS区块链系统,但是在一个旧的区块链上新增一个区块链节点时出现了一些问题
目前的区块链拥有三个节点,区块链中已经部署了一些合约,产生了一些交易,因此最新的块高为21。现在我想要在这个区块链系统中新增一个节点,而且需要它同步之前产生的一些数据
FISCO的文档里写了新增区块链节点的方法,但是需要手动操作很多步骤,因此我在FISCO的github仓库里找到了一个他们提供的脚本,这个脚本可以根据你的配置文件实现节点的一键扩充。脚本地址为:https://github.com/FISCO-BCOS/fisco_bcos_docker_compose
但是使用上述脚本扩充了节点以后,新增加的节点无法同步之前的数据,往区块链上新增交易时,这个新增加的节点也不会参与共识,块高一直为0
使用区块链控制台连接区块链后,将这个新增加的节点通过addSealer方法加入区块链的共识中,但是问题仍未解决
问题原因
查看新节点的log以后发现,新增加的这个节点一直报创世区块错误,因此虽然使用控制台强行将这个节点加入到共识里,但是由于创世区块就和其他节点不同,因此 ...
在kubernetes(k8s)集群上部署FISCO BCOS区块链系统
环境准备
三台ubuntu22.04主机(分别为ubuntu:192.168.3.54;worker1:192.168.3.57;worker2:192.168.3.58)
安装docker,kubernetes
三台主机加入同一kubernetes集群
创建区块链
使用上篇文章《使用Docker容器化部署FISCO-BCOS区块链系统》中的方法,在ubuntu这台主机上生成运行在三台主机上的区块链节点
分别进入三个文件夹中,修改节点的配置信息,我这里以修改192.168.3.54主机上的节点信息为示例(若不进行修改,则之后无法在区块链浏览器中正确绑定区块链节点)
进入192.168.3.54/node0文件夹,打开config.ini文件
将jsonrpc_listen_ip这一项从127.0.0.1更改为对应的主机ip,我这里是192.168.3.54
在worker1和worker2主机上都新建fisco/nodes文件夹,并将ubuntu主机上生成的192.168.3.57文件夹和192.168.3.58文件夹分别拷贝到这两台主机的fisco/nodes文件 ...
使用Docker容器化部署FISCO BCOS区块链系统
环境准备
ubuntu22.04
Docker
安装openssl
sudo apt install -y curl openssl
搭建单群组的四节点区块链本文将详细讲解“在本地模拟多台机器搭建单群组的四节点区块链”以及“在多台机器上搭建单群组的四节点区块链”这两种情景的搭建方法
在本地模拟多台机器来搭建单群组的四节点区块链
下载FISCO BCOS官方的安装脚本
## 创建操作目录
cd ~ && mkdir -p fisco && cd fisco
## 下载脚本
curl -#LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.9.1/build_chain.sh && chmod u+x build_chain.sh
进入之前创建的fisco目录,执行以下指令即可在本地生成一条单群组的四节点区块链。其中,-d参数表示使用docker来构建区块链。请确保机器的30300~30303,20200~20203,8545~8548端口没有被占用,也 ...
在FISCO BCOS区块链系统中使用Java SDK Demo进行压力测试
FISCO BCOS的Java SDK Demo介绍
Java SDK Demo是FISCO BCOS团队基于Java SDK的基准测试集合,能够对FISCO BCOS节点进行压力测试。Java SDK Demo提供有合约编译功能,能够将Solidity合约文件转换成Java合约文件,此外还提供了针对转账合约、CRUD合约以及AMOP功能的压力测试示例程序
环境准备
Java SDK Demo中的测试程序能够在部署有JDK 1.8 ~ JDK 14的环境中运行,执行测试程序前请先确保已安装所需版本的JDK。以在Ubuntu系统中安装OpenJDK 11为例:
# 安装open JDK 11
sudo apt install openjdk-11-jdk
# 验证Java版本
java --version
# 输出以下内容:
# openjdk 11.0.10 2021-01-19
# OpenJDK Runtime Environment (build 11.0.10+9-Ubuntu-0ubuntu1.20.04)
# OpenJDK 64-Bit Server VM (buil ...
FISCO BCOS区块链系统中Java SDK的调用
新建SpringBoot项目
使用IDEA新建一个SpringBoot项目,使用Maven来管理依赖,SpringBoot的依赖项选择Spring Web
添加FISCO BCOS区块链系统依赖
在pom.xml中添加FISCO BCOS区块链系统的Java SDK依赖
<dependency>
<groupId>org.fisco-bcos.java-sdk</groupId>
<artifactId>fisco-bcos-java-sdk</artifactId>
<version>2.9.1</version>
</dependency>
拷贝区块链秘钥
在项目目录的resources下建立新文件夹conf
将“区块链文件夹/nodes/${ip}/sdk/”目录下的证书拷贝到conf文件夹中
我的区块链文件夹是fisco,部署的是本地四节点区块链,因此我这里的ip是127.0.0.1,文件夹下的证书如下
配置区块链系统
在项目的resources下创建配置文件 fisco-config.toml
下面 ...