多核编程技术3

来源:互联网 发布:欧洲经济知乎 编辑:程序博客网 时间:2024/05/17 02:42
$3数据处理:privatefirstprivatelastprivatereductioncopyin copyprivate数据竞争的例子,j在循环外面,会出现数据竞争。 可以转为循环内部,或者在外部声明为const。图像放缩的实例。OpenMP性能很好,尤其是简单的应用。但是经常碰到其他的问题。看“任务调度与伪代码”问题在于,使用dynamic的时候会出现数据竞争,用动态调度达到负载均衡的效果,但是声明步长要较长(dynamic,16)。barrier,可以显示调用的,达到多个线程同步机制,让所有线程执行结束。nowait,不再隐含着barrier在后面, 而是直接执行后面的代码。(默认OpenMP是在循环后面加barrier操作的)。order, 按照一定顺序执行。OpenMP是通过在编译预处理来实现的。线程分组竞争,锁的数量》=cpu核数,指定哪几个线程用那几把锁。随即竞争,线程可以自由选择锁。儒家观点:人之初,性本善。西方观点:人之初,性本恶。各种模式的基本思想:人类伦理的基本思想,善恶皆于“贪”-》优化,人有生以来具有特性。本能。自私,只不过程度不同。每个线程有私有数据,还有多个线程共享的数据,显然操作私有数据会有更高的效率。不需要加锁解锁。偷,强……也是优化方法。这些都是多核优化的最基本思想。具体模式:多线程对哈希表操作(查询,插入,删除)。Bucket分段锁的多线程访问哈希表。一个共享队列池,有些队列为空,从中读数据可能多次执行,加锁解锁操作。如何使用一次加锁解锁即可把数据取出?对每个队列加标志位flag,通过判断flag的状态,来决定是否执行lock/unlock操作。数据本地化模式(自私)TlsSetValueTlsGetValue thread local storage 批量处理模式:列表遍历,10万个节点,每次每次访问2个节点,加解锁,只有5万次了。TBB内存管理算法,用到了该模式。流水线模式:对整个工作分步骤处理,每个线程处理一个步骤。数据分解模式:数据依赖关系问题,不能简单的分解。负载均衡,分析具体数据结构。数据边界上的伪共享问题。矩阵横分解,要比竖分解优越很多。伪共享只有一个数据,而不是一组。思考:如何对矩阵进行分块相乘?(伪共享,Cache的命中率)为了提cache命中率,乘法后面的矩阵往往需要进行转置,再横向分块!!Map-Reduce(google)有一个文本文件,只包含字母和数字,如何统计字母个数?任务图调度(n-p难题)并行化计算的核心问题。OpenMP对循环进行分解是一个最简单的图。两个顶点。有依赖关系的任务步骤,构成图。例如,f1,f2,f3……f10函数有依赖关系,指针数组p1……pn指向他们。f6……f10依赖f1……f5才是一般意义的图,无环有向图。结构化程序:顺序,分支,循环。http://gforge.osdn.net.cn/projects/capi
原创粉丝点击