0%

一个好的搜索引擎是现如今面向互联网编程的重要工具。而pagerank是曾经谷歌用来确定搜索引擎网页排名的算法,算法足够简洁且实用,且采用集群进行分布式计算而不是小型机的方法,给当时的网页排名带来了革命性突破。如果你实在看不懂理论部分如何处理的,就想当初的我一样。建议好好看一下代码,一目了然。

每天一点点算法开始了,为什么我就写不出很爽的代码。今天被邀请去水了一场类似ACM的程序设计竞赛,他说是期末考试难度,结果那个难度……题目只做出了一半,剩下的实在是…….出题人的语文水平太差了,没交代清楚题要干什么,很多细节描述的模棱两可。如果你考我程序设计,我没问题;通过模糊的信息表达来考察语文理解能力就没意思了,为啥不多打几个字把问题交代清楚呢?为节省空间,本文压缩了某些代码,实际工程切勿模仿。

之前一直在看他们用『因果扩张卷积』这个东西,当时我只看到了一张图,大概了解了那是个什么东西。今天,在某次比赛中用到了这个模型,顺手看了下源代码,来做个整理。

本文以 pytorch 为框架,分别从数据并行训练的方法(DataParallel, DistributedDataParallel)、并行加载数据两个角度,阐述了本次实验中并行算法的设计思想,并对并行实现的原理进行了解析,包括多进程的工作流程和通信方法等。语言这么正规的原因是:这是从大作业里面摘出来的。神经网络那部分我就不写了,跑题,最后直接给代码。

以python为例,多线程由于GIL的存在,所以有multiprocessing来缓解;但它不能面向多个计算节点编程,所以MPI来了。当面向多个计算节点编程时,程序的各部分之间通过来回传递消息的方式通信。要使得消息传递方式可移植,就需要采用标准的消息传递库。这就促成消息传递接口(Message Passing Interface, MPI)的面世,MPI是一种被广泛采用的消息传递标准,所以MPI并不是一种语言。

在使用多进程编程时,会经常涉及到进程之间通信的问题。除了借助文件、特殊变量等,还可以借助一些特殊的数据结构完成功能复杂的通信。并行应用常常需要在进程之间交换数据。python的Multiprocessing库有两个通信通道可以交换对象:队列(queue)和管道(pipe)。

使用多线程必须注意一个问题,如果有多个线程同时运行,而且它们试图访问相同的资源,就会遇到各种问题。如请求在代码在阅读时写入其他函数,即一个线程要读,一个线程要写,读线程占据着资源,写线程得不到资源,自然就会与理想的结果相违背。本文更侧重理论解读,某些场景下,这些概念可同样用到进程中;样例代码为C语言,其他语言仍然适用。