分布式与并行计算
realxie
网易游戏研发工程师
展开
-
矩阵乘法的并行算法
设两个矩阵A和B,大小分别为M * N 和 N * P, 如果C = A * B, 则C的大小为M * P。矩阵算法的算法表示,伪代码如下:for (i = 0; i < M; ++i){ for (j = 0; j < P; ++j){ C[i][j] = 0; for (k = 0; k < N; ++k){ C[i][j] += A[i][k] * B[k][j];原创 2012-02-15 10:16:30 · 21847 阅读 · 1 评论 -
寻找素数的并行算法
一.串行算法(筛选法):输入N。输出0 到 N之间的所有素数int A[ N + 1];Memset(A , 0 , sizeof(A));int Count = 0; for (int I = 2; I <= N; ++i){ if(A[i] != 0)continue; ++Count; for(int j = I原创 2012-02-14 00:05:24 · 4475 阅读 · 0 评论 -
TBB(intel threading building blocks)内存分配算法(一)
开篇:最近研究了一下TBB的内存分配算法,发现设计的非常优雅,故和大家分析一下它的算法思想。既然是开篇,那么我们就先从最基本的入手来看一下TBB基于Cache对齐的内存管理算法。首先来明确几个概念。cache: 现代的cpu都引入的cache的概念,即cpu在参与运算时并非每次都去内存中取得数据的,而是将内存中的一部分数据直接存储在cpu的cache中,cpu中的cache采用的静态随机存原创 2012-02-11 15:14:46 · 6773 阅读 · 0 评论 -
多线程伪共享(false sharing)问题分析
在多核的CPU架构中,每一个核心core都会有自己的缓存空间,因此如果一个变量如果同时存在不同的核心缓存空间时,就会出现伪共享(false sharing)的问题。此时如果一个核心修改了该变量,该修改需要同步到其它核心的缓存。在linux执行cat /proc/cpuinfo 来查看cpu的缓存的行大小:cache_alignment : 64,在目前的Intel处理器中c原创 2012-02-07 23:13:17 · 9666 阅读 · 2 评论 -
判断是否为欧拉图的并行算法
欧拉图:一个图为欧拉图,当且公当有一条回路经过图的每一条边且恰好经过一次。欧拉定理表明:一个图为欧拉图,当且仅当不含有奇度数的顶。假设图G大小为M * N和邻接矩阵A。 判断一个图是否为欧拉图,很容易在O(M*N)的时间内完成。为了说明方便,下面设M = N下面给出复杂度为O(Log(N)) 并行算法,注意这里只给出理论上可行的算法。1. 计算每个点原创 2012-02-01 00:17:09 · 5936 阅读 · 1 评论 -
一个简单问题的并行算法
设一个数列S[N], 其中S[0] = 0; S[k] = S[k - 1] + k ( 1 对于这个问题的求解串行算法相当简单,O(N)时间复杂度,不再解释。并行:假设有 M 个线程, 其中 M S[K] = S[K - 1] + K = S[K - 2] + K - 1 + K= S[K - 3] + K - 2 + K - 1 + k...= S[K原创 2012-01-30 16:48:19 · 1884 阅读 · 1 评论 -
读写锁算法
背景:在多线程编程中经常面临这样一个问题,同一个数据可以被多个线程同时读取,但是同一时间只能有一个线程对共享变量进行写操作。对该问题常用的解决方法时声明一个锁(互斥量)来对共享变量进行保护,这样每次只能有一个线程来对数据进行读写,会导致读取的效率低下。读写锁:读写锁算法主要实现对共享资源访问时,可以在多个线程间同时进行读操作,但是在同一时间内只能有一个线程对共享资源进行修改,并且在原创 2012-01-29 17:04:24 · 4126 阅读 · 0 评论 -
有序数组合并的并行算法(有一定限制)
如果A=(a1,a2,...,am)和B=(b1,b2,...,bn)是两个有序的升序数组,合并数组A和B就行形成一个新的升序数组包含A和B的有所有元素,假设A=(2,4,11,12,14,35,95,99),B=(6,7,9,25,26,31,42,85,87,102,105).如果合并A和B的数组,串行算法会遍历两个数组,然后将数组元素存到数组C中,开始时设置两个指针,分别指向数组A和B的原创 2012-01-28 16:03:34 · 2937 阅读 · 0 评论 -
介绍如何使用 POSIX 库在多线程环境中设计并发数据结构
简介现在,您的计算机有四个 CPU 核;并行计算 是最时髦的主题,您急于掌握这种技术。但是,并行编程不只是在随便什么函数和方法中使用互斥锁和条件变量。C++ 开发人员必须掌握的关键技能之一是设计并发数据结构。本文是两篇系列文章的第一篇,讨论如何在多线程环境中设计并发数据结构。对于本文,我们使用 POSIX Threads 库(也称为 Pthreads;见 参考资料 中的链接),但是也可以使用转载 2012-03-27 20:19:06 · 4702 阅读 · 0 评论