试谈 Cilk™Plus 并行程序性能优化的几个问题

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

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

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

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

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

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

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

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

及时发现这些常见的性能问题,我们可以借助性能优化工具来进行分析和定位。

针对Cilk™Plus并行程序的性能分析和优化,英特尔会在Parallel Studio 2011新版本中全面支持。

Пожалуйста, обратитесь к странице Уведомление об оптимизации для более подробной информации относительно производительности и оптимизации в программных продуктах компании Intel.
Возможность комментирования русскоязычного контента была отключена. Узнать подробнее.