首页
社区
课程
招聘
[旧帖] [讨论]试谈 Cilk 并行程序性能优化的几个问题 0.00雪花
发表于: 2010-8-27 21:57 1262

[旧帖] [讨论]试谈 Cilk 并行程序性能优化的几个问题 0.00雪花

2010-8-27 21:57
1262

性能优化的问题,对于编写Cilk程序实现并行化也同样重要。

工作密取的调度算法能够帮助Cilk程序有效地将任务块分配到各个处理器(核)上,从而高效地利用处理器资源。但是如果没有仔细地设计算法,使得整个任务被分成少量的较大任务块,或者大量的小任务块,同样会因为缺乏足够的并行度使所有处理器保持忙碌状态,或者任务调度带来的大量额外开销,最终导致程序并行的实际效果并不理想。特别是当你使用cilk_spawn时,特别需要注意避免衍生出大量的小任务块。

通常情况下,Cilk程序常见的性能隐患大致会有以下几种:
1) cilk_for的GrainSize设置
英特尔编译器和运行系统会使用一个公式来计算缺省的粒度值。你也可以通过试验不同的粒度值来进行性能调优。

2) 锁竞争
使用锁通常会降低程序并行度而影响性能。

3) 高速缓存的效率和内存带宽
多个核对总线带宽的竞争限定了内存和处理器之间进行数据传输的速度。因此在设计和实现Clik并行程序时,要考虑到高速缓存效率和数据/空间局部性。

4) 内存分配
使用malloc,free,new,或者delete等在堆上分配或释放内存空间时,运行库会使用互斥锁来保护堆数据结构不被破坏。当Clik程序中个strand试图同时分配或释放内存空间时,对于锁的竞争会大幅降低程序的并行度。一个可行的解决方法是使用可缩放的内存管理器,比如Intel® Threading Building Block库(TBB)中提供的内存管理器。

5) 伪共享(False Sharing)
当两个或更多核拥有同一个高速缓存行的拷贝时就会产生伪共享。当某个核执行内存写操作,高速缓存硬件为了保证数据一致性,会将该行重新读入后才能再次访问。如果伪共享频繁发生,Cilk程序在性能上付出的代价可能会变得非常高昂。

6) 原子操作
编译器提供的原子操作会对高速缓存行进行加锁。因此,这些操作会和锁竞争一样影响性能。此外,由于对高速缓存是整行加锁,这样还可能导致伪共享。

这些常见的性能问题,我们可以借助性能优化工具来进行分析。针对Cilk并行程序的性能分析和优化,英特尔会在Parallel Studio新版本中全面支持。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//