留言反馈 用户登录 用户注册
 首页 >> 最好用还可以终身使用的永久财泉免费进销存软件免费下载官方网站 >> 技术知识库 >> 正文

利用多核多线程进行程序优化

方案能充分提高效率,但使得设计更加复杂,维护操作困难,不得不借助其他机制来保证程序的正确性。

针对 Cache 的优化

在串行程序设计过程中,为了节约带宽或者存储空间,比较直接的方法,就是对数据结构做一些针对性的设计,将数据压缩 (pack) 的更紧凑,减少数据的移动,以此来提高程序的性能。但在多核多线程程序中,这种方法往往有时会适得其反。

数据不仅在执行核和存储器之间移动,还会在执行核之间传输。根据数据相关性,其中有两种读写模式会涉及到数据的移动:写后读和写后写 ,因为这两种模式会引发数据的竞争,表面上是并行执行,但实际只能串行执行,进而影响到性能。

处理器交换的最小单元是 cache 行,或称 cache 块。在多核体系中,对于不共享 cache 的架构来说,两个独立的 cache 在需要读取同一 cache 行时,会共享该 cache 行,如果在其中一个 cache 中,该 cache 行被写入,而在另一个 cache 中该 cache 行被读取,那么即使读写的地址不相交,也需要在这两个 cache 之间移动数据,这就被称为 cache 伪共享,导致执行核必须在存储总线上来回传递这个 cache 行,这种现象被称为“乒乓效应”。

同样地,当两个线程写入同一个 cache 的不同部分时,也会互相竞争该 cache 行,也就是写后写的问题。上文曾提到,不加锁的方案反而比加锁的方案更慢,就是互相竞争 cache 的原因。

在 X86 机器上,某些处理器的一个 cache 行是64字节,具体可以参看 Intel 的参考手册。

既然不加锁三线程方案的瓶颈在于 cache,那么让 apple 的两个成员 a 和 b 位于不同的 cache 行中,效率会有所提高吗?

修改后的代码片断如下:

清单 4. 针对Cache的优化
struct apple
{
unsigned long long a;
char c[128]; /*32,64,128*/
unsigned long long b;
};

测量结果如下图所示:

图 4. 增加 Cache 时间耗时对比图
null

小小的一行代码,尽然带来了如此高的收益,不难看出,我们是用空间来换时间。当然读者也可以采用更简便的方法: __attribute__((__aligned__(L1_CACHE_BYTES))) 来确定 cache 的大小。

如果对加锁三线程方案中的 apple 数据结构也增加一行类似功能的代码,效率也是否会提升呢?性能不会有所提升,其原因是加锁的三线程方案效率低下的原因不是 Cache 失效造成的,而是那把锁。

在多核和多线程程序设计过程中,要全盘考虑多个线程的访存需求,不要单独考虑一个线程的需求。在选择并行任务分解方法时,要综合考虑访存带宽和竞争问题,将不同处理器和不同线程使用的数据放在不同的 Cache 行中,将只读数据和可写数据分离开。

CPU 亲和力

CPU 亲和力可分为两大类:软亲和力和硬亲和力。

Linux 内核进程调度器天生就具有被称为 CPU 软亲和力(affinity) 的特性,这意味着进程通常不会在处理器之间频繁迁移。这种状态正是我们希望的,因为进程迁移的频率小就意味着产生的负载小。但不代表不会进行小范围的迁移。

CPU 硬亲和力是指进程固定在某个处理器上运行,而不是在不同的处理器之间进行频繁的迁移。这样不仅改善了程序的性能,还提高了程序的可靠性。

从以上不难看出,在某种程度上硬亲和力比软亲和力具有一定的优势。但在内核开发者不断的努力下,2.6内核软亲和力的缺陷已经比2.4的内核有了很大的改善。

在双核机器上,针对两线程的方案,如果将计算 apple 的线程绑定到一个 CPU 上,将计算 orange 的线程绑定到另外一个 CPU 上,效率是否会有所提高呢?

程序如下:

清单 5. CPU 亲和力
struct apple
{
unsigned long long a;
unsigned long long b;
};

struct orange
{
int a[ORANGE_MAX_VALUE];
int b[ORANGE_MAX_VALUE];
};

inline int set_cpu(int i)
{
CPU_ZERO(&mask);

if(2 <= cpu_nums)
{
CPU_SET(i,&mask);

if(-1 == sched_setaffinity(getti

9 7 3 1 2 3 4 4 8 :
软件开发网 天天精品下载 泡泡网高速下载 免费金山毒霸下载 微山财泉免费进销存 北京海淀科技委 北京产权交易所 北京软件行业协会
遵化财泉代理 IT专家网 信息化it168 比特网 计算机与IT行业网群 国家863中部软件园 国家工业信息化部 中国中小企业协会
中国软件外包网 中国计算机用户 中国计算机报 中国双软认定网 中国软件评测中心 中国软件行业协会 新浪财泉免费进销存 逊色资源站免费进销存
保定供求网免费进销存 阿里伯乐 管家婆软件 google财泉免费进销存 百度财泉免费进销存 慧聪财泉免费进销存 优酷视频免费进销存 天空软件商城免费进销存
soso财泉免费进销存 免费服装进销存软件 华军软件园免费进销存 天空软件站免费进销存 中国软件网免费进销存 绿色软件联盟免费进销存 中关村在线免费进销存 财泉软件免费进销存
Copyright @ 2006 天地合华科技 All Rights Reserved 北京天地合华科技有限责任公司 京ICP备09031756号
电话:010-51664188 51664189 51667681 邮箱:412414798@qq.com 地址:北京市海淀区阜成路42号中裕商务花园1号楼101室