複数の CPU コア上でバイナリーの実行をコントロール
環境変数
次の環境変数は、プログラムの実行中に複数の CPU コアへ SYCL* または OpenMP* スレッドの配置をコントロールします。OpenCL* ランタイムが CPU デバイスを使用して CPU にオフロードする場合、これらの変数を使用します。
環境変数 |
説明 |
|---|---|
DPCPP_CPU_CU_AFFINITY |
CPU へスレッド・アフィニティーを設定します。以下を指定できます。
この環境変数は、OpenMP* の OMP_PROC_BIND 環境変数に似ています。 デフォルト: 未設定 |
DPCPP_CPU_SCHEDULE |
スケジューラーが work-group をスケジュールするアルゴリズムを指定します。現在、DPC++ はインテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB) のスケジューラーを使用しています。この値は、oneTBB スケジューラーが使用するパーティショナーを選択します。以下を指定できます。
デフォルト: dynamic |
DPCPP_CPU_NUM_CUS |
カーネルの実行に使用するスレッド数を設定します。 オーバーサブスクリプション状態を回避するには、DPCPP_CPU_NUM_CUS の最大値をハードウェア・スレッド数にする必要があります。DPCPP_CPU_NUM_CUS が 1 である場合、すべての work-group は単一のスレッドで順番に実行されます。これはデバッグ時に役立ちます。 この環境変数は、OpenMP* の OMP_NUM_THREADS に似ています。 デフォルト: 未設定oneTBB によって決定されます。 |
DPCPP_CPU_PLACES |
アフィニティーを設定する場所を指定します。値は、{ sockets | numa_domains | cores | threads } のいずれかです。 この環境変数は、OpenMP* の OMP_PLACES 環境変数に似ています。 numa_domains が選択されると、oneTBB NUMA API が使用されます。これは、OpenMP* 5.1 の OMP_PLACES=numa_domains に似ています。oneTBB の task arena は numa ノードにバインドされ、SYCL* の nd-range は task arena に均一に分散されます。 DPCPP_CPU_PLACES は、DPCPP_CPU_CU_AFFINITY とともに使用することを推奨します。 デフォルト: cores |
サポートされる環境変数の詳細については、インテル® oneAPI DPC++/C++ コンパイラー・デベロッパー・ガイドおよびリファレンス (英語) をご覧ください。
ホストメモリー割り当て
OpenMP* を使用する場合、次の API を使用してホストメモリーを割り当て、デバイスと共有できます:
EXTERN void *llvm_omp_target_alloc_host(size_t Size, int DeviceNum)メモリー割り当ての詳細については、「レベルゼロ・コア・プログラミング・ガイド」を参照してください。
例1: ハイパースレッディング有効
2 つのソケットと、ソケットごとに 4 つの物理コアがあり、それぞれの物理コアに 2 つのハイパースレッドがあるマシンを想定します。
S<num>は、リストで指定される 8 つのコアを持つソケット番号を示しますT<num>は、インテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB) のスレッド数の示します"-" は未使用のコアを意味します
DPCPP_CPU_NUM_CUS=16
export DPCPP_CPU_PLACES=sockets
DPCPP_CPU_CU_AFFINITY=close: S0:[T0 T1 T2 T3 T4 T5 T6 T7] S1:[T8 T9 T10 T11 T12 T13 T14 T15]
DPCPP_CPU_CU_AFFINITY=spread: S0:[T0 T2 T4 T6 T8 T10 T12 T14] S1:[T1 T3 T5 T7 T9 T11 T13 T15]
DPCPP_CPU_CU_AFFINITY=master: S0:[T0 T1 T2 T3 T4 T5 T6 T7] S1:[T8 T9 T10 T11 T12 T13 T14 T15]
export DPCPP_CPU_PLACES=cores
DPCPP_CPU_CU_AFFINITY=close : S0:[T0 T8 T1 T9 T2 T10 T3 T11] S1:[T4 T12 T5 T13 T6 T14 T7 T15]
DPCPP_CPU_CU_AFFINITY=spread: S0:[T0 T8 T2 T10 T4 T12 T6 T14] S1:[T1 T9 T3 T11 T5 T13 T7 T15]
DPCPP_CPU_CU_AFFINITY=master: S0:[T0 T1 T2 T3 T4 T5 T6 T7] S1:[T8 T9 T10 T11 T12 T13 T14 T15]
export DPCPP_CPU_PLACES=threads
DPCPP_CPU_CU_AFFINITY=close: S0:[T0 T1 T2 T3 T4 T5 T6 T7] S1:[T8 T9 T10 T11 T12 T13 T14 T15]
DPCPP_CPU_CU_AFFINITY=spread: S0:[T0 T2 T4 T6 T8 T10 T12 T14] S1:[T1 T3 T5 T7 T9 T11 T13 T15]
DPCPP_CPU_CU_AFFINITY=master: S0:[T0 T1 T2 T3 T4 T5 T6 T7] S1:[T8 T9 T10 T11 T12 T13 T14 T15]
export DPCPP_CPU_NUM_CUS=8
DPCPP_CPU_PLACES=sockets, cores and threads have the same bindings:
DPCPP_CPU_CU_AFFINITY=close close: S0:[T0 - T1 - T2 - T3 -] S1:[T4 - T5 - T6 - T7 -]
DPCPP_CPU_CU_AFFINITY=close spread: S0:[T0 - T2 - T4 - T6 -] S1:[T1 - T3 - T5 - T7 -]
DPCPP_CPU_CU_AFFINITY=close master: S0:[T0 T1 T2 T3 T4 T5 T6 T7] S1:[]例2: ハイパースレッディング無効
2 つのソケットと、ソケットごとに 4 つの物理コアがあり、それぞれの物理コアに 2 つのハイパースレッドがあるマシンを想定します。
S<num>は、リストで指定される 8 つのコアを持つソケット番号を示しますT<num>は、oneTBB のスレッド番号を表します"-" は未使用のコアを意味します
export DPCPP_CPU_NUM_CUS=8
DPCPP_CPU_PLACES=sockets, cores and threads have the same bindings:
DPCPP_CPU_CU_AFFINITY=close: S0:[T0 T1 T2 T3] S1:[T4 T5 T6 T7]
DPCPP_CPU_CU_AFFINITY=spread: S0:[T0 T2 T4 T6] S1:[T1 T3 T5 T7]
DPCPP_CPU_CU_AFFINITY=master: S0:[T0 T1 T2 T3] S1:[T4 T5 T6 T7]
export DPCPP_CPU_NUM_CUS=4
DPCPP_CPU_PLACES=sockets, cores and threads have the same bindings:
DPCPP_CPU_CU_AFFINITY=close: S0:[T0 - T1 - ] S1:[T2 - T3 - ]
DPCPP_CPU_CU_AFFINITY=spread: S0:[T0 - T2 - ] S1:[T1 - T3 - ]
DPCPP_CPU_CU_AFFINITY=master: S0:[T0 T1 T2 T3] S1:[ - - - - ]