变态家族

新家是biantaishabi.com/blog

2006年05月


以前身边有图书馆的时候根本就没有想过超星, 但是现在的图书馆里面没有中文书, 总是不那么方便。  于是想到了超星图书馆, 很便宜, 我买了一个两年的卡, 一百八十块钱。在日本随便买一本不太厚的英文书(他们称之为洋书,与和书相对应) 都要比这个能看两年的卡贵。 而且网上用信用卡交费三十秒就搞定可以看书了。 主要想读一些经典的教材, 里面这类东西收的确实很全。 这两天要找的书 都能在上面找到, 还是挺不错的。 一个月可以打印壹千页, 我觉得看是怎么也看不完这个配额的。

Bug是不支持ie7, 需要将其卸载, 再重新装ie6。

想到了上次看的 NY Times 上的Scan This Book, 说到虽然美国人有强大精细的机器来OCR, 但是google在斯坦福扫描一本书比起超星, 书生之家在中国扫描一本书还是要贵多了。 东方红, 太阳升, 中国出了个Super Star…… 支持中文数字图书馆!



以前身边有图书馆的时候根本就没有想过超星, 但是现在的图书馆里面没有中文书, 总是不那么方便。  于是想到了超星图书馆, 很便宜, 我买了一个两年的卡, 一百八十块钱。在日本随便买一本不太厚的英文书(他们称之为洋书,与和书相对应) 都要比这个能看两年的卡贵。 而且网上用信用卡交费三十秒就搞定可以看书了。 主要想找一些经典的教材的翻译, 里面这类东西收的确实很全。 这两天要找的书 都能在上面找到, 还是挺不错的。 一个月可以打印壹千页, 我觉得看是怎么也看不完这个配额的。

Bug是不支持ie7, 需要将其卸载, 再重新装ie6。

想到了上次看的 NY Times 上的Scan This Book, 说到虽然美国人有强大精细的机器来OCR, 但是google在斯坦福扫描一本书比起超星, 书生之家在中国扫描一本书还是要贵多了。 东方红, 太阳升, 中国出了个Super Star…… 支持中文数字图书馆!



为了完成羞涩教授猛哥的将Multigrid算法的速度发挥到极致的目标, 顺着这些专门研究利用cache数据的德国人们(DiME)的脚步, 作了一些笔记。 虽然自己不姓后藤……


什么是内存壁垒(Memory Wall) ?

用70年代后期的Multigrid方法解决泊松问题, 一个未知数需要三十个操作, 对于更一般的椭圆方程问题, 一个未知需要一百个左右的操作, 对于一个现在的CPU,一秒钟可以有1Gflop, 如果一切完美, 只考虑CPU频率, 我们可以在一秒钟内解决1000万个未知, 需要O(100)Mbyte的内存。 但是实际上只要多于一万到十万个未知, 你的代码就会崩溃, 需要一个小时左右, 需要不可计数的内存。 问题不在于处理数据, 而在于转移数据。  访问数据有两个指标, 延迟和带宽。 延迟--读写内存的时间太长, CPU内的数据访问需要0.5ns, 而内存需要50ns。 带宽--每秒可以读写的byte数, 对于1GFLOP的CPU需要24Gbyte/秒的带宽。 而现在CPU所拥有的峰值带宽是5Gbyte/s, 而实际应用上远远达不到这个数字。 解决的办法除了可以提高带宽无法提高延迟的Interleaving以外, 就是两方面都可以提高的cache, 通常现在会有两到三层的cache, 但是只有在数据在本地的cache的时候才能用。 载入cache的原则有根据时间的还有根据空间的, 每次载入的是一个cache line, 通常是32-128byte, 现在最长时1kbyte。  这里需要了解的是替换的策略, 关联, cache line的大小, hit ratio和miss ratio的概念。 这是一些现在电脑的cache数据。

• IBM Power 3:
    • L1 = 64 KB, 128-way set associative
     L2 = 4 MB, direct mapped, line size = 128, write back
• Compaq EV6 (Alpha 21264):
    • L1 = 64 KB, 2-way associative, line size= 32
    • L2 = 4 MB (or larger), direct mapped, line size = 64
• HP PA: no L2
    • PA8500, PA8600: L1 = 1.5 MB, PA8700: L1 = 2.25 MB
• AMD Athlon: L1 = 64 KB, L2 = 256 KB
• Intel Pentium 4: L1 = 8 KB, L2 = 256 KB
• Intel Itanium:
    • L1 = 16 KB, 4-way associative
    • L2 = 96 KB
        6-way associative, L3 = off chip, size varies


让程序更快的原则
  • 选择最好的算法。这是废话, 不过意思是告诉你, 破算法没有什么优化的价值。
  • 使用效率高的库。
  • 使好合适的编译器选项。
-on
-fast
-unroll
-arch
   阅读编译器的man,w ww.specbench.org特定平台的选项, 试验和比较
  • 使用合适的数据布局。    按顺序访问数据。例子:访问三个向量 double a[n],b[n],c[n]。 这样的效率通常更高 doubel abc[n][3]


评估
  • 子程序水平的评估: 编译器在开始和结束的时候插入timing calls, 粗略的评估, 评估的代价高。
  • 时钟水平的评估: 定时的执行OS的中断指令, 监视代码的存放位置, 更详细的评估, 代价仍然很高。
  • 基于硬件的评估: 最流行的方法。
  •  Data cache misses (for different levels)
  •  Instruction cache misses
  •  TLB misses
  •  Branch mispredictions
  •  Floating-point and/or integer operations
  •  Load/store instructions
  •  Etc.  
工具
PCL =Performance Counter Library, 跨平台,在代码内或代码外使用。
PAPI =Peformance API,跨平台, 高级和低级的接口。
DCPI :基于Alpha的Compaq Tru64 Unix

例子: 代码外
 PCL Hardware performance monitor: hpm
% hpm –-events PCL_CYCLES, PCL_MFLOPS ./mg
hpm: elapsed time: 5.172 s
hpm: counter 0 : 2564941490 PCL_CYCLES
hpm: counter 1 : 19.635955 PCL_MFLOPS

或者是代码内 ……

可见要查看cache的miss ratio, 就必须要用第三种方法了。


浮点数计算的优化
  • Loop unrolling
  • Fused Multiply-Add (FMA) instructions
  • Exposing instruction-level parallelism (ILP)
  • Software pipelining (again: exploit ILP)
  • Aliasing
  • Special functions
  • Eliminating overheads
• if statements
• Loop overhead
• Subroutine calling overhead

Loop unrolling
更少的判断/跳转指令, (loop更大, 代价就越小)
更少的load指令

--让loop更大,比如i:n步进为1的循环,改成i:n步进为4的循环。
--flop-to-load-ration
--重命名, Fortran不允许, c可以。 F更快。c可以使用编译选项 -noalias或c的关键字restrict
--特别的函数,比如除, 开根号, 指数,对数, 三角运算代价更高, 会用掉几个周期。
--避免在最内层的循环使用if, 但是不存在这样的技术。 不要在判断时用到上面说的那些代价高的函数。
--循环的代价:cpu需要释放一定的寄存器, 比如说循环寄存器,地址寄存器来开始循环, 所以短的循环相对代价更高。 如果n>m, 这样的循环
    do i=1,n
    do j=1,m
    就没有下面这个循环有效率
    do i=1,m
    do j=1,n
-- call子函数的代价。子函数对程序的良好结构很重要, 但是呼叫的代价很高, 大概是100个cycles。 传递值参数需要复制数据, 如果使用不当代价会非常高。 但是使用指针可能会不安全, 可以在使用时用const的声明。 通常, 在很小的循环中, 不应该呼叫子函数。 在c中使用incline声明, 使用宏。



针对内存的数据布局优化

stride-1内存访问
用合并数组的方式创造基于cache优化的数据结构。
数组填充(padding)
   
4*3数组A[i][j]
内存地址
8 A[][] A[][] A[][] A[][]
4 A[][] A[][] A[][] A[][]
0 A[][] A[][] A[][] A[][]
stride-1(一步数组访问):数组变换, 和上面的循环优化一样, 一般由编译器完成。 重用cache line的内容。 ?

cache-aware的数据结构:将需要的数据放在一起, 提高数据在内存空间的集中性, 将其写到一个struct中

数组填充:建立比需要更大的数组, 改变相对的内存距离, 避免严重的cache匹配失败问题。 例如将(FORTRAN中以列为顺序)double precision u(1024, 1024)改为double precision u(1024+pad, 1024)
如何padding
C-W Tseng(UMD) 数组内的intra-variable pad和数组间的inter-variable pad.
cache 的映射规则有直接映射, 部分关联映射和全关联映射, 对于前两者, 两块不同的内存位置是可能会竞争同一块cache行的。 从而会引起匹配cache失败。 通过在数组之间或者数组里面增加pad, 可以让竞争的内存分配到cache中不同的地方。 但是, 这个padding的计算是非常困难的。



数据访问的优化。
loop unrolling
loop interchange
loop fusion
loop split
loop skewing
loop blocking

循环合并:将几个循环合并为一个,减少cache miss, 增加了时间上的集中性。 当数据集合被重复使用的时候可以使用, 比如说叠代运算。
do i= 1,N
    a(i)= a(i)+b(i)
enddo
do i= 1,N
    a(i)= a(i)*c(i)
enddo
do i= 1,N
    a(i)= (a(i)+b(i))*c(i)
enddo
改为
a(i)= a(i)+b(i)
    do i= 1,N
a(i)= (a(i)+b(i))*c(i)
a就从load到cache两次变为load到cache一次。

例子:红黑GS叠代
传统的方法--先松弛全部的红点, 再松弛全部的黑点。

但 是实际上只要黑点上面一行的红点更新后, 更新这个黑点所需要的四个红点就都已经都更新了, 所以可以在更新上密集按那一行红点的同时 , 更新黑点。 这样比传统的方法将矩阵两次载入cache变为之需要一次! 当然, 第一行的红点和倒数第二行的黑点需要特殊的处理。 可以看到这个gif图片上的动态显示, 点外围的圈数代表松弛的次数。


















循环分割
: 循环合并的逆操作。 提升编译器的优化, 提升指令cache的利用率。 (尽量的利用一次移入cache的数据集合)

分块循环(loop blocking, loop tiling): 将数据集合分割成适合cache尺寸大小的小块子集。 在转移到下一块数据子集的时候尽可能的进行更多的运算。 因为数据的相互依赖关系的存在, 这有时并不是那么容易实现。

应用一维分块技术后的代码
B 是GS叠代分的块数
for it= 1 to numIter/B do
// Special handling: rows 1, …, 2B-1
// Not shown here …
    // Inner part of the 2D grid
    for k= 2*B to n- 1 do
        for i= k to k- 2*B+1 by –2 do
            for j= 1+(k+1)%2 to n- 1 by 2 do
                relax(u(j,i))
                relax(u(j,i- 1))
            end for
        end for
    end for
// Special handling: rows n-2B+1, …, n-1
// Not shown here …
end for

数据被B次载入cache, 如果2*B+2正好合适cache的大小。
数据如果过大, 可以采用2D的分块。 或者更复杂的分块。




介绍了根据cache优化的Multigrid方法的一个包, DiMEPACK。 用的是C++的接口, F77的子程序, 接下来看看这个包。

有些事情其实本应该是编译器去做的, 但是编译器做得还没有那么好, 自己写的时候注意一下, 考虑到内部的结构, 就可以很方便的提高速度。






为了完成羞涩教授猛哥的将Multigrid算法的速度发挥到极致的目标, 顺着这些专门研究利用cache数据的德国人们(DiME)的脚步, 作了一些笔记, 虽然自己不姓后藤…… 中文毕竟比英文好看一些, 要我看我也愿意看中文的。


什么是内存壁垒(Memory Wall) ?

用70年代后期的Multigrid方法解决泊松问题, 一个未知数需要三十个操作, 对于更一般的椭圆方程问题, 一个未知需要一百个左右的操作, 对于一个现在的CPU,一秒钟可以有1Gflop, 如果一切完美, 只考虑CPU频率, 我们可以在一秒钟内解决1000万个未知, 需要O(100)Mbyte的内存。 但是实际上只要多于一万到十万个未知, 你的代码就会崩溃, 需要一个小时左右, 需要不可计数的内存。

问题不在于处理数据, 而在于转移数据。  访问数据有两个指标, 延迟和带宽。 延迟--读写内存的时间太长, CPU内的数据访问需要0.5ns, 而内存需要50ns。 带宽--每秒可以读写的byte数, 对于1GFLOP的CPU需要24Gbyte/秒的带宽。 而现在CPU所拥有的峰值带宽是5Gbyte/s, 而实际应用上远远达不到这个数字。 解决的办法除了可以提高带宽无法提高延迟的Interleaving以外, 就是两方面都可以提高的cache, 通常现在会有两到三层的cache, 但是只有在数据在本地的cache的时候才能用。 载入cache的原则有根据时间的还有根据空间的, 每次载入的是一个cache line, 通常是32-128byte, 现在最长时1kbyte。  这里需要了解的是替换的策略, 关联, cache line的大小, hit ratio和miss ratio的概念。 这是一些现在电脑的cache数据。

IBM Power 3:
    • L1 = 64 KB, 128-way set associative
     L2 = 4 MB, direct mapped, line size = 128, write back
Compaq EV6 (Alpha 21264):
    • L1 = 64 KB, 2-way associative, line size= 32
    • L2 = 4 MB (or larger), direct mapped, line size = 64
HP PA: no L2
    • PA8500, PA8600: L1 = 1.5 MB, PA8700: L1 = 2.25 MB
AMD Athlon: L1 = 64 KB, L2 = 256 KB
Intel Pentium 4: L1 = 8 KB, L2 = 256 KB
Intel Itanium:
    • L1 = 16 KB, 4-way associative
    • L2 = 96 KB
        6-way associative, L3 = off chip, size varies


让程序更快的原则
  • 选择最好的算法这是废话, 不过意思是告诉你, 破算法没有什么优化的价值。要优化就要优化MG这样优秀的算法。 
  • 使用效率高的库
  • 使好合适的编译器选项
-on
-fast
-unroll
-arch
   阅读编译器的man,w ww.specbench.org特定平台的选项, 试验和比较
  • 使用合适的数据布局    按顺序访问数据。例子:访问三个向量 double a[n],b[n],c[n]。 这样的效率通常更高 doubel abc[n][3]


评估
  • 子程序水平的评估: 编译器在开始和结束的时候插入timing calls, 粗略的评估, 评估的代价高。
  • 时钟水平的评估: 定时的执行OS的中断指令, 监视代码的存放位置, 更详细的评估, 代价仍然很高。
  • 基于硬件的评估: 最流行的方法。
  •  Data cache misses (for different levels)
  •  Instruction cache misses
  •  TLB misses
  •  Branch mispredictions
  •  Floating-point and/or integer operations
  •  Load/store instructions
  •  Etc.  
工具
PCL =Performance Counter Library, 跨平台,在代码内或代码外使用。
PAPI =Peformance API,跨平台, 高级和低级的接口。
DCPI :基于Alpha的Compaq Tru64 Unix

例子: 代码外
 PCL Hardware performance monitor: hpm
% hpm –-events PCL_CYCLES, PCL_MFLOPS ./mg
hpm: elapsed time: 5.172 s
hpm: counter 0 : 2564941490 PCL_CYCLES
hpm: counter 1 : 19.635955 PCL_MFLOPS

或者是代码内 ……

可见要查看cache的miss ratio, 就必须要用第三种方法了。


浮点数计算的优化
  • Loop unrolling
  • Fused Multiply-Add (FMA) instructions
  • Exposing instruction-level parallelism (ILP)
  • Software pipelining (again: exploit ILP)
  • Aliasing
  • Special functions
  • Eliminating overheads
• if statements
• Loop overhead
• Subroutine calling overhead

Loop unrolling
更少的判断/跳转指令, (loop更大, 代价就越小)
更少的load指令

--让loop更大,比如i:n步进为1的循环,改成i:n步进为4的循环。
--flop-to-load-ration
--重命名, Fortran不允许, c可以。 F更快。c可以使用编译选项 -noalias或c的关键字restrict
--特别的函数,比如除, 开根号, 指数,对数, 三角运算代价更高, 会用掉几个周期。
--避免在最内层的循环使用if, 但是不存在这样的技术。 不要在判断时用到上面说的那些代价高的函数。
--循环的代价:cpu需要释放一定的寄存器, 比如说循环寄存器,地址寄存器来开始循环, 所以短的循环相对代价更高。 如果n>m, 这样的循环
    do i=1,n
    do j=1,m
    就没有下面这个循环有效率
    do i=1,m
    do j=1,n
-- call子函数的代价。子函数对程序的良好结构很重要, 但是呼叫的代价很高, 大概是100个cycles。 传递值参数需要复制数据, 如果使用不当代价会非常高。 但是使用指针可能会不安全, 可以在使用时用const的声明。 通常, 在很小的循环中, 不应该呼叫子函数。 在c中使用incline声明, 使用宏。



针对内存的数据布局优化

stride-1内存访问
用合并数组的方式创造基于cache优化的数据结构。
数组填充(padding)
   
4*3数组A[i][j]
内存地址
8 A[][] A[][] A[][] A[][]
4 A[][] A[][] A[][] A[][]
0 A[][] A[][] A[][] A[][]
stride-1(一步数组访问):数组变换, 和上面的循环优化一样, 一般由编译器完成。 重用cache line的内容。

cache-aware的数据结构
将需要的数据放在一起, 提高数据在内存空间的集中性, 将其写到一个struct中

数组填充
建立比需要更大的数组, 改变相对的内存距离, 避免严重的cache匹配失败问题。 例如将(FORTRAN中以列为顺序)double precision u(1024, 1024)改为double precision u(1024+pad, 1024)
如何padding
C-W Tseng(UMD) 数组内的intra-variable pad和数组间的inter-variable pad.
cache 的映射规则有直接映射, 部分关联映射和全关联映射, 对于前两者, 两块不同的内存位置是可能会竞争同一块cache行的。 从而会引起匹配cache失败。 通过在数组之间或者数组里面增加pad, 可以让竞争的内存分配到cache中不同的地方。 但是, 这个padding的计算是非常困难的。



数据访问的优化。
-loop unrolling
-loop interchange
-loop fusion
-loop split
-loop skewing
-loop blocking

循环合并:将几个循环合并为一个,减少cache miss, 增加了时间上的集中性。 当数据集合被重复使用的时候可以使用, 比如说叠代运算。
do i= 1,N
    a(i)= a(i)+b(i)
enddo
do i= 1,N
    a(i)= a(i)*c(i)
enddo
do i= 1,N
    a(i)= (a(i)+b(i))*c(i)
enddo
改为
a(i)= a(i)+b(i)
    do i= 1,N
a(i)= (a(i)+b(i))*c(i)
a就从load到cache两次变为load到cache一次。

例子:红黑GS叠代
传统的方法--先松弛全部的红点, 再松弛全部的黑点。

但 是实际上只要黑点上面一行的红点更新后, 更新这个黑点所需要的四个红点就都已经都更新了, 所以可以在更新上密集按那一行红点的同时 , 更新黑点。 这样比传统的方法将矩阵两次载入cache变为之需要一次! 当然, 第一行的红点和倒数第二行的黑点需要特殊的处理。 可以看到这个gif图片上的动态显示, 点外围的圈数代表松弛的次数。


















循环分割
: 循环合并的逆操作。 提升编译器的优化, 提升指令cache的利用率。 (尽量的利用一次移入cache的数据集合)

分块循环(loop blocking, loop tiling): 将数据集合分割成适合cache尺寸大小的小块子集。 在转移到下一块数据子集的时候尽可能的进行更多的运算。 因为数据的相互依赖关系的存在, 这有时并不是那么容易实现。

应用一维分块技术后的代码
B 是GS叠代分的块数
for it= 1 to numIter/B do
// Special handling: rows 1, …, 2B-1
// Not shown here …
    // Inner part of the 2D grid
    for k= 2*B to n- 1 do
        for i= k to k- 2*B+1 by –2 do
            for j= 1+(k+1)%2 to n- 1 by 2 do
                relax(u(j,i))
                relax(u(j,i- 1))
            end for
        end for
    end for
// Special handling: rows n-2B+1, …, n-1
// Not shown here …
end for

数据被B次载入cache, 如果2*B+2正好合适cache的大小。
数据如果过大, 可以采用2D的分块。 或者更复杂的分块。




介绍了根据cache优化的Multigrid方法的一个包, DiMEPACK。 用的是C++的接口, F77的子程序, 接下来看看这个包。 不过里面子程序用FORTRAN写的, 用M4宏处理器, 有大量的宏, 跟以前看的程序还不一样。

有些事情其实本应该是编译器去做的, 但是编译器做得还没有那么好, 自己写的时候注意一下, 考虑到内部的结构, 就可以很方便的提高速度。






为了完成羞涩教授猛哥的将Multigrid算法的速度发挥到极致的目标, 顺着这些专门研究利用cache数据的德国人们(DiME)的脚步, 作了一些笔记, 虽然自己不姓后藤…… 中文毕竟比英文好看一些, 要我看我也愿意看中文的。


什么是内存壁垒(Memory Wall) ?

用70年代后期的Multigrid方法解决泊松问题, 一个未知数需要三十个操作, 对于更一般的椭圆方程问题, 一个未知需要一百个左右的操作, 对于一个现在的CPU,一秒钟可以有1Gflop, 如果一切完美, 只考虑CPU频率, 我们可以在一秒钟内解决1000万个未知, 需要O(100)Mbyte的内存。 但是实际上只要多于一万到十万个未知, 你的代码就会崩溃, 需要一个小时左右, 需要不可计数的内存。

问题不在于处理数据, 而在于转移数据。  访问数据有两个指标, 延迟和带宽。 延迟--读写内存的时间太长, CPU内的数据访问需要0.5ns, 而内存需要50ns。 带宽--每秒可以读写的byte数, 对于1GFLOP的CPU需要24Gbyte/秒的带宽。 而现在CPU所拥有的峰值带宽是5Gbyte/s, 而实际应用上远远达不到这个数字。 解决的办法除了可以提高带宽无法提高延迟的Interleaving以外, 就是两方面都可以提高的cache, 通常现在会有两到三层的cache, 但是只有在数据在本地的cache的时候才能用。 载入cache的原则有根据时间的还有根据空间的, 每次载入的是一个cache line, 通常是32-128byte, 现在最长时1kbyte。  这里需要了解的是替换的策略, 关联, cache line的大小, hit ratio和miss ratio的概念。 这是一些现在电脑的cache数据。

IBM Power 3:
    • L1 = 64 KB, 128-way set associative
     L2 = 4 MB, direct mapped, line size = 128, write back
Compaq EV6 (Alpha 21264):
    • L1 = 64 KB, 2-way associative, line size= 32
    • L2 = 4 MB (or larger), direct mapped, line size = 64
HP PA: no L2
    • PA8500, PA8600: L1 = 1.5 MB, PA8700: L1 = 2.25 MB
AMD Athlon: L1 = 64 KB, L2 = 256 KB
Intel Pentium 4: L1 = 8 KB, L2 = 256 KB
Intel Itanium:
    • L1 = 16 KB, 4-way associative
    • L2 = 96 KB
        6-way associative, L3 = off chip, size varies


让程序更快的原则
  • 选择最好的算法这是废话, 不过意思是告诉你, 破算法没有什么优化的价值。要优化就要优化MG这样优秀的算法。 
  • 使用效率高的库
  • 使好合适的编译器选项
-on
-fast
-unroll
-arch
   阅读编译器的man,w ww.specbench.org特定平台的选项, 试验和比较
  • 使用合适的数据布局    按顺序访问数据。例子:访问三个向量 double a[n],b[n],c[n]。 这样的效率通常更高 doubel abc[n][3]


评估
  • 子程序水平的评估: 编译器在开始和结束的时候插入timing calls, 粗略的评估, 评估的代价高。
  • 时钟水平的评估: 定时的执行OS的中断指令, 监视代码的存放位置, 更详细的评估, 代价仍然很高。
  • 基于硬件的评估: 最流行的方法。
  •  Data cache misses (for different levels)
  •  Instruction cache misses
  •  TLB misses
  •  Branch mispredictions
  •  Floating-point and/or integer operations
  •  Load/store instructions
  •  Etc.  
工具
PCL =Performance Counter Library, 跨平台,在代码内或代码外使用。
PAPI =Peformance API,跨平台, 高级和低级的接口。
DCPI :基于Alpha的Compaq Tru64 Unix

例子: 代码外
 PCL Hardware performance monitor: hpm
% hpm –-events PCL_CYCLES, PCL_MFLOPS ./mg
hpm: elapsed time: 5.172 s
hpm: counter 0 : 2564941490 PCL_CYCLES
hpm: counter 1 : 19.635955 PCL_MFLOPS

或者是代码内 ……

可见要查看cache的miss ratio, 就必须要用第三种方法了。


浮点数计算的优化
  • Loop unrolling
  • Fused Multiply-Add (FMA) instructions
  • Exposing instruction-level parallelism (ILP)
  • Software pipelining (again: exploit ILP)
  • Aliasing
  • Special functions
  • Eliminating overheads
• if statements
• Loop overhead
• Subroutine calling overhead

Loop unrolling
更少的判断/跳转指令, (loop更大, 代价就越小)
更少的load指令

--让loop更大,比如i:n步进为1的循环,改成i:n步进为4的循环。
--flop-to-load-ration
--重命名, Fortran不允许, c可以。 F更快。c可以使用编译选项 -noalias或c的关键字restrict
--特别的函数,比如除, 开根号, 指数,对数, 三角运算代价更高, 会用掉几个周期。
--避免在最内层的循环使用if, 但是不存在这样的技术。 不要在判断时用到上面说的那些代价高的函数。
--循环的代价:cpu需要释放一定的寄存器, 比如说循环寄存器,地址寄存器来开始循环, 所以短的循环相对代价更高。 如果n>m, 这样的循环
    do i=1,n
    do j=1,m
    就没有下面这个循环有效率
    do i=1,m
    do j=1,n
-- call子函数的代价。子函数对程序的良好结构很重要, 但是呼叫的代价很高, 大概是100个cycles。 传递值参数需要复制数据, 如果使用不当代价会非常高。 但是使用指针可能会不安全, 可以在使用时用const的声明。 通常, 在很小的循环中, 不应该呼叫子函数。 在c中使用incline声明, 使用宏。



针对内存的数据布局优化

stride-1内存访问
用合并数组的方式创造基于cache优化的数据结构。
数组填充(padding)
   
4*3数组A[i][j]
内存地址
8 A[][] A[][] A[][] A[][]
4 A[][] A[][] A[][] A[][]
0 A[][] A[][] A[][] A[][]
stride-1(一步数组访问):数组变换, 和上面的循环优化一样, 一般由编译器完成。 重用cache line的内容。

cache-aware的数据结构
将需要的数据放在一起, 提高数据在内存空间的集中性, 将其写到一个struct中

数组填充
建立比需要更大的数组, 改变相对的内存距离, 避免严重的cache匹配失败问题。 例如将(FORTRAN中以列为顺序)double precision u(1024, 1024)改为double precision u(1024+pad, 1024)
如何padding
C-W Tseng(UMD) 数组内的intra-variable pad和数组间的inter-variable pad.
cache 的映射规则有直接映射, 部分关联映射和全关联映射, 对于前两者, 两块不同的内存位置是可能会竞争同一块cache行的。 从而会引起匹配cache失败。 通过在数组之间或者数组里面增加pad, 可以让竞争的内存分配到cache中不同的地方。 但是, 这个padding的计算是非常困难的。



数据访问的优化。
-loop unrolling
-loop interchange
-loop fusion
-loop split
-loop skewing
-loop blocking

循环合并:将几个循环合并为一个,减少cache miss, 增加了时间上的集中性。 当数据集合被重复使用的时候可以使用, 比如说叠代运算。
do i= 1,N
    a(i)= a(i)+b(i)
enddo
do i= 1,N
    a(i)= a(i)*c(i)
enddo
do i= 1,N
    a(i)= (a(i)+b(i))*c(i)
enddo
改为
a(i)= a(i)+b(i)
    do i= 1,N
a(i)= (a(i)+b(i))*c(i)
a就从load到cache两次变为load到cache一次。

例子:红黑GS叠代
传统的方法--先松弛全部的红点, 再松弛全部的黑点。

但 是实际上只要黑点上面一行的红点更新后, 更新这个黑点所需要的四个红点就都已经都更新了, 所以可以在更新上密集按那一行红点的同时 , 更新黑点。 这样比传统的方法将矩阵两次载入cache变为之需要一次! 当然, 第一行的红点和倒数第二行的黑点需要特殊的处理。 可以看到这个gif图片上的动态显示, 点外围的圈数代表松弛的次数。


















循环分割
: 循环合并的逆操作。 提升编译器的优化, 提升指令cache的利用率。 (尽量的利用一次移入cache的数据集合)

分块循环(loop blocking, loop tiling): 将数据集合分割成适合cache尺寸大小的小块子集。 在转移到下一块数据子集的时候尽可能的进行更多的运算。 因为数据的相互依赖关系的存在, 这有时并不是那么容易实现。

应用一维分块技术后的代码
B 是GS叠代分的块数
for it= 1 to numIter/B do
// Special handling: rows 1, …, 2B-1
// Not shown here …
// Inner part of the 2D grid
for k= 2*B to n- 1 do
for i= k to k- 2*B+1 by ?2 do
for j= 1+(k+1)%2 to n- 1 by 2 do
relax(u(j,i))
relax(u(j,i- 1))
end for
end for
end for
// Special handling: rows n-2B+1, …, n-1
// Not shown here …
end for

数据被B次载入cache, 如果2*B+2正好合适cache的大小。
数据如果过大, 可以采用2D的分块。 或者更复杂的分块。




介绍了根据cache优化的Multigrid方法的一个包, DiMEPACK。 用的是C++的接口, F77的子程序, 接下来看看这个包。 不过里面子程序用FORTRAN写的, 用M4宏处理器, 有大量的宏, 跟以前看的程序还不一样。

有些事情其实本应该是编译器去做的, 但是编译器做得还没有那么好, 自己写的时候注意一下, 考虑到内部的结构, 就可以很方便的提高速度。






想不到巴士阿叔wikipedia词条都这么长了, 还随时根据外界的反应更新, 像带了八块表一样与时俱进。



其实都是听别人说的。 这个礼拜六例行一周四次的篮球的时候, 来了一个现在在福冈上班的校友一起玩, 晚上在研究室又遇到了, 就几个人一块聊了聊他现在的工作. 说了说中国人在日本公司工作的事情.

新人培训.
据 说每个人有一个导师, 实际上就是先进公司, 有了四五年工作经验的员工. 事无巨细的指导新人的成长, 有了什么问题都可以问, 导师都会巨热情的指导. 这也是他的工作的一部分, 为了这个, 公司还会额外付导师费.  公司都把新生当白痴培训, 一个一位的运算器设计都要给新人两个月时间. 而且导师每天还过来问, 有没有什么问题, 哪里不懂等等. 现在每天烦恼的事情就是怎么把这个工作很好的分配在两个月的时间里.  不过据他说, 经过这样的培训, 这个公司里面有几年工作经验的都是很厉害的. 这也许是将新生当成白痴培训的可取之处?

公司的女人们.
据 说非常少, 质量也不高. 唯一看上了一个, 这个少女杀手当时犹豫了一下. 结果过几天他的tutor就告诉他, 那个女人要和tutor结婚了, 而他还没有看到过这两个人在公司里面说过一句话.....当时唯一的感觉是庆幸自己当时还是犹豫了一下, 不过确实记得他们两个人是从没有讲过话的呀.

Team building.
场 所只有一个, 那就是居酒屋。 当然, 二次会三次会就会有各种不同的乱七八糟的地方了。 他们好像把这个看成联络感情的唯一方法。 还特别喜欢, 有的日本人就几乎每天下班就召集同事去喝酒。 费用是非常之可观的, 公司里面组织的话, 会控制在五千, 自己组织的, 就基本是壹万左右。 对于一个月收只有20多万的新人来说, 这样经常出去喝酒, 是会喝出赤字来的,  但是他们公司有的日本人就是借钱也要出去喝…… 要感情好就要喝到烂醉, 倒在地上回不了家就最好了, 有点东北人的感觉。 这位被搞怕了, 就拒绝了几次邀请, 后来日本人也就不再邀他了。 只有忘年会, 新年会的时候大家聚聚, 不过对于这个结果还是颇为满意的。 想到了寒假去札幌的时候, 和reika老爸喝酒的时候 , 就遇到一帮日本人从八点喝到十二点还不回家。 和他们也一起喝了几杯, 他们说就是不想回家, 想要和同事在一起, 每天喝酒, 这样才好玩。 不过那帮人年级比较大,估计已经不会借钱喝酒了。 不知道Bryan是不是也很能喝酒?

报告阿文书
这 个据说最烦人, 每天有无数的文书报告。 新人每天要写自己干了什么, 学习要写自己学了什么, 还有什么地方不懂, 懂了的地方还要说明为什么懂了云云。 还有格式很规范的信等等, 各种敬语都不会就比较麻烦, 这个时候如果tutor比较好, 而且你没有去追他未婚妻, 就可能会很热心的教各种书面敬语了。 我记得我好像受到过这样的信, 是银行寄给客户的,敬语看到我就根本不明白他们到底是不是说人话。

上网
网是可以联上internet, 但是这个公司的政策是不能上网。 说是全靠自觉, 但是如果上网过多, 肯定是会有人来教育你的。 想到了R同学现在在中国的一个日本公司上班, 还是能上网的,但是不能用IM。 于是大家都用gmail网页里的gtalk聊。

颇为可怕的日本公司……



其实都是听别人说的。 这个礼拜六进行膝伤恢复以后的让我的生活质量得到了本质提高的例行一周四次的篮球的时候, 来了一个现在在福冈上班的校友一起玩, 晚上在研究室又遇到了, 就几个人一块聊了聊他现在的工作. 说了说中国人在日本公司工作的事情.

新人培训.
据 说每个人有一个导师, 实际上就是先进公司, 有了四五年工作经验的员工. 事无巨细的指导新人的成长, 有了什么问题都可以问, 导师都会巨热情的指导. 这也是他的工作的一部分, 为了这个, 公司还会额外付导师费.  公司都把新生当白痴培训, 一个一位的运算器设计都要给新人两个月时间. 而且导师每天还过来问, 有没有什么问题, 哪里不懂等等. 现在每天烦恼的事情就是怎么把这个工作很好的分配在两个月的时间里.  不过据他说, 经过这样的培训, 这个公司里面有几年工作经验的都是很厉害的. 这也许是将新生当成白痴培训的可取之处?

公司的女人们.
据 说非常少, 质量也不高. 唯一看上了一个, 这个少女杀手当时犹豫了一下. 结果过几天他的tutor就告诉他, 那个女人要和tutor结婚了, 而他还没有看到过这两个人在公司里面说过一句话.....当时唯一的感觉是庆幸自己当时还是犹豫了一下, 不过确实记得他们两个人是从没有讲过话的呀.

Team building.
场 所只有一个, 那就是居酒屋。 当然, 二次会三次会就会有各种不同的乱七八糟的地方了。 他们好像把这个看成联络感情的唯一方法。 还特别喜欢, 有的日本人就几乎每天下班就召集同事去喝酒。 费用是非常之可观的, 公司里面组织的话, 会控制在五千, 自己组织的, 就基本是壹万左右。 对于一个月收只有20多万的新人来说, 这样经常出去喝酒, 是会喝出赤字来的,  但是他们公司有的日本人就是借钱也要出去喝…… 要感情好就要喝到烂醉, 倒在地上回不了家就最好了, 有点东北人的感觉。 这位被搞怕了, 就拒绝了几次邀请, 后来日本人也就不再邀他了。 只有忘年会, 新年会的时候大家聚聚, 不过对于这个结果还是颇为满意的。 想到了寒假去札幌的时候, 和reika老爸喝酒的时候 , 就遇到一帮日本人从八点喝到十二点还不回家。 和他们也一起喝了几杯, 他们说就是不想回家, 想要和同事在一起, 每天喝酒, 这样才好玩。 不过那帮人年级比较大,估计已经不会借钱喝酒了。 不知道Bryan是不是也很能喝酒?

报告阿文书
这 个据说最烦人, 每天有无数的文书报告。 新人每天要写自己干了什么, 学习要写自己学了什么, 还有什么地方不懂, 懂了的地方还要说明为什么懂了云云。 还有格式很规范的信等等, 各种敬语都不会就比较麻烦, 这个时候如果tutor比较好, 而且你没有去追他未婚妻, 就可能会很热心的教各种书面敬语了。 我记得我好像受到过这样的信, 是银行寄给客户的,敬语看到我就根本不明白他们到底是不是说人话。

上网
网是可以联上internet, 但是这个公司的政策是不能上网。 说是全靠自觉, 但是如果上网过多, 肯定是会有人来教育你的。 想到了R同学现在在中国的一个日本公司上班, 还是能上网的,但是不能用IM。 于是大家都用gmail网页里的gtalk聊。

颇为可怕的日本公司……



前天和无敌可爱博士后同学(很显然, 他实际已经不是同学了,呵呵)聊天的时候, 他突然问我觉得学习(指上学读书那种)和研究的区别是什么? 想了半天也没有想出来一个很好的答案。 他说区别在于上学的时候问题都是有解答的, 而研究的时候问题都是open的。 

这也是区别之一吧, 不过我后来想了想, 自己觉得的最大的区别是上学的时候是你给学校钱(学费), 研究是学校给你钱(奖学金, 研究经费等等)。  正好反过来了。

さすが孔方兄rules!!

说到研究, 推荐刚刚硕士学位到手的尹璋琦写的自己研究量子物理几年下来对于一个研究生应该如何获得idea的一些看法, 我觉得很有道理, 一般的人都会经历过他说的那样的问题吧。



前天和无敌可爱博士后同学(很显然, 他实际已经不是同学了,呵呵)聊天的时候, 他突然问我觉得学习(指上学读书那种)和研究的区别是什么? 想了半天也没有想出来一个很好的答案。 他说区别在于上学的时候问题都是有解答的, 而研究的时候问题都是open的。 

这也是区别之一吧, 不过我后来想了想, 自己觉得的最大的区别是上学的时候是你给学校钱(学费), 研究是学校给你钱(奖学金, 研究经费等等)。  正好反过来了。

さすが孔方兄rules!!

说到研究, 推荐刚刚硕士学位到手的尹璋琦写的自己研究量子物理几年下来对于一个研究生应该如何获得idea的一些看法, 我觉得很有道理, 一般的人都会经历过他说的那样的问题吧。

PS:写完之后又发现又一个不同之处, 就是研究 有可能去希腊的小岛玩!虽然我没有去, 但是隔壁屋一个刚从那里开会回来的篮球场猛男刚才给我一盒希腊小雪茄。 这辈子还是第一次抽雪茄呢. 不过最大的感觉是希腊人的数学都应该很好吧, 看到了烟盒上的字, 感觉就像是打开了数学课本…… 各种beta,alpha,epsilon,omega还有见过很多次但是不会念的但相信是被大多数学生所憎恨的奇怪字母。 虽然我不认识希腊字, 但是都可以猜出来那十有八九都是说“吸烟有害健康”。






    摘要:上次给我找出数个错误的细心的Jimmy今天趁着周末用C写了一个三维的Stepping Stone Model, 并且将数据写到一个log文件里, 再将数据画出来, 这样就可以清楚的看到各种颜色斗争的全过程了。 可以看到开始几个颜色死得很快, 后面仅剩的两三个却要搞很久…… 可以去下载他的程序run一下, 可以自己设定维度,颜色,步长, 很有意思, 是Linux的2进制程序。

这个故事告诉我们, Jimmy肯定是工作的人了, 干什么都要趁周末,  不像我们学生, 我现在对周末和非周末就一点感觉都没有。 问了周围刚刚工作的人, 都说是工作以后才对周末有感觉。 上学的时候也是在周末没有事情作的时    (全文共778字)——点击此处阅读全文



最近需要折叠, 于是找了一下。 其实手册里面有, 不过手册做的太好太详细的后果往往就是让人懒得看了。 写的东西超过五六屏以后, 感觉翻来翻去就不怎么方便了, 看起来也很混乱。 这个时候最好就能折叠起来。 VIM里面也有VS里面那样的折叠功能, 而且不需要用鼠标去点那个减号和加号。
 
建立折叠
z的意思就是他的形状, 像一个折叠的东西, 折叠相关的命令都是z开头的, 新版本的拼写检查命令也有以z开头的。 f的意思是fold。 所以zf就是折叠。 你可以在visual模式下选定, 再按zf, 可以将选定的全部折叠。 也可以zf9j, 这样可以将下面9行的内容折起来。 也可以用marker, 还可以用行号:20,50, 就可以把20行到五十行折叠起来 。 总之可以用一般的定位的方法来告诉VIM你要折叠那些地方。
 
我觉得比较有用的是匹配括号的折叠, 移动到一个花括号{上, 用zfa}, 就可以将下面的匹配的花括号之间的内容折起来, 这样可以很方便的折起函数。 其他的折叠方法还有zf/string, 可以折叠到下一个匹配的string, 不过好像不太实用。
 
使用折叠
移动的时候在前面加一个z就可以在折叠的地方移动, 比如zj,就会跳到下一个折叠, zk就是上一个。  要打开的话可以zo,o是open的意思, zO打开所有的折叠。 关上用zc, c是close。 在zO之后用zc会关上所有打开的折叠。 折叠可以嵌套, zr可以打开第一层的折叠,zR可以打开所有层的折叠, 与之对应的是zm和zM, 是按层关上折叠。 比如说按zm, 会从最里层的层叠关起, 连续zm就会一直关到最上层的折叠。
 
查找到了折叠里面会将折叠打开, 处理完了之后要自己将折叠关上。
 
折叠选项
可以让VIM根据语法, 缩进,标记自动折叠。 用set foldmethod=foldoption 来设定。 可以查看一下foldmethod
 
保留折叠
要下一次打开的时候还保留折叠可以在离开的时候:mkview,再进来的时候:loadview就可以了。 当然也可以将这两句加到vimrc里面让其自动完成。
au BufWinLeave * mkview
au BufWinEnter * silent loadview
这样每次就可以看到上次的折叠了。



 今天调一个计算矩阵的东西出来这样一个运行时的错误, 还是第一次遇到。

--------------------------------------------------------------------------------------------------------------
*** glibc detected *** free(): invalid next size (normal): 0x093efc48 ***
forrtl: error (76): IOT trap signal
--------------------------------------------------------------------------------------------------------------
 
查了一下, 是内存泄露的问题。 一般是free了没有分配的内存, 还有就是分配了内存忘记释放也有可能会出现这样的问题。 我们这个程序里面两种情况都没有, 最后查出来是数组循环的时候越界了 , 写到了其他的内存里面, 然后一free那个区域就出现了这样的问题。 推荐这个Valgrind的工具, 我的可爱师傅找到的, 号称可以调试Linux下所有内存问题, 听起来不错。 调试的时候,  可以指出哪一行执行了非法的内存操作, 找起来也很方便---至少对我们这种单线程的小规模程序很方便。
 
其实真正想说的就是今天走在路上无意中想到的双节棍:
 
他们的学生我习惯
从小就耳濡目染
什么数组和链表我都耍得有模有样
什么兵器最喜欢
有向图柔中带刚
想要去三楼厕所旁边学优化的秘方
……
 
这个故事告诉我们, 我每天进行某些人类必需活动的时候似乎很方便,哈哈。



 今天调一个计算矩阵的东西出来这样一个运行时的错误, 还是第一次遇到。

-----------------------------------------------------
*** glibc detected *** free(): invalid next size (normal): 0x093efc48 ***
forrtl: error (76): IOT trap signal
-------------------------------------------------------
 
查了一下, 是内存泄露的问题。 一般是free了没有分配的内存, 还有就是分配了内存忘记释放也有可能会出现这样的问题。 我们这个程序里面两种情况都没有, 最后查出来是数组循环的时候越界了 , 写到了其他的内存里面, 然后一free那个区域就出现了这样的问题。 推荐这个Valgrind的工具, 我的可爱师傅找到的, 号称可以调试Linux下所有内存问题, 听起来不错。 调试的时候,  可以指出哪一行执行了非法的内存操作, 找起来也很方便---至少对我们这种单线程的小规模程序很方便。
 
其实真正想说的就是今天走在路上无意中想到的双节棍:
 
他们的学生我习惯
从小就耳濡目染
什么数组和链表我都耍得有模有样
什么兵器最喜欢
有向图柔中带刚
想要去三楼厕所旁边学优化的秘方
……
 
这个故事告诉我们, 选一个地理位置好的实验室对每天进行某些人类必需活动的时候的方便程度有多么大的帮助阿。



终于看到Google中国黑板报上出现有意思的一篇了, 要是里面每个“勇者泡泡龙”都这样写就比较好玩, 最好还让他们市场部的mm们也伴伴泡泡龙。 不过那个力场算最短路径的算法似乎以前在VSLI的物理设计布局优化中就有人用到过, 并不是太异想天开。 我们的猛哥去年就用引力场斥力场来摆电路上的方块, 玩得也是很high……




终于看到Google中国黑板报上出现有意思的一篇了, 要是里面每个“勇者泡泡龙”都这样写就比较好玩, 最好还让他们市场部的mm们也拌拌泡泡龙。 不过那个力场算最短路径的算法似乎以前在VSLI的物理设计布局优化中就有人用到过, 并不是太异想天开。 我们的猛哥去年就用引力场斥力场来摆电路上的方块, 玩得也是很high。




不要以为在机场干待遇好很舒服, 要在看了这个以后再考虑这个命题的真伪。 我本科的同学大丸现在MTU研究修飞机的发动机, 不知道大家知不知道这个月十二号左右哈尔滨一个机务人员被吸进发动机的事故, 后来这个发动机送到我这个同学那里去修了, 被他拍了照片……

就是这台发动机, CFM56-7,波音737NG上的。





不要以为在机场干待遇好很舒服, 要在看了这个以后再考虑这个命题的真伪。 我本科的同学现在研究修飞机的发动机, 不知道大家知不知道这个月十二号左右哈尔滨一个机务人员被吸进发动机的事故, 后来这个发动机送到我这个同学那里去修了, 被他拍了照片…… (心理承受能力不好千万不要点!!)



不要以为在机场干待遇好很舒服, 要在看了这个以后再考虑这个命题的真伪。 我本科的同学大丸现在研究修飞机的发动机, 不知道大家知不知道这个月十二号左右哈尔滨一个机务人员被吸进发动机的事故, 后来这个发动机送到我这个同学那里去修了, 被他拍了照片…… (心理承受能力不好千万不要点!!)



不要以为在机场干待遇好很舒服, 要在看了这个以后再考虑这个命题的真伪。 我本科的同学大丸现在MTU研究修飞机的发动机, 不知道大家知不知道这个月十二号左右哈尔滨一个机务人员被吸进发动机的事故, 后来这个发动机送到我这个同学那里去修了, 被他拍了照片…… (心理承受能力不好千万不要点!!)

就是这台发动机, CFM56-7,波音737NG上的。





前几天在gezhi 看到一个人用汇编优化 Einstein@Home的代码, 底下的讨论中听陈辉提到了他在德州大学的校友Goto, 据说是现在手工优化超级计算机的程序最牛比的人。 去年的时候就看到了这条新闻 , 但是找他的相关资料却没有找到很详细的。 昨天在厕所里看那个自动往我邮箱来的免费赠阅8周的日经business杂志, 看到了日本人写的关于Goto的民族自豪文, 总算是了解了一下这个我觉得很有意思的人的经历。

他 叫后藤和茂(Goto Kazushige), 94年从早稻田大学理工部电力工程毕业, 没有想到还是我校友。 之后进了专利局当了一个专利检察员, 干起了和爱因斯坦一样的工作,负责电脑和信息技术的专利审查。 由于专利厅存在为了学习技术而让专利审查员留学的制度, 02年Goto去了德州大学, 去了以后没有几个月就把那里的教授学生都震住了, 当时负责给奔4优化一个软件, 让其性能提高了30%。 04年回到日本后, 德州大学的教授热情邀请, 结果去了先进计算中心当了研究员, 研究怎么优化超级计算机。 文章说后藤现在在世界上的竞争对手也就只有4-5个人。 他现在以自由之立场, 为intel,AMD还有IBM,根据他们的处理器优化代码。 现在超级计算机解线形方程的代码, 基本上都是用他的。 每年美国有两次top 500的超级计算机评比, 为了让自己的计算机跑的成绩好一点, 大家都向Goto求助, 结果是现在他拥有世界上100多台超级计算机的登录ID…… 后藤说其实这就和丰田管理工厂是一个道理, 内存就是仓库, 数据就是制品, 处理器就是皮带传送器。 用丰田成功的管理工厂的方式来管理电脑里的内存数据, 就可以极大的提高效率。  比如说内存向处理器要数据的时候, 不是什么都不考虑马上就出, 而是要考虑前后的计划, 才确定出货的时间, 就是这样的just in time的管理方式。

有趣的是在进专利局到去美国留学的这十年间的时间, 他是怎么从一个电力专业毕业生一下子变成这个领域的牛比人的。 昨天说我猜测日本人是通勤的路上时间太长无聊导致无线终端上网很红火 。 但是后藤这个好孩子他就不上网。 他当时买了那时很快的一个有alpha处理器的电脑, 但是怎么也跑不出广告上宣传的那样的速度。  他的家在神奈川县相模市, 特许厅在东京最中心, 每天电车要走一个多小时。 所以他就每天在满员的电车上看这个处理器的手册, 思考怎么样才能让这个处理器跑得更快。 回家以后就拿他的那个电脑做实验。 可以想象一下, 日本的上下班时间搭乘率200%的电车上, 一个人在看手册的样子。后藤说着就像做字谜和数独一样,十分的有意思。 几年以后, 后藤对这个处理器已经是非常熟悉了, 后来还打电话给那个电脑公司, 把自己写的改进的程序让他们试, 结果让后藤在那家公司出了名。

这个故事告诉我们, 人果然还是要干自己喜欢干的事才有前途阿!

后藤最后说的话比较有意思, 他郑重告诉日经杂志的读者:“我其实是正常人, 不是御宅族(おたく)”



前几天在gezhi 看到一个人用汇编优化 Einstein@Home的代码, 底下的讨论中听陈辉提到了他在德州大学的校友Goto, 据说是现在手工优化超级计算机的程序最牛比的人。 去年的时候就看到了这条新闻 , 但是找他的相关资料却没有找到很详细的。 昨天在厕所里看那个自动往我邮箱来的免费赠阅8周的日经business杂志, 看到了日本人写的关于Goto的民族自豪文, 总算是了解了一下这个我觉得很有意思的人的经历。

他 叫后藤和茂(Goto Kazushige), 94年从早稻田大学理工部电力工程毕业, 没有想到还是我校友。 之后进了专利局当了一个专利检察员, 干起了和爱因斯坦一样的工作,负责电脑和信息技术的专利审查。 由于专利厅存在为了学习技术而让专利审查员留学的制度, 02年Goto去了德州大学, 去了以后没有几个月就把那里的教授学生都震住了, 当时负责给奔4优化一个软件, 让其性能提高了30%。 04年回到日本后, 德州大学的教授热情邀请, 结果辞去了在日本专利局的工作, 去了先进计算中心当了研究员, 研究怎么优化超级计算机。 文章说后藤现在在世界上的竞争对手也就只有4-5个人。 他现在以自由之立场, 为intel,AMD还有IBM,根据他们的处理器优化代码。 现在超级计算机解线形方程的代码, 基本上都是用他的。 每年美国有两次top 500的超级计算机评比, 为了让自己的计算机跑的成绩好一点, 大家都向Goto求助, 结果是现在他拥有世界上100多台超级计算机的登录ID…… 后藤说其实这就和丰田管理工厂是一个道理, 内存就是仓库, 数据就是制品, 处理器就是皮带传送器。 用丰田成功的管理工厂的方式来管理电脑里的内存数据, 就可以极大的提高效率。  比如说内存向处理器要数据的时候, 不是什么都不考虑马上就出, 而是要考虑前后的计划, 才确定出货的时间, 就是这样的just in time的管理方式。

有趣的是在进专利局到去美国留学的这十年间的时间, 他是怎么从一个电力专业毕业生一下子变成这个领域的牛比人的。 昨天说我猜测日本人是通勤的路上时间太长无聊导致无线终端上网很红火 。 但是后藤这个好孩子他就不上网。 他当时买了那时很快的一个有alpha处理器的电脑, 但是怎么也跑不出广告上宣传的那样的速度。  他的家在神奈川县相模市, 特许厅在东京最中心, 每天电车要走一个多小时。 所以他就每天在满员的电车上看这个处理器的手册, 思考怎么样才能让这个处理器跑得更快。 回家以后就拿他的那个电脑做实验。 可以想象一下, 日本的上下班时间搭乘率200%的电车上, 一个人在看手册的样子。后藤说着就像做字谜和数独一样,十分的有意思。 几年以后, 后藤对这个处理器已经是非常熟悉了, 后来还打电话给那个电脑公司, 把自己写的改进的程序让他们试, 结果让后藤在那家公司出了名。

这个故事告诉我们, 人果然还是要干自己喜欢干的事才有前途阿!

后藤最后说的话比较有意思, 他郑重告诉日经杂志的读者:“我其实是正常人, 不是御宅族(おたく)”



前几天在gezhi 看到一个人用汇编优化 Einstein@Home的代码, 底下的讨论中听陈辉提到了他在德州大学的校友Goto, 据说是现在手工优化超级计算机的程序最牛比的人。 去年的时候就看到了这条新闻 , 但是找他的相关资料却没有找到很详细的。 昨天在厕所里看那个总是往我邮箱来的免费赠阅8周的日经business杂志, 看到了日本人写的关于Goto的民族自豪文, 总算是了解了一下这个我觉得很有意思的人的经历。

他 叫后藤和茂(Goto Kazushige), 94年从早稻田大学理工部电力工程毕业, 没有想到还是我校友。 之后进了专利局当了一个专利检察员, 干起了和爱因斯坦一样的工作,负责电脑和信息技术的专利审查。 由于专利厅存在为了学习技术而让专利审查员留学的制度, 02年Goto去了德州大学, 去了以后没有几个月就把那里的教授学生都震住了, 当时负责给奔4优化一个软件, 让其性能提高了30%。 04年回到日本后, 德州大学的教授热情邀请, 结果去了先进计算中心当了研究员, 研究怎么优化超级计算机。 文章说后藤现在在世界上的竞争对手也就只有4-5个人。 他现在以自由之立场, 为intel,AMD还有IBM,根据他们的处理器优化代码。 现在超级计算机解线形方程的代码, 基本上都是用他的。 每年美国有两次top 500的超级计算机评比, 为了让自己的计算机跑的成绩好一点, 大家都向Goto求助, 结果是现在他拥有世界上100多台超级计算机的登录ID…… 后藤说其实这就和丰田管理工厂是一个道理, 内存就是仓库, 数据就是制品, 处理器就是皮带传送器。 用丰田成功的管理工厂的方式来管理电脑里的内存数据, 就可以极大的提高效率。  比如说内存向处理器要数据的时候, 不是什么都不考虑马上就出, 而是要考虑前后的计划, 才确定出货的时间, 就是这样的just in time的管理方式。

有趣的是在进专利局到去美国留学的这十年间的时间, 他是怎么从一个电力专业毕业生一下子变成这个领域的牛比人的。 昨天说我猜测日本人是通勤的路上时间太长无聊导致无线终端上网很红火 。 但是后藤这个好孩子他就不上网。 他当时买了当时很快的一个有alpha处理器的电脑, 但是怎么也跑不出广告上宣传的那样的速度。  他的家在神奈川县相模市, 特许厅在东京最中心, 每天电车要走一个多小时。 所以他就每天在满员的电车上看这个处理器的手册, 思考怎么样才能让这个处理器跑得更快。 回家以后就拿他的那个电脑做实验。 可以想象一下, 日本的上下班时间搭乘率200%的电车上, 一个人在看手册的样子。后藤说着就像做字谜和数独一样,十分的有意思。 几年以后, 后藤对这个处理器已经是非常熟悉了, 后来还打电话给那个电脑公司, 把自己写的改进的程序让他们试, 结果让后藤在那家公司出了名。

这个故事告诉我们, 人果然还是要干自己喜欢干的事才有前途阿!

后藤最后说的话比较有意思, 他郑重告诉日经杂志的读者:“我其实是正常人, 不是御宅族(おたく)”



前几天在gezhi 看到一个人用汇编优化 Einstein@Home的代码, 底下的讨论中听陈辉提到了他在德州大学的校友Goto, 据说是现在手工优化超级计算机的程序最牛比的人。 去年的时候就看到了这条新闻 , 但是找他的相关资料却没有找到很详细的。 昨天在厕所里看那个自动往我邮箱来的免费赠阅8周的日经business杂志, 看到了日本人写的关于Goto的民族自豪文, 总算是了解了一下这个我觉得很有意思的人的经历。

他 叫后藤和茂(Goto Kazushige), 94年从早稻田大学理工部电力工程毕业, 没有想到还是我校友。 之后进了专利局当了一个专利检察员, 干起了和爱因斯坦一样的工作,负责电脑和信息技术的专利审查。 由于专利厅存在为了学习技术而让专利审查员留学的制度, 02年Goto去了德州大学, 去了以后没有几个月就把那里的教授学生都震住了, 当时负责给奔4优化一个软件, 让其性能提高了30%。 04年回到日本后, 德州大学的教授热情邀请, 结果去了先进计算中心当了研究员, 研究怎么优化超级计算机。 文章说后藤现在在世界上的竞争对手也就只有4-5个人。 他现在以自由之立场, 为intel,AMD还有IBM,根据他们的处理器优化代码。 现在超级计算机解线形方程的代码, 基本上都是用他的。 每年美国有两次top 500的超级计算机评比, 为了让自己的计算机跑的成绩好一点, 大家都向Goto求助, 结果是现在他拥有世界上100多台超级计算机的登录ID…… 后藤说其实这就和丰田管理工厂是一个道理, 内存就是仓库, 数据就是制品, 处理器就是皮带传送器。 用丰田成功的管理工厂的方式来管理电脑里的内存数据, 就可以极大的提高效率。  比如说内存向处理器要数据的时候, 不是什么都不考虑马上就出, 而是要考虑前后的计划, 才确定出货的时间, 就是这样的just in time的管理方式。

有趣的是在进专利局到去美国留学的这十年间的时间, 他是怎么从一个电力专业毕业生一下子变成这个领域的牛比人的。 昨天说我猜测日本人是通勤的路上时间太长无聊导致无线终端上网很红火 。 但是后藤这个好孩子他就不上网。 他当时买了当时很快的一个有alpha处理器的电脑, 但是怎么也跑不出广告上宣传的那样的速度。  他的家在神奈川县相模市, 特许厅在东京最中心, 每天电车要走一个多小时。 所以他就每天在满员的电车上看这个处理器的手册, 思考怎么样才能让这个处理器跑得更快。 回家以后就拿他的那个电脑做实验。 可以想象一下, 日本的上下班时间搭乘率200%的电车上, 一个人在看手册的样子。后藤说着就像做字谜和数独一样,十分的有意思。 几年以后, 后藤对这个处理器已经是非常熟悉了, 后来还打电话给那个电脑公司, 把自己写的改进的程序让他们试, 结果让后藤在那家公司出了名。

这个故事告诉我们, 人果然还是要干自己喜欢干的事才有前途阿!

后藤最后说的话比较有意思, 他郑重告诉日经杂志的读者:“我其实是正常人, 不是御宅族(おたく)”



FF升级以后会有不少插件出现版本不相容的问题而用不了, 我从1升级到一点五的时候就遇到过, 前几天在bb的这个帖子 上看到了解决的办法。 Cory推荐了一下二点零版本的"Bon Echo"的alpha版本,说tab操作速度特别快。 但是装上以后他现在一点五版本的插件基本上全都用不了。 即使是这样, 他还是愿意用这个smoking fast的alpha。 后来更新的时候, 出现了几个读者告诉他的解决办法, 其实就是两个插件。

一个叫做 Nightly Tester Tools extension,另一个叫作 MR Tech Local Install extension,任选其中的一个就可以了。  那个读者说他现在用的四五十个插件在FF3 trunk build上都工作得很好。 看到这个问题解决了, 我也下了一个bon echo试了一下, 并且装上了这两个插件。 版本相容的问题倒是解决得很好, 但是我真没觉出哪里比以前快。 后面的这个MR插件, 实际上是一个强大的本地插件和主题管理工具, 各种功能很全, 这只是其中的一个小小的功能, 还提供各种设置的导入导出。

人为什么要一直变态的追求升级呢? 这是不是一种病啊。

这是Bon Echo的一些改变。

  • Links default to opening in new tabs, not new windows
  • Close buttons now appear on every tab, and the close behaviour is slightly different
  • Inline spell checking in text boxes
  • Automatic restoration of your browsing session if there is a crash
  • Search suggestions now appear in the search box auto-complete for Google and Yahoo!
  • New search plugin manager for removing and re-ordering search engines
  • Improved support for previewing and subscribing to web feeds
  • New microsummaries feature for bookmarks
  • New Add-Ons manager improves the user interface for managing extensions and themes
  • Updates to the extension system to provide enhanced security and to allow for easier localization of extensions
  • New search service that supports Sherlock and OpenSearch engines
  • Support for SVG text using svg:textPath




    摘要:

看到了来自总务省的调查,说是用移动终端比如手机, PHS, PDA上网的人已经超过了在家用电脑接入的人。

我的感觉是因为大家通勤的道路都很漫长, 每天花在电车上班下班的时间太多, 听说一两个小时都是很平常的, 无法打发, 只好求助于手机上网了。 我就从来不用手机上网, 因为从我寝室骑单车到研究室就五分钟…… 真好, 可以省不少钱。

    (全文共453字)——点击此处阅读全文



今天发现, 干活和玩的区别有时候在内容上差得真是不多, 但是带来的后果就完全不一样。

前几天写了个好玩的程序, 其实主要的内容就是处理那个正方形的边界条件。 结果昨天在研究室干活, 处理关心我成长的博士后同学作的一个芯片的热模型, 需要用一个很多格子的MultiGrid方法解出来那个偏微分方程, 首先要构造一个Restrictor矩阵, 其实主要的工作还是处理 边界条件, 但是这次正方形变成了正方体, 一个格子的邻居最多也从8个到了27个……

感觉完全不像前几天写那个程序的时候那么好玩, 感觉自己就是打字的民工阿!!刚刚处理完最简单的角和棱上的点, 发现就已经快600行了。 所以就想, 老子以后有钱就雇个民工来干这个活, 后来再想了一想, 原来其实现在自己就是民工。

估计要是是自己玩的东西,估计写6000行也不会有问题的, 但是现在看到小小的格子, 就有一点过敏反应, 所以自己的blog都不愿意打开了, 哈哈。

又想, 好多人给付工钱的公司工作都不来劲, 到了开源社区反而玩命的干, 是不是也是这样的呢。 看来干活和玩还就真是不一样。




看到了有人在二十几层的高层建筑上夫唱 妇随 的回忆读书timeline, 觉得特别的有意思。 因为一般人读书都是喜欢什么看什么, 也不会做个读书的总结, 自己也是从来没有回想过曾经看过的书。 不过据说一个人看的书可以在很大程度上影响这个人, 也就是从书可见人。 看了很多书都不记得了, 但是据夫说, 不记得不要紧, 记得的才是重要的。所以决定给自己做个备忘录。

0-3岁:
这个时候的兴趣似乎还在喝人奶这类事情上面, 对书没有丝毫的兴趣, 根本就不知道书是什么东西。

3-7岁:
上学前的这段时间, 我爷爷给我讲三国演义的故事, 觉得特别好玩。 爷爷看的是几本很厚的大书, 还是古文, 我根本看不懂。 结果我妈就给我买了一套三国演义的连环画, 一共有六十多本。 于是开始了看连环画, 这套书起码也看了五遍以上吧。 后来就看水浒的连环画, 还有西游记, 只要是有打斗场面的都觉得特别爽, 而且还要躲在被窝里面看。 结果小时候出去玩得时间都少了很多, 估计这就是为什么小时候有失语症嫌疑的原因。 这个看书是出于自愿的, 但是我妈还逼我背唐诗。 当时背了好多的唐诗阿, 我妈看到家里来了客人, 还很得意地叫我背。 但是我一直都不清楚, 背这种东西有什么意义。 很多诗的意思都不懂, 但是后来还记得一些, 回想的时候才知道原来是这个意思。 这个比较没有意思, 我以后一定不让小btsb背唐诗, 我要让他背我的文章!

6-11岁(小学):
这个时候开始显示出阅读上瘾症的征兆, 连环画看完以后开始找各种有字的东西看, 连我家里的各种说明书也看, 还看得津津有味。 对现在的影响是比较喜欢看各种说明性的文档…… 小时候看暴力书的后果也显现出来,  小学不但失语, 而且还暴力, 总是幻想自己是孙悟空(当时觉得斗战胜佛这个名字特别酷), 和同学打架。 开始觉得连环画没有意思, 开始看白话版的暴力书, 把三国演义, 水浒, 西游记又重温了数遍。 曾试图看过红楼梦, 看了十几页以后就再也没有看过了, 至今没有看过。 对于这种男女关系复杂的书特别过敏, 根本看不下去。

当时订了两本书, 一个是“儿童文学”, 一个是“故事会”。 每次来了总是先看故事会的前面的笑话。 但是后来故事会都扔了, 儿童文学一直都留着, 在我家的柜子里摆着很多。  很喜欢郑渊洁, 看了“皮皮鲁和鲁西西”,全套的“十二生肖”,还有很多“童话大王”,不过最喜欢的还是“舒克和贝塔”, 因为我就总是幻想我能坐在我的玩具飞机和坦克里面周游世界, 并且还打仗。 后果是现在写字都喜欢把一句话写得很长不用标点隔开, 想想看都是郑渊洁影响的。 还有"十万个为什么", 一个民间故事集, 不记得名字了, 每个前面还有智力题, 这种类型的书比较喜欢。 “人类五千年”, 从古代讲到现代, 也是给小孩看的那种, 但是还挺厚的两本。 一套名字好像是xx爱科学的书, 里面讲恐龙, 植物, 海洋这样的东西。 一套讲火箭的书, 各种好看的图, 从鞭炮讲到阿波罗号, 讲到未来的核动力飞船。

还有好多好玩的书, 比如洋葱头历险记, xxx周游世界(都不是人, 有好几个版本), 八十天环游地球, 非洲民间传说, 亚洲民间传说, 美洲民间传说, 七仙女……不过好多都忘了, 只记得个名字。 喜欢各种历险记, 特别是老鼠, 洋葱的这种。

12-18岁(中学):
中学成功的治疗了失语症, 第一次考试对我的中学阅读竟然有巨大的影响。 当时的班主任为了激励大家好好学习, 班上每个人出钱搞了一个小基金, 考试的前几名就可以得到用这个基金买来的奖品。 (其实就是把多数人的财富集中到少数人手上) 第一次考试好像考得不错, 结果得了一个大奖, 一套很厚的俄罗斯文学。 气死我了, 和各种历险都没有关系, 而且主角还都是人, 没有洋葱! 记得有“初恋”, “上尉的女儿”, "当代英雄", "猎人笔记"等等, 好像都是苏联之前的作品。 拿回家很久没有看, 后来实在没有书了, 开始看, 觉得挺有意思, 于是开始星期六星期天整天的在家里看这套书。 觉得唯一的不好的地方就是主角的名字太长, 而且一个人有至少五六种昵称, 而且有的相差还特别远, 导致基本每本俄罗斯小说开始都有一个人物介绍, 中间就要介绍每个人的昵称, 以免有人看不懂。 当然喜欢看打仗的书的习性还是没有变, 看了“静静的顿河”,(觉得格里高利太酷了!哥萨克太酷了!) , "青年近卫军", 还有“教育诗”。 后来喜欢陀思妥耶夫斯基, 看了“罪与罚”, “被侮辱的和被损害的 ”, 还有一个他的中短篇的合集。 试图看“卡拉马佐夫兄弟”, 因为据说心理描写特别牛比, 结果看了几次都被里面大段的关于宗教的说教打败了。 “彼得大帝”看过两个版本, 都不记得是谁写的, 只记得其名字变态的长。 车尔尼雪夫斯基, 这个名字好听, 看了他的“怎么办 ”

看了好多关于苏联卫国战争的书, “这里的黎明静悄悄 ”, “卓姬和舒拉的故事”, “无脚飞行员”……虽然有些假, 但是看完还是热血沸腾, 想要去打仗。 还有数本苏联将军的战争回忆录, 顺带着还看了巴顿, 蒙哥马利这些人的回忆录。 很多关于朝鲜战争的书, 因为我姥爷总是和我说他那个时候在朝鲜打仗的事情。

非小说的还有我妈在党校上课时候的经济学的书, 都是在家没有书可看像小时候看各种说明书一样看的。 但是看完觉得挺有意思, 觉得凯恩斯很牛比。 又找了关于大萧条时候的书看。 回想到这个时候发现没有打仗情节的书大部分都被我忘记了…… 只记得一个基督山伯爵, 因为在别人的帖子里面看到了这本书。

还有一个兴趣点是各种科幻小说, 当时买了凡尔纳, 威尔士, 阿西莫夫的好多合集看。 后来又买了一本特别厚的叫“二十世纪科学幻想小说集” 的书看。 一直到现在还喜欢看各种科幻小说, 但是以前看的都是外国人的, 现在看了王晋康的, 刘慈欣的, 觉得也很不错。

17-21(大学本科)
印象最深的都是在厕所里面看的几本书, 本科的时候一个宿舍有一个厕所, 同学看完书就把书放在马桶旁边, 于是后来人就接着看。 在厕所里看了“活着”, “许三观卖血记”, “寻秦记”, 还有各种金庸的小说。 我以前真是没有看过什么武侠, 都是在大学本科的厕所里面的马桶上看的。 养成了现在每次大便都要四十分钟左右的习惯……

放假回家以后还去家旁边的图书馆看书, 继续是俄罗斯文学, 看了“战争与和平”, “将军和他的部队”,还有波兰人的“十字军骑士”。 喜欢打仗的习惯还是没有变, 继续看了美国人和俄国人写的第二次世界大战历史, 发现人们总是觉得自己国家的军队才是救世主。 还看了德国人写的, 最喜欢的还是德国人的, 名字全忘了。 还看了日本人的很多战争回忆录, 知道了初中历史书上说的 八路军是抗日主力的话不像是真的。

后来去北京参加了一个 模拟联合国的活动, 就是好多学校扮演不同的国家模拟在联合国开会, 于是又看了好多国际关系的书, 最后都忘了, 只记得所有的书里面都讲国际关系就是从林关系。 活动结束以后就没有看了, 只记得活动的时候还遇到了香港的一个队扮演意大利, 有很多学校, 其中还有一个叫浸礼教会大学的学校的学生挺有意思的, 但是我们说话竟然都要用英文, 因为他们不会说普通话, 我们也不懂粤语…… 于是对语言的发展比较有兴趣, 又看了好多语言发展的书。

22-25(后大学时代,研究生院)
这个时代刚开始一年, 看过的书都在桌上摆着呢。 有大萧条的孩子, 这是上次katrina台风以后看的。 到了日本觉得日本人都是汉字写字, 看日本书问题也不大, 于是看了德川家康的传记, 一个日本人写的“日本是什么”, 还有日本人的“一亿人的昭和史”讲日本人在台湾的经历, 还有十九世纪的冒险家, 是讲日本最早去台湾的那帮人。 最近看的一本书是在便利店买的, 是叫了解日本的A级战犯。

看来我看了这么多暴力书, 还没有被犯事被抓, 还是挺幸运的。 总体的趋势是越长大看书越少。 当然, 还有一些少儿不宜的书, 我就不列了。  我在想, 如果老白这样的读书人写这种东西, 估计键盘的寿命是要大减的吧。:)



看到了有人在夫唱 妇随 的回忆读书timeline, 觉得特别的有意思。 因为一般人读书都是喜欢什么看什么, 也不会做个读书的总结, 自己也是从来没有回想过曾经看过的书。 不过据说一个人看的书可以在很大程度上影响这个人, 也就是从书可见人。 看了很多书都不记得了, 但是据夫说, 不记得不要紧, 记得的才是重要的。所以决定给自己做个备忘录。

0-3岁:
这个时候的兴趣似乎还在喝人奶这类事情上面, 对书没有丝毫的兴趣, 根本就不知道书是什么东西。

3-7岁:
上学前的这段时间, 我爷爷给我讲三国演义的故事, 觉得特别好玩。 爷爷看的是几本很厚的大书, 还是古文, 我根本看不懂。 结果我妈就给我买了一套三国演义的连环画, 一共有六十多本。 于是开始了看连环画, 这套书起码也看了五遍以上吧。 后来就看水浒的连环画, 还有西游记, 只要是有打斗场面的都觉得特别爽, 而且还要躲在被窝里面看。 结果小时候出去玩得时间都少了很多, 估计这就是为什么小时候有失语症嫌疑的原因。 这个看书是出于自愿的, 但是我妈还逼我背唐诗。 当时背了好多的唐诗阿, 我妈看到家里来了客人, 还很得意地叫我背。 但是我一直都不清楚, 背这种东西有什么意义。 很多诗的意思都不懂, 但是后来还记得一些, 回想的时候才知道原来是这个意思。 这个比较没有意思, 我以后一定不让小btsb背唐诗, 我要让他背我的文章!

6-11岁(小学):
这个时候开始显示出阅读上瘾症的征兆, 连环画看完以后开始找各种有字的东西看, 连我家里的各种说明书也看, 还看得津津有味。 对现在的影响是比较喜欢看各种说明性的文档…… 小时候看暴力书的后果也显现出来,  小学不但失语, 而且还暴力, 总是幻想自己是孙悟空(当时觉得斗战胜佛这个名字特别酷), 和同学打架。 开始觉得连环画没有意思, 开始看白话版的暴力书, 把三国演义, 水浒, 西游记又重温了数遍。 曾试图看过红楼梦, 看了十几页以后就再也没有看过了, 至今没有看过。 对于这种男女关系复杂的书特别过敏, 根本看不下去。

当时订了两本书, 一个是“儿童文学”, 一个是“故事会”。 每次来了总是先看故事会的前面的笑话。 但是后来故事会都扔了, 儿童文学一直都留着, 在我家的柜子里摆着很多。  很喜欢郑渊洁, 看了“皮皮鲁和鲁西西”,全套的“十二生肖”,还有很多“童话大王”,不过最喜欢的还是“舒克和贝塔”, 因为我就总是幻想我能坐在我的玩具飞机和坦克里面周游世界, 并且还打仗。 后果是现在写字都喜欢把一句话写得很长不用标点隔开, 想想看都是郑渊洁影响的。 还有"十万个为什么", 一个民间故事集, 不记得名字了, 每个前面还有智力题, 这种类型的书比较喜欢。 “人类五千年”, 从古代讲到现代, 也是给小孩看的那种, 但是还挺厚的两本。 一套名字好像是xx爱科学的书, 里面讲恐龙, 植物, 海洋这样的东西。 一套讲火箭的书, 各种好看的图, 从鞭炮讲到阿波罗号, 讲到未来的核动力飞船。

还有好多好玩的书, 比如洋葱头历险记, xxx周游世界(都不是人, 有好几个版本), 八十天环游地球, 非洲民间传说, 亚洲民间传说, 美洲民间传说, 七仙女……不过好多都忘了, 只记得个名字。 喜欢各种历险记, 特别是老鼠, 洋葱的这种。

12-18岁(中学):
中学成功的治疗了失语症, 第一次考试对我的中学阅读竟然有巨大的影响。 当时的班主任为了激励大家好好学习, 班上每个人出钱搞了一个小基金, 考试的前几名就可以得到用这个基金买来的奖品。 (其实就是把多数人的财富集中到少数人手上) 第一次考试好像考得不错, 结果得了一个大奖, 一套很厚的俄罗斯文学。 气死我了, 和各种历险都没有关系, 而且主角还都是人, 没有洋葱! 记得有“初恋”, “上尉的女儿”, "当代英雄", "猎人笔记"等等, 好像都是苏联之前的作品。 拿回家很久没有看, 后来实在没有书了, 开始看, 觉得挺有意思, 于是开始星期六星期天整天的在家里看这套书。 觉得唯一的不好的地方就是主角的名字太长, 而且一个人有至少五六种昵称, 而且有的相差还特别远, 导致基本每本俄罗斯小说开始都有一个人物介绍, 中间就要介绍每个人的昵称, 以免有人看不懂。 当然喜欢看打仗的书的习性还是没有变, 看了“静静的顿河”,(觉得格里高利太酷了!哥萨克太酷了!) , "青年近卫军", 还有“教育诗”。 后来喜欢陀思妥耶夫斯基, 看了“罪与罚”, “被侮辱的和被损害的 ”, 还有一个他的中短篇的合集。 试图看“卡拉马佐夫兄弟”, 因为据说心理描写特别牛比, 结果看了几次都被里面大段的关于宗教的说教打败了。 “彼得大帝”看过两个版本, 都不记得是谁写的, 只记得其名字变态的长。 车尔尼雪夫斯基, 这个名字好听, 看了他的“怎么办 ”

看了好多关于苏联卫国战争的书, “这里的黎明静悄悄 ”, “卓姬和舒拉的故事”, “无脚飞行员”……虽然有些假, 但是看完还是热血沸腾, 想要去打仗。 还有数本苏联将军的战争回忆录, 顺带着还看了巴顿, 蒙哥马利这些人的回忆录。 很多关于朝鲜战争的书, 因为我姥爷总是和我说他那个时候在朝鲜打仗的事情。

非小说的还有我妈在党校上课时候的经济学的书, 都是在家没有书可看像小时候看各种说明书一样看的。 但是看完觉得挺有意思, 觉得凯恩斯很牛比。 又找了关于大萧条时候的书看。 回想到这个时候发现没有打仗情节的书大部分都被我忘记了…… 只记得一个基督山伯爵, 因为在别人的帖子里面看到了这本书。

还有一个兴趣点是各种科幻小说, 当时买了凡尔纳, 威尔士, 阿西莫夫的好多合集看。 后来又买了一本特别厚的叫“二十世纪科学幻想小说集” 的书看。 一直到现在还喜欢看各种科幻小说, 但是以前看的都是外国人的, 现在看了王晋康的, 刘慈欣的, 觉得也很不错。

17-21(大学本科)
印象最深的都是在厕所里面看的几本书, 本科的时候一个宿舍有一个厕所, 同学看完书就把书放在马桶旁边, 于是后来人就接着看。 在厕所里看了“活着”, “许三观卖血记”, “寻秦记”, 还有各种金庸的小说。 我以前真是没有看过什么武侠, 都是在大学本科的厕所里面的马桶上看的。 养成了现在每次大便都要四十分钟左右的习惯……

放假回家以后还去家旁边的图书馆看书, 继续是俄罗斯文学, 看了“战争与和平”, “将军和他的部队”,还有波兰人的“十字军骑士”。 喜欢打仗的习惯还是没有变, 继续看了美国人和俄国人写的第二次世界大战历史, 发现人们总是觉得自己国家的军队才是救世主。 还看了德国人写的, 最喜欢的还是德国人的, 名字全忘了。 还看了日本人的很多战争回忆录, 知道了初中历史书上说的 八路军是抗日主力的话不像是真的。

后来去北京参加了一个 模拟联合国的活动, 就是好多学校扮演不同的国家模拟在联合国开会, 于是又看了好多国际关系的书, 最后都忘了, 只记得所有的书里面都讲国际关系就是从林关系。 活动结束以后就没有看了, 只记得活动的时候还遇到了香港的一个队扮演意大利, 有很多学校, 其中还有一个叫浸礼教会大学的学校的学生挺有意思的, 但是我们说话竟然都要用英文, 因为他们不会说普通话, 我们也不懂粤语…… 于是对语言的发展比较有兴趣, 又看了好多语言发展的书。

22-25(后大学时代,研究生院)
这个时代刚开始一年, 看过的书都在桌上摆着呢。 有大萧条的孩子, 这是上次katrina台风以后看的。 到了日本觉得日本人都是汉字写字, 看日本书问题也不大, 于是看了德川家康的传记, 一个日本人写的“日本是什么”, 还有日本人的“一亿人的昭和史”讲日本人在台湾的经历, 还有十九世纪的冒险家, 是讲日本最早去台湾的那帮人。 最近看的一本书是在便利店买的, 是叫了解日本的A级战犯。

看来我看了这么多暴力书, 还没有被犯事被抓, 还是挺幸运的。 总体的趋势是越长大看书越少。

当然, 还有一些少儿不宜的书, 我就不列了。



看到了有人在二十几层的高层建筑上夫唱 妇随 的回忆读书timeline, 觉得特别的有意思。 因为一般人读书都是喜欢什么看什么, 也不会做个读书的总结, 自己也是从来没有回想过曾经看过的书。 不过据说一个人看的书可以在很大程度上影响这个人, 也就是从书可见人。 看了很多书都不记得了, 但是据夫说, 不记得不要紧, 记得的才是重要的。所以决定给自己做个备忘录。

0-3岁:
这个时候的兴趣似乎还在喝人奶这类事情上面, 对书没有丝毫的兴趣, 根本就不知道书是什么东西。

3-7岁:
上学前的这段时间, 我爷爷给我讲三国演义的故事, 觉得特别好玩。 爷爷看的是几本很厚的大书, 还是古文, 我根本看不懂。 结果我妈就给我买了一套三国演义的连环画, 一共有六十多本。 于是开始了看连环画, 这套书起码也看了五遍以上吧。 后来就看水浒的连环画, 还有西游记, 只要是有打斗场面的都觉得特别爽, 而且还要躲在被窝里面看。 结果小时候出去玩得时间都少了很多, 估计这就是为什么小时候有失语症嫌疑的原因。 这个看书是出于自愿的, 但是我妈还逼我背唐诗。 当时背了好多的唐诗阿, 我妈看到家里来了客人, 还很得意地叫我背。 但是我一直都不清楚, 背这种东西有什么意义。 很多诗的意思都不懂, 但是后来还记得一些, 回想的时候才知道原来是这个意思。 这个比较没有意思, 我以后一定不让小btsb背唐诗, 我要让他背我的文章!

6-11岁(小学):
这个时候开始显示出阅读上瘾症的征兆, 连环画看完以后开始找各种有字的东西看, 连我家里的各种说明书也看, 还看得津津有味。 对现在的影响是比较喜欢看各种说明性的文档…… 小时候看暴力书的后果也显现出来,  小学不但失语, 而且还暴力, 总是幻想自己是孙悟空(当时觉得斗战胜佛这个名字特别酷), 和同学打架。 开始觉得连环画没有意思, 开始看白话版的暴力书, 把三国演义, 水浒, 西游记又重温了数遍。 曾试图看过红楼梦, 看了十几页以后就再也没有看过了, 至今没有看过。 对于这种男女关系复杂的书特别过敏, 根本看不下去。

当时订了两本书, 一个是“儿童文学”, 一个是“故事会”。 每次来了总是先看故事会的前面的笑话。 但是后来故事会都扔了, 儿童文学一直都留着, 在我家的柜子里摆着很多。  很喜欢郑渊洁, 看了“皮皮鲁和鲁西西”,全套的“十二生肖”,还有很多“童话大王”,不过最喜欢的还是“舒克和贝塔”, 因为我就总是幻想我能坐在我的玩具飞机和坦克里面周游世界, 并且还打仗。 后果是现在写字都喜欢把一句话写得很长不用标点隔开, 想想看都是郑渊洁影响的。 还有"十万个为什么", 一个民间故事集, 不记得名字了, 每个前面还有智力题, 这种类型的书比较喜欢。 “人类五千年”, 从古代讲到现代, 也是给小孩看的那种, 但是还挺厚的两本。 一套名字好像是xx爱科学的书, 里面讲恐龙, 植物, 海洋这样的东西。 一套讲火箭的书, 各种好看的图, 从鞭炮讲到阿波罗号, 讲到未来的核动力飞船。

还有好多好玩的书, 比如洋葱头历险记, xxx周游世界(都不是人, 有好几个版本), 八十天环游地球, 非洲民间传说, 亚洲民间传说, 美洲民间传说, 七仙女……不过好多都忘了, 只记得个名字。 喜欢各种历险记, 特别是老鼠, 洋葱的这种。

12-18岁(中学):
中学成功的治疗了失语症, 第一次考试对我的中学阅读竟然有巨大的影响。 当时的班主任为了激励大家好好学习, 班上每个人出钱搞了一个小基金, 考试的前几名就可以得到用这个基金买来的奖品。 (其实就是把多数人的财富集中到少数人手上) 第一次考试好像考得不错, 结果得了一个大奖, 一套很厚的俄罗斯文学。 气死我了, 和各种历险都没有关系, 而且主角还都是人, 没有洋葱! 记得有“初恋”, “上尉的女儿”, "当代英雄", "猎人笔记"等等, 好像都是苏联之前的作品。 拿回家很久没有看, 后来实在没有书了, 开始看, 觉得挺有意思, 于是开始星期六星期天整天的在家里看这套书。 觉得唯一的不好的地方就是主角的名字太长, 而且一个人有至少五六种昵称, 而且有的相差