每当有人对应用程序进行并行处理时,预期结果都是一个不错的加速,但情况并非总是如此。
通常,在x
秒内运行并且使用8个内核的程序将达不到x/8
秒(最佳加速)。在某些极端情况下,它甚至比原始顺序程序花费更多时间。
为什么?,最重要的是,如何提高可扩展性?
答案 0 :(得分:2)
导致不可扩展性的原因有几个:
1.1。确保使用算法可能的最小同步。例如,使用openmp
,从synchronized
到atomic
的简单更改可能会产生相关差异。
1.2有时,较差的顺序算法可能会提供更好的并行机会,如果你有机会尝试别的东西,它可能值得一试。
2.1优化局部性:这意味着要了解应用程序的运行位置,可用的缓存内容以及如何更改数据结构以最大化缓存使用率。
答案 1 :(得分:0)
所有RSFalcon7的建议都可以合并为一个“超级规则”:尽可能多地在非共享资源(L1和L2缓存)中执行 - 意味着节省代码和数据要求 - 如果您需要转到共享资源在进入RAM之前,在进入RAM之前尽可能多地做L3(在进入磁盘之前,同步所需的CPU周期是可变的,但比访问RAM要慢或者慢得多)。
如果你计划利用超线程,我发现使用gcc编译的代码将优化级别O1使用超线程,而不是O2或O3。