多核编程技术3

$3 数据处理: private firstprivate lastprivate reduction copyin copyprivate 数据竞争的例子,j在循环外面,会出现数据竞争。 可以转为循环内部,或者在外部声明为const。 图像放缩的实例。 OpenMP性能很好,尤其是简单的应用。但是经常碰到其他的问题。看“任务调度与伪代码” 问题在于,使用dynamic的时候会出现数据竞争,用动态调度达到负载均衡的效果,但是声明步长 要较长(dynamic,16)。 barrier,可以显示调用的,达到多个线程同步机制,让所有线程执行结束。 nowait,不再隐含着barrier在后面, 而是直接执行后面的代码。(默认OpenMP是在循环后面加barrier操作的)。 order, 按照一定顺序执行。 OpenMP是通过在编译预处理来实现的。 线程分组竞争, 锁的数量》=cpu核数,指定哪几个线程用那几把锁。 随即竞争, 线程可以自由选择锁。 儒家观点:人之初,性本善。 西方观点:人之初,性本恶。 各种模式的基本思想:人类伦理的基本思想,善恶皆于“贪”-》优化,人有生以来具有特性。本能。自私,只不过程度不同。 每个线程有私有数据,还有多个线程共享的数据,显然操作私有数据会有更高的效率。不需要加锁解锁。 偷,强……也是优化方法。这些都是多核优化的最基本思想。 具体模式: 多线程对哈希表操作(查询,插入,删除)。 Bucket分段锁的多线程访问哈希表。 一个共享队列池,有些队列为空,从中读数据可能多次执行,加锁解锁操作。如何使用一次加锁解锁即可把数据取出? 对每个队列加标志位flag,通过判断flag的状态,来决定是否执行lock/unlock操作。 数据本地化模式(自私) TlsSetValue TlsGetValue 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值