複数の CPU コア上でバイナリーの実行をコントロール

環境変数

次の環境変数は、プログラムの実行中に複数の CPU コアへ SYCL* または OpenMP* スレッドの配置をコントロールします。OpenCL* ランタイムが CPU デバイスを使用して CPU にオフロードする場合、これらの変数を使用します。

表 3 SYCL* または OpenMP* 環境変数

環境変数

説明

DPCPP_CPU_CU_AFFINITY

CPU へスレッド・アフィニティーを設定します。以下を指定できます。

  • close - スレッドは利用可能な CPU コアに連続して配置されます。

  • spread - スレッドは利用可能なコアに分散されます。

  • master - スレッドはマスタースレッドと同じコアに配置されます。DPCPP_CPU_CU_AFFINITY が設定されているとマスタースレッドも固定されます (未設定では固定されません)。

この環境変数は、OpenMP* の OMP_PROC_BIND 環境変数に似ています。

デフォルト: 未設定

DPCPP_CPU_SCHEDULE

スケジューラーが work-group をスケジュールするアルゴリズムを指定します。現在、DPC++ はインテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB) のスケジューラーを使用しています。この値は、oneTBB スケジューラーが使用するパーティショナーを選択します。以下を指定できます。

  • dynamic - oneTBB の auto_partitioner。負荷を分散するため適切な分割を行います。

  • affinity - oneTBB の affinity_partitioner。subrange をワーカースレッドにマッピングすることで、auto_partitioner のキャッシュ・アフィニティーを向上させます。

  • static - oneTBB の static_partitioner。range の反復をワーカースレッド間でできるだけ均等に分散します。TBB パーティショナーは、grainsize を使用してチャンクの大きさを制御します。デフォルトの grainsize は 1 であり、すべての work-group を独立して実行できることを示します。

デフォルト: 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:[ - - - - ]