CV script
自我介绍
大家好!
我是xxx!目前xx研一在读,计算机技术专业。本科在xx读计算机科学与技术(日语强化)专业,双专业学制五年,大四到日本xx大学交换学习一年,方向是分布式和并行处理,所以学习的课程涉及到一些并行处理。目前研究方向是网络空间安全
超算
美国 summit sierra
中国 太湖之光 天河2号
大都是并行计算机
“一处代码,多处执行”。编写过多线程的人应该能够理解,就是同样的代码,不同的进程执行不同的路径。
OpenMP和MPI
并行计算机可以简单分为共享内存(SMP)和分布式内存(DSM),共享内存就是多个核心共享一个内存,目前的PC就是这类(不管是只有一个多核CPU还是可以插多个CPU,它们都有多个核心和一个内存),一般的大型计算机结合分布式内存和共享内存结构,即每个计算节点内是共享内存,节点间是分布式内存。
想要在这些并行计算机上获得较好的性能,进行并行编程是必要条件。目前流行的并行程序设计方法是,分布式内存结构上使用MPI
,共享内存结构上使用Pthreads
或OpenMP
。
OpenMP:
- OpenMP的编译预处理指令
#pragma
,能够提供机器和操作系统指定特性,同时兼容C/C++ 。 - 无需指定线程数量,通常创建线程数量等同于处理器个数,超线程系统中,是处理器数量的2倍。
- OpenMP最大限度的减少了对代码库的干扰。通过禁用 OpenMP 支持,代码可用作为单一线程应用进行编译。
Pthread:
- 处理线程一个比较低级的API,对线程管理(create,join等)、互斥锁等有更精细的控制。
MPI:
- 进程级别并行;
- 分布式内存系统不可或缺;
- 共享内存系统进程间通信也可以用;
- 主用于SIMD,单指令多数据流。
MPI_Init():
启动MPI环境,标志并行代码的开始,并行代码之前,第一个mpi函数(除MPI_Initialize()外)。
通信子(通信空间) MPI_COMM_WORLD:
一个通信空间是一个进程组和一个上下文的组合。在执行函数MPI_Init
之后,一个MPI程序的所有进程形成一个缺省的组,这个组的通信子被写作MPI_COMM_WORLD.该参数是MPI通信操作函数中必不可少的参数,用于限定参加通信的进程的范围。
ierr = MPI_Init(&argc, &argv);
ierr = MPI_Comm_rank(MPI_COMM_WORLD, &myid);//本进程在通信空间中的rank值,即在组中的逻辑编号(从0开始).
ierr = MPI_Comm_size(MPI_COMM_WORLD, &numprocs); //获得通信空间comm中规定的组包含的进程的数量
ieer = MPI_Finalize(); //标志并行代码的结束,结束除主进程外其它进程. 之后串行代码仍可在主进程(rank = 0)上运行(如果必须).
OCaml
Java GC:在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。
判断对象是否垃圾:
- 引用计数算法
- 简单
- 所有的对象都要存放一个计数器,开销大;引用计数不能处理循环引用,或者自引用。
根搜索算法
所谓根集(Root Set)就是正在执行的Java程序可以访问的引用变量(注意:不是对象)的集合(包括局部变量、参数、类变量),程序可以使用引用变量访问对象的属性和调用对象的方法。
这种算法的基本思路:
(1)通过一系列名为“GC Roots”的对象作为起始点,寻找对应的引用节点。
(2)找到这些引用节点后,从这些节点开始向下继续寻找它们的引用节点。
(3)重复(2)。
(4)搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,就证明此对象是不可用的。
Java和C#中都是采用根搜索算法来判定对象是否存活的。
GC根对象包括:
(1)虚拟机栈中引用的对象(栈帧中的本地变量表);
(2)方法区中的常量引用的对象;
(3)方法区中的类静态属性引用的对象;
(4)本地方法栈中JNI(Native方法)的引用对象。
(5)活跃线程。
回收垃圾对象内存:
- 标记—清除算法:
- 不需要进行对象的移动,并且仅对不存活的对象进行处理,在存活对象比较多的情况下极为高效。
- 标记和清除过程的效率都不高;标记清除后会产生大量不连续的内存碎片。
- 标记—整理算法:不是直接对可回收对象进行清理,而是让所有的对象都向一端移动,然后直接清理掉端边界以外的内存。
- 经过整理之后,新对象的分配只需要通过指针碰撞便能完成,相当简单;使用这种方法空闲区域的位置是始终可知的,也不会再有碎片的问题了。
- GC暂停的时间会增长,因为你需要将所有的对象都拷贝到一个新的地方,还得更新它们的引用地址。
并行计算技巧
unrolling,blocking,LU分解