0%

我的大学

记于即将入学Mphi。愁绪万千,难以言语。

相比我的高中,我的大学似乎没有那么多需要记录的事物,外面的朋友、同学、发生的事物都少多了,就像一个在北上广深过着灯红酒绿生活的人一下子去了克利夫兰?但是我的内在,或者说我的三观真的是有了翻天覆地的变化。因此我还是需要记录一下的,我大学大概的模样,从生活到学习,从学习到内心。

就像回忆NBA或是LOL中的经典场景一样,当我想起大学那些有代表性的片段时,往事也如电影一般清晰的刻画在我的心里。

入学

如果对刚入学的我做一个定义的话,应该是有以下元素的。

  • 也许是错误读取了高中入学的参数,copy了高中的光头造型。

  • 饱读诗书和明朝那些事儿后带来的器宇轩昂buff还没退散,还是一个自傲的自命清高的理想主义者。

  • 朝气蓬勃,亦如当年的香港般。

  • programming skill = 0

  • mathematical ability = 80

  • english skill = 50

平凡

人成长的过程,就是认清自己也只是一个普通人的过程。说来惭愧,或者说是残酷,大学最大的收获,也许是认清了自己不是什么天才,也只是一个普通人,需要努力才能有所进步,就算努力也可能毫无收获。

应该是大二到大三那段时间吧,吃完了高中奥赛的红利后,尤其是CS专业课的加入,继续大一吊儿郎当的我开始力不从心,再加上一些Interview的糟糕表现:我一直是对自己interview,presentation特别自信的人,我从不怯场并且喜欢这种感觉。我真切的认识到,就算世上真有那种无需准备便口若悬河的天才,我也不是其中一份子。我也是一个需要时间精力去学习才能进步的人,也是一个需要准备面试问题才能从容应对的人,在我的世上,哪有什么容易。

认清自己后,随之而来的便是长久的挫败感。便如书到用时方恨少一般,面对复杂数学公式时,感慨自己数学一团糟,要求解一个超大矩阵的逆矩阵时,心里叹息着怎么这些矩阵定义都忘了,或者想表示自己的思想时,就好比巧妇难为无米之炊一样,肚子里没墨水没知识体系,只能一直“我觉得”“我觉着”。

朋友

同学有,朋友有,那种玩得很来的死党也有。只是可能大学确实更加接近社会一点,大家不会聊理想梦想之类的话,都是现实的计划。大学四年在香港也没有太多的娱乐休闲,除了大一大二在社团里会一起出去郊游玩耍之外,跟同系的朋友们似乎都只有出去吃饭勉强算作一个娱乐。

不过很幸运的是还是结交到许多一起proj、一起游戏的好友,比如凯灿、博一。

  • 越发越觉得自己的无知,因此不对他人、他物的三观做任何的评断。但是这堪比小时代的剧情,我只能吐槽一句:霍导,真有你的。
  • 七八十年代作品中的爱情很模块化,它们的形成是浪漫的,原因是美好的,两个人的内心也是纯洁而高尚的,对于爱情的描写侧重于所求的“真爱”,就像两片纯洁荷花的结合。同时,爱情的阻碍不是金钱、物质,往往是阶级、职业、思想。时过境迁,如今作品中的爱情再也见不到那时候的模样,也可以说是七八十年代特有的风景。于我而言,两者的爱情标准我都不喜欢,但真要说的话,回到民国、回到封建社会,我也是不喜欢的,我理想中的自由无须有除两人外的限制,只要两人真心相爱并且心灵相通,这便足够了不是么?当代的社会会有人说我何不食肉糜,不懂贫穷的困难。但这就像穆斯林的葬礼里面 韩太太训斥我不是穆斯林不能结婚,不懂穆斯林的信仰一般。没有什么是不能克服的,如果你觉得有,也只是你觉得罢了。
  • 那个年代对成功的定义是个人价值的实现,而现在社会的主流价值观恐怕在当时是避之不及的资本主义倾向吧。成功如何,在时代变迁中居然出现巨大甚至完全相反的变化。
  • 完全理解不了冰玉的所作所为。打着爱情、自由的幌子侵犯他人的权力、过后除了一句“你打吧”便全是埋怨不懂自己,这种行为在我看来和现在许多白莲花政客大同小异。在我看来,你有自己的三观你认为正确可以 ,但是你不能跟着自己的三观做出侵犯他人的行为,这不是成熟,反而是任性。
  • 宏大的宗教背景下许多故事线、人物描写太过唐突,先不说剧情是否狗血,从韩子奇赴英开始完全失控,这本书在我看来真的盛名难负。

隐形守护者

聊聊游戏之外的事

第一次听说这个游戏就特别想玩,不是别的,只是纯粹觉得这个游戏模式很有趣,主题也不是仅限于有点厌俗的儿女情长。

但当一步步玩下去的时候,不仅为了游戏剧情而感动,也为制作组的用心而敬礼。忘了是哪位先生说的话,中国自古不缺少XXX,而缺少XXX。是的呀,呜呼我中华延绵至今,不缺乏投机取巧的人,不缺乏多情自古空余恨的人,不缺乏才华横溢超逸绝伦的人,但真的,太缺少为信仰为理想而奋斗,而生活的人了。

回头政治性的想想,只有这样的作品,才是真正可以做到文化输出的作品,才是可以提现文化自信的作品。虽然有点“狗仗人势”的意味,但我真的很自豪的,因为这样的作品肯定也有程序员的贡献,这也是我当初不假思索选择计算机的原因之一:稍微读了一点经济学的书之后,我也大概明白经济学确实能提高资源的利用效率,自由市场可以双方受益。但我始终还是有着一点来自理工男的偏见和傲慢,我们在做的是技术层面上指数型的做大这块蛋糕。

似乎有点说远了,我想,这是这部作品给我最大的震撼。抛开游戏剧情不说,制作组在如此恶劣环境下顶着压力做出了一个广受好评的游戏,这就是一件可敬之事。再想想自己,惭愧。

关于游戏本身

不太想多记录游戏背后本身的“政治正确”,譬如原作中的银狐其实是共产党内部的矛盾,而非国民党的特务。对我来说,这部作品给我最大的感慨便是,人生不过短短百年,我们真的得摇醒自己互联网时代自我沉浸的思想,花点时间好好想想,何为过好自己的人生。

小顾面对的是职业选择和家国抉择。她很迷茫,她不知道自己的道路。其实我们又何尝不是如此,随波逐流,或是随利逐流。游戏有很多路线,大家可能都喜欢那个圆满的大结局,80年洗白自己身份。但是真的设身处地想想,或是忽然告诉你三个身份,国民党的年轻高层,日本的归国英雄,还是共产党的汉奸农民?其实答案是显而易见的吧,但为什么我们会向往最后一个呢?因为我们在用上帝视角玩一个游戏,我们知道国民党最后会倒台,我有多憋屈,我们知道日本英雄会被人揭穿,最后死在原子弹下,我们知道我们正在80年总会洗白。但可惜的是人生没有上帝视角,我们永远不知道下一块巧克力是什么味道。我们就像温水里的青蛙,慢慢的慢慢的从心中所想的勇士变成了不认识的恶龙。

我真的好担心自己进了国民党线,变成一个油腻的中年人,闭嘴张嘴就是钱女人房子车子孩子。我不想成为一个温水的青蛙,因此我想时刻提醒自己,不要把自己的人生陷在无休止的物欲、竞争中。我们敬佩武藤志雄,因为他不是陷在权位利益中捞油水的人,他是真的有自己的理想并为之奋斗。我们敬佩第二号、敬佩方汉洲,也是为他们这顽固而迷人的儒夫思想。

接触的越多,越明白自己的渺小,无知。因此,我不敢对于这部作品的哲学意义、中心思想做个什么系统总结,我只希望我自己不要为了物欲去行事,而如果是真的内心想做、喜欢做,一定要用心做,努力做,这样才能不负此生。

DNN加速,目前的几个热门方向有:

  • tensor decomposition。将卷积运算中的tensor利用PCA等数学技术 降解成 低维、低rank、稀疏的tensor,从而直接提高计算速度
  • Quantization and Pruning. 将tensor中每个weight,或feature map里所有数值,利用quantization/pruning 提高计算速度。
  • Network structure。$5\times 5 = 3 \times 3 + 3\times 3, 3\times 3 = 3\times 1 + 1\times 1 + 1\times 3$

本篇文章另辟蹊径,直接从input入手,通过在减小input size的基础上 最大化input信息,从而directly的加速运算(对input(图像)的研究是CV方向了,需要对CV研究的比较透彻,也难怪是sensetime参与的)

与其他方法比起来最明显的优势就是可以直接应用到不同的model structure(比如ResNet 到ResNext),而不需要对内部结构有修改。

Introduction

problem

difficult to simultaneously buffer the input feature maps, the output feature maps, and the filter weights in limited internal accelerator memory.

Previous method

use large SRAM buffers (up to a few MBytes may be used). drawback: large amounts of memory are not affordable.

Another point/direction:

  • data reuse , is determined by the dataflow schedule of computatio

    • Previous work: the working set of these innermost loops fits the available internal storage

      drawback: existing models have not been adapted to explicitly application managed buffers, which constitute by far the most common memory architecture template for CNN accelerators, therefore, overestimate internal storage requirements

Contribution of this work:

  • new analytical memory performance model to evaluate dataflow schedules
  • best dataflow schedules
  • applied it on the case study of the design of a flexible CNN accelerator for deeply embedded Systems-on-Chip.

Background

Convolution loop-nest

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// M output fmaps loop
LOF: for (m = 0; m < M; m++)
// C input fmaps loop
LIF: for (c = 0; c < C; c++)
// spatial loops (ExE)
LSY: for (y = 0; y < E; y++)
LSX: for (x = 0; x < E; x++)
// filter loops (RxR, stride S)
LFY: for (k = 0; k < R; k++)
LFX: for (l = 0; l < R; l++)
{
p = I[c][y*S+k][x*S+l];
w = W[m][c][k][l];
O[m][y][x] += p*w;
}

Goal

The problem consists in minimizing the number of memory accesses to the off-accelerator memory given a limited local buffer capacity.

Reuse in convolution

  • Input feature maps
  • Output feature maps
  • Weight

the reuse of a reference is carried by a loop if the same memory location is used by different iterations of that loop

However, unless the entire working set fits the local buffer, this reuse cannot be taken full advantage of.

Reuse buffer

  • Data cache

  • Application-managed scratchpad memories

    partitioning the local reuse buffer in a set of application-managed buffers,

Data Locality Optimization

  • reordring

  • titling

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // output fmaps -- loop on tiles
    LTOF: for (mm = 0; mm < M; mm += mss)
    // input fmaps -- loop on tiles
    LTIF: for (cc = 0; cc < C; cc += css)
    // spatial -- loops on tiles
    LTSY: for (yy = 0; yy < E; yy += iss)
    LTSX: for (xx = 0; xx < E; xx += jss)
    // output fmaps -- tile loop
    LOF: for (m=mm; m<min(mm+mss,M); m++)
    // input fmaps -- tile loop
    LIF: for (c=cc; c<min(cc+css,C); c++)
    // spatial -- tile loops
    LSY: for (y=yy; y<min(yy+iss,E); y++)
    LSX: for (x=xx; x<min(xx+jss,E); x++)
    // kernel -- tile loops
    LFY: for (k=0; k<R; k++)
    LFX: for (l=0; l<R; l++)
    {
    p = I[c][y*S+k][x*S+l];
    w = W[m][c][k][l];
    O[m][y][x] += p*w;
    }

Method

Analytical model for evaluating the dataflow schedules

Distance $d_X(L)$

The number of loop iterations in the loop L , that separates two consecutive accesses to the same data element X

(d次iteration后,再也不会access到这次access的data element)

footprint $F_X(L_i)$

the footprint of array X in loop L measures the number of distinct elements of X used inside L.

1552309141092

n(L) : loop L 的interation数目, L0 代表最里面的inner loop

the actual required size for the application-managed buffer is computed as follows:

1552309773395

memory traffic $T_X$

number of bytes accessed in off-accelerator memory for array X

1552309887178

PX the numerical precision (in bytes) used for its storage.

It should be noticed that i here is actually defined on maximal B(Li) that fits the size of buffer

个人也是初学根本就不了解谓词是什么意思,通过下面的例子大家自己体会吧。

 

下面程序演示了count_if();

该程序创建一个包含数字1-19的矢量,然后统计能够被3整除的元素个数。

为了达到这个目的,程序首先创建了一个称为dividesby3()的一元谓词,如果谓词的参数能够被3整除,该谓词返回ture

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

bool dividesby3(int i)
{
if((i%3)==0)return true;
return false;
}

int main()
{
vector<int> v;
int i;
for(i=0;i<20;i++)v.push_back(i);
cout << "Sequence:/n";
for(i=0;i<v.size();i++)cout << v[i] <<" ";
cout << endl;
i=cout_if(v.begin(),v.end(),dividesby3);//谓词就在这里被用到了
cout << i <<" numbers are divisible by 3./n";
return 0;
}

NVIDIA VISUAL PROFILER

linux端路径:

./PATH_OF_CUDA/libnvvp/nvvp

1
./nvvp

also, when you create a NVVP project with name *.nvvp , you can simply run it by

1
nvvp *.nvvp

windows*端:

  • open visual profiler directly
  • new session
  • select the .exe file of your CUDA file