如何在C ++程序中以并行模式(-D_GLIBCXX_PARALLEL)操作g ++中的运行时设置?

时间:2014-04-24 19:36:05

标签: parallel-processing g++ c++14

在阅读GCC 4.9.0 Standard C++ Library Reference Manual时,我了解了g ++编译器并行支持STL算法的用法。这也被提议(N3960)包含在未来的c ++标准中。

有许多属性具有以g ++设置的默认值(例如,关于算法决定是使用顺序还是并行的元素的最小阈值限制)。但是,有读取/更改其值的接口。这些都已在头文件 parallel / settings.h 中定义。大多数属性都是自解释的,因为它们是阈值,决定我们的程序是否使用并行版本的算法。以下是 struct _Settings 构造函数的当前gcc4.9版本实现,它将所有属性设置为合理的值。

        algorithm_strategy(heuristic),
        sort_algorithm(MWMS),
        .........
        find_initial_block_size(256),
        find_maximum_block_size(8192),
        ...........
        workstealing_chunk_size(100),
        L1_cache_size(16 << 10),
        L2_cache_size(256 << 10),
        TLB_size(128),
        cache_line_size(64),
        qsb_steals(0),
        search_minimal_n(1000),
        find_scale_factor(0.01f)

但是,我想了解在 struct _Settings 中如何/何时使用以下属性?应该如何使用它们以及何时应该更改这些属性以验证它将如何影响c ++程序?

L1_cache_size
L2_cache_size
cache_line_size

1 个答案:

答案 0 :(得分:2)

  

这也被提议(N3960)包含在未来的c ++标准中。

该草案TS的内容与GNU C ++库的并行模式算法不同。它们基于不同的设计,来自不同的人群。

  

应该如何使用它们以及何时应该更改这些属性以验证它将如何影响c ++程序?

您可以将缓存大小设置为CPU的正确值,因为不同的CPU具有不同的缓存。

您告诉图书馆使用哪种设置,例如对于具有64kB L1高速缓存和256kB L2高速缓存的CPU:

__gnu_parallel::_Settings settings;  // constructed with default values
settings.L1_cache_size = 64 << 10;
settings.L2_cache_size = 256 << 10;
__gnu_parallel::_Settings::set(settings);  // change global settings