インテル® TBB 2020 の有用な機能: task_arena NUMA サポート

インテル® oneTBB

この記事は、インテル® デベロッパー・ゾーンに公開されている『Intel® Threading Building Blocks Documentation』の「task_arena NUMA support」(https://software.intel.com/en-us/node/841376) の日本語参考訳です。


概要

NUMA トポロジーを尊重するインターフェイス。

ヘッダー

#define TBB_PREVIEW_NUMA_SUPPORT 1
#include "tbb/task_arena.h"

この機能を使用するには、インテル® TBB プレビューバイナリーとリンクする必要があります。

説明

このプレビュー機能により、ワークを処理する task_arena に参加するスレッドを、指定する NUMA ノードにバインドできます。NUMA トポロジーに関する情報は、namespace tbb::info API を使用してトラバースできます。

メンバー

namespace tbb {
    class task_arena {
    public:
        struct constraints {
            numa_node_id numa_node;
            int max_concurrency;

            constraints(numa_node_id numa_node_       = task_arena::automatic,
                        int          max_concurrency_ = task_arena::automatic);
        };

        task_arena(constraints constraints_, unsigned reserved_for_masters = 1);
        void initialize(constraints constraints_, unsigned reserved_for_masters = 1);
    };
}

次の表は、これらのインターフェイスをのメンバーに関する追加情報を提供します。

メンバー 説明
struct task_arena::constraints task_arena 内のスレッドに適用される制限を表します。
  • numa_node – NUMA ノードを一意に識別する整数論理インデックス。task_arena に参加するすべてのスレッドは、この NUMA ノードにバインドされます。

    NUMA ノード ID は、tbb/info.h にある tbb::info::numa_nodes() を介して取得された場合に有効となります。

  • max_concurrencytask_arena 内で同時に処理するワークに参加できるスレッドの最大数。
task_arena(constraints constraints_, unsigned reserved_for_masters = 1) 指定された制限で task_arena を作成します。最大同時実行数の制限の一部は、reserved_for_masters を使用してアプリケーション・スレッド向けに予約できます。予約量は最大同時実行数の制限を超えることはできません。

注意

max_concurrency および reserved_for_masters が明示的に 1 以上に設定されている場合、インテル® TBB のワーカースレッドはアリーナに参加しません。その結果、これらのアリーナではキューに入れられたタスクの実行は保証されません。task_arena::enqueue() および task::enqueue() は、ワーカースレッドを持たないアリーナで使用してはなりません。

ここで、constraints.numa_node が指定されていると、アリーナに入るすべてのスレッドは、対応する NUMA ノードに自動的にバインドされます。

void initialize(constraints constraints_, unsigned reserved_for_masters = 1)

内部領域表現の初期化を実行します。引数が指定されている場合、以前のアリーナ・パラメーターをオーバーライドします。すでに初期化されているアリーナに対して呼び出された場合、メソッドは効果がありません。

initialize を呼び出した後は、task_arena パラメーターは固定され変更することはできません。

この例は、task_arena NUMA サポート拡張機能を示します。構築されたそれぞれの task_arena は、対応するノードに固定 (ピニング) されます。プラットフォームが NUMA 機能を持たない場合、この例は 1 つの task_arena だけ作成し、task_arena に入るスレッドはハードウェア・リソースにバインドされません。

#define TBB_PREVIEW_NUMA_SUPPORT 1

#include "tbb/task_group.h"
#include "tbb/task_arena.h"

#include <vector>

int main() {
    std::vector<tbb::numa_node_id> numa_nodes = tbb::info::numa_nodes();
    std::vector<tbb::task_arena> arenas(numa_nodes.size());
    std::vector<tbb::task_group> task_groups(numa_nodes.size());

    for (int i = 0; i < numa_nodes.size(); i++) {
        arenas[i].initialize(tbb::task_arena::constraints(numa_nodes[i]));
    }

    for (int i = 0; i < numa_nodes.size(); i++) {
        arenas[i].execute([&task_groups, i] {
            task_groups[i].run([] {
                /* 指定する NUMA ノードに固定されたスレッドで実行 */
            });
        });
    }

    for (int i = 0; i < numa_nodes.size(); i++) {
        arenas[i].execute([&task_groups, i] {
            task_groups[i].wait();
        });
    }

    return 0;
}

上位トピック: プレビュー機能
https://software.intel.com/node/9cdc17ab-6c36-4422-b85d-ff5fb1be8587

関連情報

task_arena クラス (英語)

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

タイトルとURLをコピーしました