NekoDaemon 10 X 10
NekoDaemon:~$ ssh nekodaemon.com
Welcome to NekoDebian 18.04 LTS
* Newest dalao's links are available at below.

NekoDaemon:~/blog$ cat ./tags
Docker ESXi Jetson Server GPU NUS Markdown Ubuntu HPC Hexo Pug

NekoDaemon:~/blog$ cat ./categories
学习笔记
吹水日记
学习资料

NekoDaemon:~/blog$ ls post/part1
2020-01-20 Google 可搜索资源
2020-01-19 ASC20 & NVIDIA DLI CUDA C/C++基础培训笔记
2020-01-12 Hexo 第一次魔改全记录
2019-10-18 HP DL360e G8 服务器静音化
2019-08-22 Jetson Nano PWM配置
2019-08-18 某神必的 Bash 代码分析
2019-08-18 NUS SoC Summer Workshop 日记
2019-08-12 GPU Hackathon 2019 日记
2019-06-20 神威太湖之光 样例代码分析
2019-06-19 神威太湖之光 系统分析

NekoDaemon:~/blog$ curl dalao.orz
spinmry
laekov

Google 可搜索资源

GPU & CUDA 相关

on-demand-gtc.gputechconf.com

CUDA Compute Capability

CUDA Pro Tip

ASC20 & NVIDIA DLI CUDA C/C++基础培训笔记

Day2 NVIDIA DLI 加速计算基础 —— CUDA C/C++

Systems Management Interface

命令查询有关此 GPU 的信息

1
nvidia-smi

Writing Application Code for the GPU

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void CPUFunction()
{
printf("This function is defined to run on the CPU.\n");
}

__global__ void GPUFunction()
{
printf("This function is defined to run on the GPU.\n");
}

int main()
{
CPUFunction();

GPUFunction<<<1, 1>>>();
cudaDeviceSynchronize();
}
  • __global__ void GPUFunction()
    • 使用__global__关键字定义的函数需要返回 void 类型
  • GPUFunction<<<1, 1>>>()
    • 使用 <<< … >>> 语法提供执行配置
    • 通过执行配置指定线程层次结构

Compiling and Running Accelerated CUDA Code

1
nvcc -arch=sm_70 -o hello-gpu 01-hello/01-hello-gpu.cu -run
Hexo 第一次魔改全记录

Hexo Pug 主题修改 非典型教程

为了庆祝2020年的到来和大二上学期的结束,(其实是越来越觉得博客太丑了),我决定对半岁大的博客痛下杀手全面改造。

这一次改造的目标是:

  • 提高可读性
  • 美化界面
  • 推广博客,以假装是dalao

1. 选择合适的主题

freemind

这是我之前用的主题freemind,并且在原来的主题上进行魔改,使得博客看起来更丑的同时降低了可读性

顺着终端风的思路,我找到了一个和终端有那么一丝丝关系的主题terminal

terminal

选择这个主题的理由很简单,可读性极佳,审美在线,把杂七杂八的东西扔进终端里,让页面的其他部分变得非常简洁

HP DL360e G8 服务器静音化

HP DL360e G8是一个买回来就嗡嗡嗡的服务器,我一开始以为服务器已经把噪音自动控制到最优,后来在网上冲浪的时候发现我错了。

无意间在Reddit上看到这么篇讨论

It’s a bit complicated with the e-Series because of the shitty RAID controller, but I’ll try to guide you to low rpm: (~21-23%)

  1. Check that none of the typical fan ramp up stuff applies (use original HP drives, no PCI-e cards)
  2. Make sure you set your BIOS to use the RAID controller (even if you don’t use the drives as a raid)
  3. Go into the smart storage thing when booting and setup your drives. If you don’t want to use RAID just create RAID0 configs for each single drive.
  4. Boot into the Service Pack, since the SPP has the necessary drivers the fans should spin down after a while to about 21-23% Alternative to 4: I also got them to spin down by installing the HP provided ESXi image which has the necessary drivers preinstalled. The fans spin down after about 1-2 minutes.

The reason for its weird behavior is the B120i RAID controller. It NEEDS to see it working via their proprietary drivers (hpvsa) to spin down the fans to their minimum. I couldn’t get them farther below 21-23% which was still too loud for office use IMO and too restricted for me (couldn’t get the fans to spin down running proxmox).

That all said, I’d recommend to ditch the server and sell it if you need a quiet server. They completed dropped the ball on the *e Gen8 servers. Just look into the official forums how they basically ignored their customers for years, promised firmware updates to fix the noise issues and then never delivered.

简而言之就是服务器的RAID卡,和PCI-E插槽上的东西会控制服务器风扇的转速。不信的话你可以先在BIOS设置里把SATA控制器从AHCI改成RAID以激活RAID卡,并启动HPE提供的SPP光盘上的系统,就可以观察到风扇转速从降到21%~23%。

这么操作后,我的服务器风扇转速从33%降到了左半侧18~23%,右半侧27%。我一开始以为右半侧插的那张声卡不碍事,把声卡拔掉以后右半侧风扇转速也降到了18~23%。

这意味着降低噪音需要激活RAID卡并且正确安装hpvsaRAID卡驱动,才能让服务器安静下来。md真是个智障的设计。

我的硬盘呢?

Jetson Nano PWM配置

最近要用PWM信号控制激光雷达的转速,一开始以为用Jetson Nano的PWM控制非常简单,结果看到了下面这段话

See samples/simple_pwm.py for details on how to use PWM channels.

The Jetson.GPIO library supports PWM only on pins with attached hardware PWM controllers. Unlike the RPi.GPIO library, the Jetson.GPIO library does not implement Software emulated PWM. Jetson Nano supports 2 PWM channels, and Jetson AGX Xavier supports 3 PWM channels. Jetson TX1 and TX2 do not support any PWM channels.

The system pinmux must be configured to connect the hardware PWM controlller(s) to the relevant pins. If the pinmux is not configured, PWM signals will not reach the pins! The Jetson.GPIO library does not dynamically modify the pinmux configuration to achieve this. Read the L4T documentation for details on how to configure the pinmux.

原文链接

大概意思就是说,要用硬件PWM就得改Pinmux,要用软PWM,抱歉,我们没写这个代码

0. 官方参考代码

官方给出了PWM的Python参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import RPi.GPIO as GPIO
import time

output_pins = {
'JETSON_XAVIER': 18,
'JETSON_NANO': 33,
}
output_pin = output_pins.get(GPIO.model, None)
if output_pin is None:
raise Exception('PWM not supported on this board')


def main():
# Pin Setup:
# Board pin-numbering scheme
GPIO.setmode(GPIO.BOARD)
# set pin as an output pin with optional initial state of HIGH
GPIO.setup(output_pin, GPIO.OUT, initial=GPIO.HIGH)
p = GPIO.PWM(output_pin, 50)
p.start(25)

print("PWM running. Press CTRL+C to exit.")
try:
while True:
time.sleep(1)
finally:
p.stop()
GPIO.cleanup()

if __name__ == '__main__':
main()

GPIO.PWM的50是指代PWM频率,传闻上限是50kHZ
p.start的25当然是指占空比了,范围是0-100

某神必的 Bash 代码分析

这个样例代码是$$的一键搭建脚本,老朽常年懒得看代码,唯独对这个又臭又长的神必脚本有点好奇(这里面可是有一千多行呢)

控制台下的颜色

颜色定义

1
2
3
4
red='\033[0;31m'
green='\033[0;32m'
yellow='\033[0;33m'
plain='\033[0m'

使用方法

1
echo -e "[${red}Error${plain}] This script must be run as root!"

记得把颜色切换回来啊

判断是否为ROOT用户执行脚本

if的简略写法

1
[[ $EUID -ne 0 ]] && echo -e "[${red}Error${plain}] This script must be run as root!" && exit 1
NUS SoC Summer Workshop 日记

总体来说,如果希望体验一下不同的教学方式,Make Good Product Great Again (以下简称为Product)这个Topic是可以参加体验的。但是如果希望像传统课程一样,想确保自己能学到计算机知识,就不是特别推荐这门课了。

先从教学方式说起。Product的上课方式并不是我们这种短期交流学生“独享”的。其实NUS Soc在Summer Special Term里的给自己的学生开的部分课程也采用了这种教学方式,即教授给定一个方向,让学生想做什么东西就做什么东西,教授给予指导意见让学生对自己作品进行修改,而不是照本宣科。最后给分的方式取决于某种标准,如东西的创新性或者实用性。简单的堆砌技术并不能保证能让你拿高分。

在Product这Topic中,教授让我们制作一个具有优秀User Experience (简称UX)的手机App,或者说是产品。起初介绍了UX的一些知识,评论了一些产品UX方面的优缺点,然后就放手让我们自由发挥了。我们需要做的是,确定自己要做什么App,先做个Prototype,接着做个Pre,教授和学生给出建议,然后修改Prototype,再做Pre,如此循环几次。然后再用编程做出自己的App,最后Final Showcase上展示。

教授建议我们使用Adobe Xd或是PowerPoint进行Prototype的设计,以及使用Node.JS编写后端。以上内容全部自学,当然要如果使用别的工具来展示自己的创意都是可以的。

其实问题就来了,前几次Prototype的迭代花掉了不少的时间,然后所有的用到的技术都要自学,所以显而易见,App是做不完的。最终Showcase上很多人是直接展示自己的Prototype(也就相当于能操作的PPT),或者展示完成度很低的App。

对于我来说,最困难的一点反而不涉及计算机知识那部分(因为我们组放弃了编程),而是在于,我们要做个什么App的问题上。最初的问题表现在,缺idea,这个情况其实很常见,毕竟好的idea大多数已经有现成的产品了。接着我们确定了idea,找到了日常生活中的一个痛点,但是在痛点的解决方案上我们组里面产生了严重的分歧。由于组内大多数人缺乏产品的设计经验,同时对自己能力的把握不足,以及思考方式不够成熟,考虑事情不充分,最初的几个产品方案有新手常见的几个毛病:在假想的应用场景下去想象用户可能碰到的问题,然后胡乱的给产品添加功能,导致主要功能跑偏; 想做一个包罗一切的大平台却又只能拿出嘴上可行的实现方案; 不能明确自己要解决什么问题; 要解决的问题实际上不存在等等毛病。(以上毛病在我过去参加创新大赛的时候多少都存在。)所以我消耗了大量的时间精力去劝说和阻止他们继续跳坑,也导致了整个组前期根本不在状态上。

或许这种踩坑经验才是老师希望我们获得的东西,毕竟这种经验没踩过都不知道,光靠课本和别人口述也没啥用,因为我们的其他组员也是知道要避免什么,但越想避免什么,什么就发生了。

所以总的来说,这是一门想传授给你课本不能传授,只能在实践中学到的知识的一门课程。当然我还期待着能学学前后端,想看看是不是有如相声般精彩又蕴含着维基百科级的信息量的Lecture,并以此衡量我们系饱受批评的教学质量是否有如传闻中那么不堪。很遗憾,这个愿望只能留给下一次的交流活动了。

另外NUS的建筑物真的是比我们像得罪了设计师一样的建筑美观太多。

GPU Hackathon 2019 日记

1. GPU Hackathon 介绍

据NVIDIA的员工说,GPU Hackathon 最早是美国橡树岭国家实验室发起的,因为在近些年,GPU的架构非常适合执行并行计算,GPGPU的概念流行后,显卡的GPU可以支持大规模的并行计算,并行计算的速度远超CPU,所以当时的橡树岭在他们的超算平台上配置了不少的GPU。但是如果想用GPU加速计算的话,就需要修改自己的程序,使得程序能够运行在GPU上,然而在当时编写GPU加速代码的门槛比较高,很少的程序能够充分利用GPU的性能,所以橡树岭希望举办一些活动推广GPU计算的技术。后来NVIDIA作为一个GPU厂商,自然也希望更多的用户学会使用GPU,这样他们就能卖出更多的显卡。

这个活动的流程是这样的,每一支队伍拿出自己原先运行在CPU上的程序,然后在为期5天的活动中,NVIDIA会为每一支队伍安排两名导师,在导师的指导下我们修改自己的代码。此外,每一天每个组都要做一个简单的报告,介绍自己的进展,瓶颈,和下一步的工作。最后,会有一场大型的报告,各组总结自己的工作,并汇报所取得的加速效果。

2. 活动前的准备

GPU Hackathon建议我们提前两周,团队就要开始进行一些初步的工作。然而,我因为假期参加了NUS Summer Workshop,活动开始前两天我才回到了学校。

我们组实际上被划分为两个小组,每个小组会负责一份代码的优化,另一个组的成员全部是我们学校力学与航空航天系的一位教授的课题组的研究生和研究助理,而我们组都是对并行计算感兴趣的本科生,我们要优化的代码也是他们课题组提供的。

活动开始前几天的晚上,我去到他们的课题组,大家简单的介绍了一下自己,接着他们打包了一份原始代码让我先看看。他们的代码都是用Fortran写的,我一开始觉得我学过不少现代的高级编程语言,看懂这古老的高级编程语言应该不是什么困难的事,然而后来活动开始后,事情越来越不妙了。

3. 困难和坑

踩坑可以说是第一天就开始踩,不过对于这点我还是有所心理准备的,只不过我没有预计到之后我天天踩而已。

Day 1-2

神威太湖之光 样例代码分析

Example 1: MPI-Athread Clang

master.c:

定义计算规模

1
2
#define J 64
#define I 1000

声明从核函数

1
extern SLAVE_FUN(func)();

这一句对应slave.c中的

1
void func() {...}

创建数组

1
2
3
double a[J][I], b[J][I], c[J][I], cc[J][I];
double check[J];
unsigned long counter[J];

因为这个程序运行在主核上,声明变量无修饰,故该数组实际存放在用户共享连续空间中更多信息

神威太湖之光 系统分析

内存子系统

0. 推荐阅读

Sunway-Taihu-Optimization

Athread

1. 神威太湖之光简介

  • 每个节点有2片SW26010处理器
  • 每片SW26010有4个CGs(核组, Core-Groups)
  • 每个CG有1个MPE(主核, 运算控制核心, Management Processing Element)
  • 每个CG有8x8=64个CPEs(从核, 运算核心, Computing Processing Elements)

讲道理这SW26010确实像把4片PS3上的IBM Cell处理器用胶水糊在了一起

2. Cache

主核存储系统:

存储器 容量
L1 Cache 指令32KB 数据32KB
L2 Cache 512KB