Benchmark

导言

以现实中实际使用的应用为基础,根据其领域和应用计算特点来分类。

Read more

Jupyter AI

Jupyter 简介

Jupyter是一个开源的、交互式的计算环境,可以让用户创建和共享包含实时代码、可视化和文本的文档。

  • 它的名字来源于三个主要的编程语言:Julia、Python和R,这三种语言的开头字母构成了“Jupyter”。
  • Jupyter最初是IPython项目的一部分,旨在提供Python的交互式计算环境。随着时间的推移,它不仅支持Python,还扩展到其他编程语言,包括R、Julia、Scala等。Jupyter的灵感来自于IPython的交互式shell,但在其基础上增加了更多功能和可扩展性。

Jupyter最显著的特点:用户可以通过Web浏览器打开Jupyter笔记本,然后在其中编写代码、运行代码并直接查看代码的输出结果。笔记本中的代码和文本可以交叉编排,使得写作、数据分析和可视化变得非常直观和便捷。

主要的Jupyter组件包括:

  1. Jupyter Notebook:这是最常见的Jupyter界面,以.ipynb后缀的文件保存。它支持多种编程语言的代码运行,交互式地执行和编辑代码块,并支持在代码块中插入Markdown格式的文本以及图像、链接等内容。
  2. Jupyter Lab:这是Jupyter Notebook的下一代界面,提供了更加现代化和灵活的界面。Jupyter Lab将各种组件整合到一个集成的界面中,使得多个笔记本、终端和文件浏览器可以在一个窗口中同时运行。
  3. Jupyter Kernel:Jupyter支持多种编程语言的内核,通过内核,Jupyter可以与特定编程语言进行交互。例如,使用Python内核可以在笔记本中运行和编写Python代码,同样,使用R内核可以运行和编写R代码。

Jupyter在教育、数据科学、机器学习、数据分析等领域得到广泛应用。它提供了一个方便、实用的平台,帮助用户探索数据、实验算法、展示结果,并通过共享笔记本方便地与其他人交流和合作。

Jupyter vs python

Jupyter 的核心在于 数据分析的 计算-分析-可视化 的快速迭代。

如果不是数据科学,就不太需要Jupyter

Installation in Linux

安装Jupyter Lab

web-forward to local machine

远程访问服务器

Jupyter-AI

  1. Installation
  2. test

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

  1. python 一大特点就是容易可视化,既然这样,我为什么不用jupyter呢?
  2. chatgpt 类的工具都是基于付费API,有两大问题
    1. 国内难以付费
    2. 国内ip一旦访问是很容易封号的。
  3. 一种解决办法是使用有免费API的工具,并且在全流量走cloudflare的wg的服务器上配置服务。

参考文献

上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。

https://jupyter-ai.readthedocs.io/en/latest/users/index.html#installation

Parallel_sort

并行排序算法

to learn

PSRS算法

并行正则采样排序算法

PSRS

复杂度分析

简单地讨论一下 PSRS 算法的复杂度。

  • 在第一部分的快速排序中,时间复杂度为O(klogk),k=n/p
  • 然后,各处理器选择 p-1 个代表元素,代价为O(p)
  • 再由 Proc#0 对所有送来的代表元素进行排序,然后选出主元,这里若使用快速排序,代价为O(p^2 logp^2)
    • 而若使用归并排序,则所需代价为O(p^2)
  • 每个处理器接收到主元后,再对有序数组进行划分,代价为O(k+p)
  • 最后,各个处理器全局交换,并行归并排序,

考虑到实际应用中,需要排序的数据长度 n 一定远远多于现有的处理器 p,此时可以视 p 为一个小常数,那么 PSRS 排序算法的时间复杂度,就可以简化为 O(klogk+k*logp)~O(klogk)

从消息复杂度的角度看,

  • 播送主元的复杂度为 O(p^2+p)
  • 分区合并(全局交换)部分的消息复杂度与具体算法实现相关,但其最大值不会超过 O(n)

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。

https://dingfen.github.io/mpi&openmp/2021/01/23/psrs_sort.html

User Kernel Mode

内核态

内核态是计算机系统中的一种特权模式,用于执行操作系统内核的代码和功能。与用户态相比,内核态具有更高的权限和更广泛的访问能力,可以执行一些用户态无法执行的关键任务和操作。下面是从用户态的角度上介绍内核态的功能:

  1. 系统调用(System Calls):内核态允许用户程序通过系统调用接口请求操作系统提供的服务和功能。用户程序可以通过系统调用请求文件操作、网络通信、内存管理等操作。当用户程序执行系统调用时,会触发从用户态切换到内核态的转换,以便内核在高权限下执行相应的操作。
  2. 资源管理:内核态负责管理计算机系统的各种资源,包括处理器、内存、磁盘、网络等。在内核态下,操作系统可以对这些资源进行分配、调度和释放,确保资源的有效利用和合理分配。
  3. 中断处理:当发生硬件中断或异常时,内核态负责处理中断并提供相应的服务。例如,当用户程序需要与设备进行交互时,内核可以响应设备的中断信号,进行数据传输、状态检查等操作。
  4. 进程管理:内核态负责创建、销毁和管理进程。它可以调度进程,分配和回收进程所需的资源,并在必要时进行进程间的通信和同步。
  5. 内存管理:内核态控制着计算机系统的内存分配和管理。它负责将物理内存分配给进程,并维护虚拟内存和物理内存之间的映射关系。内核还处理内存保护、页面置换、内存回收等任务。
  6. 设备驱动程序:内核态包含设备驱动程序,用于与硬件设备进行交互。它允许操作系统通过设备驱动程序来控制和管理硬件设备,如磁盘驱动程序、网络驱动程序等。
  7. 安全和权限管理:内核态能够执行与系统安全和权限相关的任务。它可以控制对系统资源的访问权限,并确保用户程序不能越权访问或修改关键数据和系统配置。

总的来说,内核态提供了操作系统核心功能的执行环境,拥有更高的权限和更广泛的访问能力,使得操作系统能够管理和控制计算机系统的各个方面,同时为用户程序提供必要的服务和保护。

代码位置

在Linux系统中,每个进程的虚拟地址空间中的高位部分通常被映射为内核空间,其中包含了内核态的代码和数据。这个区域通常被称为内核空间或内核页表。内核空间中的内容包括以下两类:

  1. 内核代码:内核代码是操作系统内核的实现,包括各种系统调用、设备驱动程序和核心功能的代码。这些代码用于提供操作系统的各种服务和功能,如文件系统操作、进程管理、内存管理、网络通信等。内核代码是所有进程共享的,因为它们代表了操作系统的核心部分,为所有进程提供服务。
  2. 共享内核数据结构:内核空间中还包含一些共享的内核数据结构,用于维护系统状态和资源管理。例如,进程调度器、内存管理数据结构、文件描述符表等。这些数据结构被多个进程共享,以便内核能够管理和控制系统资源的分配和使用。

除了以上共享的内容,内核空间还包含一些每个进程独有的部分,例如:

  1. 进程描述符(Process Descriptor):每个进程都有一个唯一的进程描述符,其中包含了进程的状态信息、上下文和其他与进程相关的数据。进程描述符存储在内核空间,每个进程都有自己独立的进程描述符。
  2. 用户栈和内核栈:每个进程都有自己的用户栈和内核栈。用户栈用于保存进程在用户态执行时的局部变量和函数调用信息,而内核栈用于保存进程在内核态执行时的上下文信息和函数调用。(内核函数也要嵌套调用)

总结起来,Linux进程的高位部分映射了内核空间,其中包含了内核代码、共享的内核数据结构以及每个进程独有的部分,如进程描述符和栈空间。这种映射允许进程与内核进行交互和访问操作系统的功能和服务。

如何共享

在内核中,代码共享并不是通过动态链接库(.so)的模式来实现的。内核态的代码通常被编译成内核模块或者直接编译进内核映像中,而不是作为独立的可加载库。因此,内核中的代码共享机制与用户空间中的动态链接库不同。

在内核中,代码共享是通过代码复用和内核模块的概念来实现的。内核模块是一种可以动态加载和卸载的代码和数据集合,它可以扩展内核的功能。内核模块可以包含新的设备驱动程序、文件系统、网络协议等,以便在需要时被加载到内核中运行。

内核模块的加载过程可以在运行时根据需要进行,而不需要重新编译整个内核。这样,多个进程可以共享同一个内核模块,从而实现内核代码的共享。当多个进程需要使用某个内核模块时,模块只需要加载一次,然后被多个进程共享调用。

值得注意的是,内核中的代码共享是在内核空间内部进行的,与用户空间的动态链接库不同,它不涉及用户进程的地址空间和加载机制。内核模块的共享是在内核内部完成的,不同进程间可以通过系统调用接口访问共享的内核模块提供的功能和服务。

总结起来,内核中的代码共享是通过内核模块的加载和运行机制来实现的,而不是像用户空间中的动态链接库那样。内核模块可以被多个进程共享调用,从而提供共享的内核功能和服务。

内核态与用户态切换

切换时机

内核态与用户态的切换通常由以下几种情况触发:

  • 系统调用(System Call):当用户程序通过系统调用请求操作系统提供的服务时,会触发从用户态到内核态的切换。这是最常见的切换方式。
  • 异常(Exception)和中断(Interrupt):当发生硬件中断、软件中断(如除零错误)、内存访问错误等异常情况时,CPU会切换到内核态来处理异常。这些异常可以是由程序错误、设备请求或其他条件引起的。
  • 外部事件:例如时钟中断、I/O 完成中断等,这些事件可能需要内核处理,因此会导致从用户态切换到内核态。

切换的细节

当进程从用户态切换到内核态,或者从内核态切换回用户态时,涉及到特权级的切换和上下文的保存与恢复。下面是内核态与用户态切换的一般细节:

  1. 特权级切换:内核态拥有更高的特权级别,因此从用户态切换到内核态时,CPU会从当前运行的用户模式切换到内核模式。这种切换会改变CPU的状态,包括特权级、堆栈和指令指针。

  2. 上下文保存与恢复:在切换到内核态之前,CPU会保存当前用户态下的进程上下文信息,包括程序计数器(PC)、寄存器的值、堆栈指针等。这些上下文信息保存在进程的内核栈中。

  3. 内核态执行:当切换到内核态后,CPU开始执行相应的内核代码,处理请求或异常。在内核态下,操作系统可以访问和操作系统的所有资源和功能,执行必要的操作。

  4. 上下文恢复与切换回用户态:当内核态的任务完成后,CPU会从内核栈中恢复之前保存的进程上下文信息。然后,CPU会将特权级切换回用户态,并从保存的程序计数器继续执行用户程序。

需要注意的是,内核态与用户态的切换涉及到CPU和操作系统的底层机制,具体细节可能会因操作系统的设计和架构而有所不同。上述描述是一般情况下的概述,不同的操作系统和处理器架构可能会有特定的实现细节。

开销来源

  1. 特权级切换
  2. 上下文保存与恢复
  3. 由于PTI的存在,内核维护了两套页表。切换到内核态时,可能需要切换内存地址空间的映射关系,例如将用户态的虚拟地址空间映射为内核态的地址空间。这可能涉及页表的切换和TLB(Translation Lookaside Buffer)的刷新,会带来一定的延迟和开销。

量化

内核态与用户态的切换时间在数百到数千个CPU周期之间

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。

IPCC2022final

学到的一些亮点

总结反思

由于决赛是黑盒制度,没有排行榜,也不知道最终算分的例子是多大。我们优化着眼于自己找的清华的大例子,并行的占比在这部分很小。忽略了小例子里,占比比较高的部分的优化。结果最终赛题例子很小。

如果提前知道元素个数,并行对同一个数组的末尾添加元素可以并行,添加到指定位置之后再统一排序就行。比如山东大学,就是这里快了大约10ms,加上第一次排序快5ms。

比如信息中心(应该是第一名)的排序,用的是归并的基数排序

比如青海大学的优化:

还有高效的排序,怎么实现。类似

需要进一步的研究学习

CSR (压缩稀疏行存储) 矩阵和邻接表在表示图数据结构时,计算和访问性能有些差异:

  • CSR通过压缩行存储机制,可以大幅减少空间占用,节省内存。但索引算术运算负担重一些
  • 邻接表使用链表指针连接相邻节点,追踪任意一条边的开销很低。但总体占用内存空间更大。
  • CSR访问任意一个元素通过索引计算直接可以定位,兼具稠密和稀疏矩阵的特点。
  • 邻接表的边访问性能更好,通过指针直接遍历一个节点的所有相邻节点。
  • CSR的预处理时间较短,更易于向量化实现提高效率。
  • 邻接表更灵活,可表示加权图或处理动态变化的图。
  • CSR矩阵更易进行压缩和剪枝来优化存储,节省内存带宽。

所以简单来说,如果图更稠密,数据访问模式更随机,CSR可能会有些优势。如果需要频繁遍历边,图结构变化大,邻接表访问效率可能会更高一些。需要根据具体情况选择合适的表示。

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

哎呀,你干嘛! 今年又西巴了,惜败了,应该是第三名左右。

参考文献

BitTorrent

BT简述

BitTorrent (简称 BT) 协议是和点对点(point-to-point)的协议程序不同,它是用户群对用户群(peer-to-peer, 或简写为 P2P) 传输协议, 它被设计用来高效地分发文件 (尤其是对于大文件、多人同时下载时效率非常高)。该协议基于HTTP协议,属于TCP/IP应用层。

将文件划分成多块(默认256Kb一块),每块可以从网络中不同的用户的BT客户端处并行下载。

1
2
3
BT 下载的文件都是别人上传给你的。
BT 下载速度均来自其他下载同一资源的用户上传速度。
上传的用户越多,你的下载速度越快,相反没用户上传你就没有下载速度。

比特彗星,包括其他 BT 软件(迅雷除外,迅雷不是会员会限速,高速通道下载提高的速度一部分就是接触限速后获得的)都不会限制下载速度。

BT分享规则

与迅雷不同,BT旨在“人人为我,我为人人”。用户和用户之间对等交换自己手中已有的资源。如果任何一方试图白嫖另外一方的资源,而自己不愿意上传自己的资源,那么那方就会被人视作吸血者而被踢出这个交换,下场是没有人会愿意和你交换数据,你的下载速度也就归零。

如果把上传速度限制为了10KB/s,10KB/s是BitComet上传最低限速,很大时候就这10KB会被包含DHT查询、向Tracker服务器注册,连接用户所产生的上传全部占满。在下载种子的时候,其他用户连上你是只能拿到1~2KB/s甚至一点都没有的。

现在的BT下载客户端都可以做到智能反吸血,所以基本想和交换数据的用户都把你当作Leecher(吸血鬼)Ban(封禁)处理了,故没有下载速度不足为奇。

一般来说,只要预留50KB/s的上传给其他网页浏览、聊天就可以了,在下载时应该尽量把上传留给那些和你交换资源的用户,这样才不会被他们视作你在吸血进而屏蔽你。

如果上传不足,就应该主动限制自己的下载速度,否则单位时间下载量远超过上传量反而会遭来更多的屏蔽,对下载速度提升更加不利。

BT基本流程

.torrent 种子文件本质上是文本文件,包含Tracker信息和文件信息两部分。Tracker信息主要是BT下载中需要用到的Tracker服务器的地址和针对Tracker服务器的设置。

  1. 下载时,BT客户端首先解析种子文件得到Tracker地址,然后连接Tracker服务器。
  2. Tracker服务器回应下载者的请求,提供下载者其他下载者(包括发布者)的IP。
  3. 下载者再连接其他下载者,根据种子文件,两者分别告知对方自己已经有的块,然后交换对方所没有的数据。
    1. 此时不需要其他服务器参与,分散了单个线路上的数据流量,因此减轻了服务器负担。
  4. 下载者每得到一个块,需要算出下载块的Hash验证码与种子文件中的对比,如果一样则说明块正确,不一样则需要重新下载这个块。这种规定是为了解决下载内容准确性的问题。

常规部署

  • 安装qBittorrent-nox, tmux下运行,在8080端口挂载WebUI
  • 安装qbittorrent, 用户运行qbittorrent, x11弹出应用窗口
    • 问题:
      • 怎么维持窗口?sudo XAUTHORITY=/home/qcjiang/.Xauthority qbittorrent
      • 关于写文件权限,如何写网络硬盘
      • node5 上传很快, 网络原因?种子原因?(不是,是因为网络硬盘,所以下载多少要占用多少上传)

docker部署

以qBit的docker为例,参考linuxsever的docker-compose如下:(qBit相对于Transmission有多线程IO的优势) 也可以使用其余docker镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
---
version: "2.1"
services:
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
environment:
- PUID=0 # 这里是root 如果想以其他用戶A修改文件,可以改成其他用户的UID。通過id A 查看
- PGID=0
- TZ=Etc/UTC
- WEBUI_PORT=8080
volumes:
- /addDisk/DiskNo4/qBit:/config
- /addDisk/DiskNo4/bt:/downloads

network_mode: host
restart: unless-stopped

默认账号 admin 默认密码 adminadmin
然后通过webUI http://222.195.72.218:8080/管理。

如果不想网络通过wireguard,而是本地可以如下设置

同一台机器实现两个账号做种

  • 思路:两个docker,同一个网络出口
  • 問題:
    • qBit要有权限写文件
    • 两个docker兼容性:
      • WebUI有bug,不一定会显示。重启刷新即可
      • 其次有一个docker会没有网络。
        • 这是由于端口随机错误导致的,会导致下面连接状态显示火焰。换端口刷新即可解决。
  • 关于封号
    • 由于国内环境下载一般都是大内网。同一个网络出去应该没有问题。
    • 大多数做种是通过ipv6,会被检测出同一个机器多个账户做种,导致封号
    • 还有关于盒子刷上传,一方面通过速度,另一方面由于盒子的ip是固定的,所以会被检测出重复导致封号。

测速

  1. 先用 https://www.speedtest.net 测速
  2. 考虑热门种子测试 http://releases.ubuntu.com/19.10/ubuntu-19.10-desktop-amd64.iso.torrent
    1. 没通过代理能找到的用户变少,速度也变慢了。
  3. 如果跑不到网络上限,可能和软件设置有关

上传速度

m站刷上传的时候,发现基本都是对方基本都是通过ipv6下载

uTP是一种基于UDP的协议,它可以根据网络拥塞情况自动调节传输速度,从而减少对其他网络应用的影响。

BT连接是一种基于TCP的协议,它可以保证数据的完整性和可靠性,但是可能会占用较多的网络带宽和资源。

在qBittorrent中,标志U K E P分别表示以下含义:

1
2
3
4
U:表示你正在上传数据给对方,或者对方正在从你那里下载数据。
K:表示对方支持uTP协议,即基于UDP的传输协议。
E:表示对方使用了加密连接,即通过加密算法保护数据的安全性。
P:表示对方使用了代理服务器或VPN服务,即通过第三方网络隐藏自己的真实IP地址。

PT设置

  • 虽然说PT下载,客户端要关闭DHT,PeX, LSD。
  • 但是其实种子是默认关闭的,无序额外设置,北洋和M站一样。

基本概念

Tracker

收集下载者信息的服务器,并将此信息提供给其他下载者,使下载者们相互连接起来,传输数据。

种子

指一个下载任务中所有文件都被某下载者完整的下载,此时下载者成为一个种子。发布者本身发布的文件就是原始种子。

做种

发布者提供下载任务的全部内容的行为;下载者下载完成后继续提供给他人下载的行为。

分享率

上傳資料量 / 下傳資料量的比率,是一種BT的良心度,沒實際作用.(一般为了良心,至少大于1)

长期种子

BitComet的概念,相对于种子任务的上传能够控制。

长效种子就是你不开启任务做种,只要你启动了比特彗星,软件挂后台,当有其他用户也是用比特彗星下载你列表里的存在的文件时候就会被认为是长效种子 。

DHT

.DHT全称叫分布式哈希表(Distributed Hash Table),是一种分布式存储方法。在不需要服务器的情况下,每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现整个DHT网络的寻址和存储。新版BitComet允许同行连接DHT网络和Tracker,也就是说在完全不连上Tracker服务器的情况下,也可以很好的下载,因为它可以在DHT网络中寻找下载同一文件的其他用户。

类似Tracker的根据种子特征码返回种子信息的网络。

在BitComet中,无须作任何设置即可自动连接并使用DHT网络,完全不需要用户干预。

用户交换Pex

Peer Exchange (PEX), 每个peer客户端的用户列表,可以互相交换通用。可以将其理解为“节点信息交换”。前面说到了 DHT 网络是没有中心服务器的,那么我们的客户端总不能满世界去喊:“我在下载这个文件,快来连我吧.”(很大声)。所以就通过各个 BT 客户端自带的节点去同步路由表实现 DHT 网络连接。

本地用户发现

LSD(LPD)就是本地网络资源,内网下载,没什么几把用的东西,可能学校等私有网络好使

ISP

網絡業務提供商(Internet Service Provider,簡稱ISP),互聯網服務提供商,即向廣大用户綜合提供互聯網接入業務、信息業務、和增值業務的電信運營商。

反吸血机制

基本原理

  1. 根据流量: 默认设置为120秒,持续对某个peer产生上传,并且从该peer用户获取的下载流量没有超过1KB文件(1024字节)大小,即拉黑该peer,预警颜色为黄色,合法为绿色,红色为封禁。
  2. 可组合检测指定客户端进行反吸血,比如说指定屏蔽qbittorrent、utorrent等吸血客户端选择(可多选客户端,可对下载任务和做种任务生效)
  3. 可组合检测客户端连接端口号进行反吸血,比如说指定屏蔽15000迅雷X版本客户端等吸血端口(可多选端口号,可对下载任务和做种任务生效)
  4. 可组合检测客户端连接peer_id标志符进行反吸血屏蔽,例如屏蔽XL0018客户端等吸血标志符(可多选标志符,可对下载任务和做种任务生效)

高级设置

1
2
3
4
5
bittorrent.anti_leech_min_byte
设定反吸血保护流量:要求对方在指定时间(秒)内需要上传的最少流量(byte), 取值范围:1-10000。

bittorrent.anti_leech_min_stable_sec
设定反吸血保护时间:指定与对方连接多长时间(秒)后开始检查流量(byte),取值范围:1-10000。

常见问题

需要软件开着吗?

需要

原文件改名或者移动,还会上传吗?

文件下载后不能移动,不能删除,不能重命名(但可以在软件内改)。 一但BT 软件找不到文件,或删除了任务,就无法做种上传了。

晚上避免上传

可以在Bitcomet高级设置里设置时段限速

对硬盘损害大吗?

分享上传也需要频繁读取硬盘。

以Bitcomet为例,该软件就是通过磁盘缓存技术减小频繁随机读写对硬盘的损伤。

磁盘缓存就是利用物理内存作为缓冲,将下载下的数据先存放于内存中,然后定期的一次性写入硬盘,以减少对硬盘的写入操作,很大的程度上降低了磁盘碎片。

因为通常我们设置内存(磁盘缓存)为每任务XX兆,意味着,这个缓冲区可以存放数兆甚至几十兆的“块”,基本上可以杜绝碎片了。

现在BT软件都是自动设置缓存的,它是根据你物理内存的大小分配的。

注意设置

  1. 设置了“反吸血”,应对迅雷
  2. 校园网设置9,不限制P2P
    1. 国内各省份不同运营商限速策略(QOS)

需要进一步的研究学习

路由器下载?

参考文献

Mount Network Disk

导言

想将Nas上的盘挂载到常驻的Ubuntu机器上,供jellyfin读取。

Read more

UnimportantView: Film & TV(Anime) Works Rating

如何评价影视剧(动漫作品)

我一向的观点是现实生活已经投入了很多时间体验了,影视剧(动漫作品)肯定要是看现实中没有的。这导致的第一个问题就是既然不存在,你怎么让观众相信呢?

  • 真实的氛围感
    • 真实的细节特效
    • 真实的演员反映和期望中的样子

如何评价对影视剧(动漫作品)角色的喜爱程度

  • 喜欢一个角色往往是没有什么理由的,虽然要追求格物致知。但是将最感性的情感拿来分析是不是有点无情呢?

  • 初印象的美好(40)

    • 外貌美(15):
      • 不一定要完美,但是要有特点,
      • 可以接受有缺陷,但是其一般要具有意义来完善人物塑造。
    • 可爱俏皮(5)
      • 可以拉进距离感
    • 性格好(乐观、勇敢、坚毅、聪明)(10)
      • 角色不可能不经历挫折,乐观还是要一点
      • 但是白给的老好人不行,还是要有基础原则的
      • 可以出发点很低(一开始比较恶劣,自闭),为角色后续成长留下了空间
    • 强烈独特独立的个性魅力、个人行为准则坚定(10)
      • 额外固执但是专情
      • 病娇(特别爱一个人),想守护妹妹的想法
      • 厌世,缺爱
  • 角色剧情行事逐渐展示出来的

    • 真实感(反差,与观众拉近距离) (20)
      • 平时严酷,但也会含羞
      • 总是公正,但也会偏私
    • 悲剧色彩,激发了同情心(共情)(0~30)
      • 努力却依旧失败、正义行事却危机四伏、爱而不得、无所谓付出。一哭 +10
      • 美好的东西被摧毁总是令人扼腕痛心,令人印象深刻。+10
        • 失去美好的未来
      • 刀人:刀友情,刀亲情 +10
    • 共鸣?观众随角色一同成长(40)
      • 如果观众一开始有一样的疑惑,(10)
      • 然后和角色一起寻找答案 (10)
      • 最后坚定的相信自己找到的 (20)

举例

  • 星野爱(113)
    • 外貌(5):不是特别感冒的形象
    • 可爱俏皮(2)
    • 乐观性格(6):演出也有时迷茫,却为了孩子开朗了起来
    • 独特和自我(10): 厌世,缺爱让人同情
    • 真实感(20):以谎言编织的怀孕偶像,是最大的反差
    • 悲剧色彩(30):
      • 想学会爱,但是到死还在努力
      • 失去了与孩子们的未来
      • 刀母爱
    • 共鸣与成长(40)
      • 疑惑: 不会爱的人怎么办
      • 寻找:以谎言代替
      • 结论:谎言也是我努力传达爱意的方式。但唯独我爱你们,这句话……绝对不是谎言
  • 亚斯娜(100)
    • 外貌(15):理想的人妻
    • 可爱俏皮(5)
    • 乐观性格(10):理想的姐姐人妻性格,爱你管你又不太束缚你
    • 独特和自我(10): 为了Kirito 愿意牺牲自己
    • 真实感(20):平时严酷,但也会含羞
    • 悲剧色彩(10):
      • 刀爱情, 差一点失去Kirito
    • 共鸣与成长(30)
      • 疑惑: 在虚拟世界里,存在的意义是什么
      • 寻找:寻找虚拟世界“红莫罗”的东西
      • 结论:这份感情与相遇的经历是真实的(10,结论不够动容)
  • 爱莉希雅Elysia(125)
    • 外貌(15):理想的人妻2
    • 可爱俏皮(10) 与芽衣打情骂俏,甜齁了(摸角)。额外加分+5
    • 乐观性格(10):理想的姐姐人妻性格,
    • 独特和自我(10): 真我 ~ 人之律者
    • 真实感(20):平时严酷,但也会含羞(神之子却爱上了人类)
    • 悲剧色彩(30):
      • 出生无知的律者,努力爱人类,却不被理解
      • 反而为人类牺牲
      • 本世代对抗侵蚀之律者,最终数据还被删除
    • 共鸣与成长(30)
      • 疑惑: 凡事任凭心意而为,自由自在,与副首领的身份格格不入的往事乐土的少女是谁
      • 寻找:寻找前世的真相与少女的秘密
      • 结论:即使往事乐土不存在了,但只要这份记忆还在,你就永远还在。愿时光永驻此刻(10,结论不够动容)
  • 光与焰(120)
    • 外貌(15):两个人各有特点
    • 可爱俏皮(5)
    • 乐观性格(10):理想的姐姐人妻性格,
    • 独特和自我(10): 光傲娇 焰体贴
    • 真实感(25):光性格上与焰完全相反,非常要强,不擅长表达自己的感情,但本性其实很温柔,内心很脆弱。
      • 高质量CG的游戏,真实沉浸感额外加分+5
    • 悲剧色彩(20):
      • 被坏人利用,虽然不愿意,但是伤害了世界,
      • 喜欢lex,最后还是牺牲了自己(lex,你一个人也没关系了吧!)
    • 共鸣与成长(35)
      • 疑惑: 无意间结实的少女
      • 寻找:寻找世界的真相与少女的秘密
      • 结论:即使有前世的经历。但是愿意忘记悲伤的过去。从现在开始彼此守护(15,结论不够动容)
  • 评价模板
    • 外貌(15):理想的人妻
    • 可爱俏皮(5)
    • 乐观性格(10):理想的人妻性格
    • 独特和自我(10):
    • 真实感(20):
    • 悲剧色彩(30):
      • 失去了
    • 共鸣与成长(40)
      • 疑惑:
      • 寻找:
      • 结论:

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

看了星野爱之后,我又emo了

参考文献

Gem5

简介

  • GEM5是一款模块化的离散事件驱动全系统模拟器,由C++与python编写
  • 它结合了M5(多处理器模拟器)和GEMS(存储层次模拟器)中最优秀的部分,是一款高度可配置、集成多种ISA和多种CPU模型的体系结构模拟器。
    • M5是由Michigan大学开发的一款开源的多处理机模拟器,受到了业内的广泛关注,很多高水平论文都采用M5作为研究工具。
    • 另一方面,Wisconsin推出的GEMS能够对储存层次进行详细而灵活的模拟,包括对多种不同的cache一致性协议和互联模型的支持。
    • 目前的GEM5是M5和GEMS的一个紧耦合版本。
  • GEM5已经能够支持多种商用ISA,包括X86、ARM、ALPHA、MIPS、Power、SPARC等,并且能够在X86、ARM、ALPHA上加载操作系统。

可选配置(灵活性)

  • 灵活性是指gem5提供了多种CPU模型、系统模型以及存储器模型。
    • CPU模型:Atomic、Timing、In-order、O3(Out of Order)
      • AtomicSimple是最简单规模的模型,一个cycle完成一条指令的执行,memory 模型比较理想化,访存操作为原子性操作。适用于快速功能模拟。
      • TimingSimple模拟器也是无流水线的模拟,但是使用了存储器访问时序模型,用以统计存储器访问延迟。
      • In-Order模型是GEM5模拟的新特性,强调指令时序与仿真精度,流水级为默认五级流水:取值、译码、执行、访存、写回。并且模拟了cache部件、执行部件、分支预测部件等。
      • O3模拟器是流水级模拟,O3模拟器模拟了乱序执行和超标量执行的指令间依赖,以及运行在多CPU上的并发执行的多线程。
        • 默认7级流水:取值、译码、重命名、发射、执行、写回、提交。
        • 模拟了物理寄存器文件、IO、LSQ、ROB功能部件池等。
        • 主要参数为流水管道间延迟、硬件线程数、IQ/LSQ/ROB项数、FU延迟、物理寄存器重命名、分支预测、访存依赖预测等。
    • 系统模型:SE(System-call emulation)、FS(Full System)。
    • 存储模型:Classic、Ruby。
      • M5的Classic mode存储器是最简单的模型,它提供了简洁快速的可配置性。
      • GEMS的Ruby模型注重于精确度并且支持不同的cache一致性协议。
        • Ruby存储模型支持庞大阵列的互联拓扑,包括两个不同的网络模型:Simple网络与Garnet网络。
          • Simple网络对链路、路由延迟与链路带宽进行建模,但并不建模路由资源竞争与流控。
          • Garnet网络详细建模路由微架构,包括所有相关的资源竞争与流控时序。

基本模式

  • System Call Emulation (SE) Mode
    • In this mode, one only needs to specify the binary file to be simulated. This binary file can be statically/dynamically linked.
  • full-system mode
    • This mode simulates a complete system which provides an operating system based simulation environment.
    • very slow, rendering it impractical for deployment in real-world applications.
1
time ./build/ARM/gem5.fast configs/example/se.py --cmd=/home/shaojiemike/test/llvmVSgem5/MV/MV_gem5 -n 32 --cpu-type=O3CPU --l1d_size=64kB --l1i_size=16kB --caches
  • L1d cache是每个核单独64KB(原因见后图)。但其实默认cache结构是L2共享的

安装

  • 在源目录下运行scons build/<config>/<binary> 建立模拟器。
    • <config> gem5的配置文件,如ARMX86
    • <binary> 模拟器的类型,有如下
      • gem5.debug 有关闭了优化,使gdb一类的工具更易于调试;
      • gem5.opt有打开优化,但保留了调试输出和断言;
      • gem5.fast去除了调试工具;
      • gem5.prof用于与gprof共同使用
1
scons build/ARM/gem5.fast --debug=presub --verbose -j 32

输入参数

gem5 安装的默认配置

可选选项在./build/ARM/gem5.fast configs/example/se.py -h或者 configs/common/Options.py 中查看

常规的配置:

  • 多级cache
  • CPU
    • 频率,核数
    • 指令发射宽度
      • commitWidth, decodeWidth, dispatchWidth, fetchWidth, issueWidth,
      • renameWidth, squashWidth, wbWidth ,
    • 端口模型的部件类型以及个数
  • 内存

cache設置

  • 只指定大小是沒用的,需要在L1cache 前加上 “–caches”,在l2cache前加上 “–l2cache“。命令結果類似
  • 默认cache是没有开硬件预取HWP的,类型通过--list-hwp-types查看。可以指定L1L2cache的HWP类型,如--l1d-hwp-type=TaggedPrefetcher
1
2
3
4
5
6
7
8
9
10
11
build/X86/gem5.opt configs/example/se.py 
--caches --l1d_size=32kB --l1i_size=32kB
--l2cache --l2_size=256kB
--l3_size=8192kB # l3 在 se里是不生效的
-c tests/test-progs/hello/bin/x86/linux/hello

# 建议将L3大小并入L2来模拟cycle的下限
build/X86/gem5.opt configs/example/se.py
--caches --l1d_size=32kB --l1i_size=32kB
--l2cache --l2_size=256kB+8192kB
-c tests/test-progs/hello/bin/x86/linux/hello

进阶配置:

  1. 多核模拟时,配置独占cache
  2. 增加共享L3
  3. 添加共享的L3cache,并将L2cache改为独立的

输出文件

运行完SE模式,默认会在指令路径下生成m5out文件夹,其中各文件大致含义如下:

  • config.ini或者config.json 运行指令的系统参数
    • Contains a list of every SimObject created for the simulation and the values for its parameters.
    • json格式的文件能比较好的理清config的重要设置
    • [system.cpu] 有CPU的具体设置
    • [system.mem_ctrls.dram] 有DRAM读取数据的具体设置
    • [system.membus] BUS的相关设置
  • stats.txt 模拟结果数据(具体的周期数等)
    • A text representation of all of the gem5 statistics registered for the simulation.
    • system.clk_domain.clock 1000 # Clock period in ticks (Tick)
    • system.cpu_clk_domain.clock 500 # Clock period in ticks (Tick)
  • fs/proc/lscpu 模拟系统配置(类似lscpu)
  • config.dot.* 模拟的系统结构
    • config.dot 是以文字展示
    • config.dot.pdfconfig.dot.svg 都是以图片表示aliyuncs1
    • config.dot.svg 能展示每个部件的细节参数 aliyuncs2

运行

参考博客, 如果se.py無法滿足要求,可以自己編寫脚本

CPU参数解释

各阶段发射宽度

commitWidth, decodeWidth, dispatchWidth, fetchWidth, issueWidth, renameWidth, squashWidth, wbWidth

下面是行数占比最大的几个部分

branchPred

  • BTBEntries

decoder

fuPool

  • fuction pool 类似乱序执行的端口模型,ARM下的O3模拟的fuPool如下
    ARM-O3-fuPool

gem5 模拟器误差来源分析

运行真实周期数

  • 使用perf stat test.exe, 可参考本博客perf文章

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

https://blog.csdn.net/ivy_reny/category_6666068.html

https://blog.csdn.net/wyj7260/category_1301132.html

Synology terminal

配置开机启动项

编写脚本/var/services/homes/shaojiemike/wgReboot.sh

1
2
3
4
5
#!/bin/bash
ip ro add default via 222.195.90.254 dev eth0 table eth0-table
ip ro a 114.214.233.0/24 via 222.195.90.254 dev eth0 src 222.195.90.2 table main
wg-quick up wg1
ip ro d default via 222.195.90.254 dev eth0 src 222.195.90.2 table main
  • 执行权限chmod +x
  • 群晖WebUI -> 控制面板 -> 任务计划 -> 新增 -> 触发的任务
    • 选择Root、开机事件
    • bash /var/services/homes/shaojiemike/wgReboot.sh

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献