条件:
デュアル ソケットXeonを備えた HPC サーバーの説明に従って、AMD OpenCL バージョンAMD-APP-SDK-v2.8-lnx64および Intel OpenCL バージョン *intel_sdk_for_ocl_applications_xe_2013_r2_sdk_3.1.1.11385_x64* (バージョン識別はこれ以上複雑ではありません) をインストールしました。 E5-2650、Xeon Phi コプロセッサー、64 GB のホスト メモリ、および Red Hat Enterprise Server 6.4。
問題の説明:
NUMAの問題を回避するために、OpenCLでデバイスの分割を行いたいと考えています。残念ながら、デバイス (Intel CPU) または Linux カーネルがCL_DEVICE_PARTITION_BY_AFFINITY_DOMAINをサポートしていないようです。Intel OpenCL と AMD OpenCL の両方を試しました。AMD OpenCL デバイス クエリでは、アフィニティ ドメイン オプションをサポートしていると表示されていますが、実際にはサポートされていません。フォーラムの投稿によると、これは現在の Intel OpenCL ドライバーのバグだと思います。
考えられる解決策:
(合計 32 個の並列計算コアから) 最初の 16 個の並列計算コア (8 コア + 8 ハイパースレッド) を選択できれば、それらは最初のソケットにマップされると考えました。残念ながら、Intel OpenCL は 16 個の並列計算コアを 32 個のコアにランダムに分散します。一方、AMD OpenCL は最初の 16 個の並列計算コアを選択しますが、OpenCL コンパイラは私が実行しているカーネルでうまく機能しません。ここでもランチなしの定理が成り立ちます。
質問:
- OpenCL が計算に使用する並列計算コアを指定する方法はありますか?
- OpenCL でこの NUMA の問題を解決する方法はありますか?
NUMA アフィニティの経験に関するコメントは大歓迎です。
ありがとうございました!
アップデート
単一ソケットのテストにのみ適用される部分的な回避策:
(Linux の場合) NUMA ノードからすべてのコアを無効にして、OpenCL ICD が他の NUMA ノードのハードウェア スレッドからのみ選択できるようにします。例えば。2 ソケット 32 HTT システムの場合:
sudo sh -c "echo 0 > /sys/devices/system/cpu/cpu31/online"
....
sudo sh -c "echo 0 > /sys/devices/system/cpu/cpu16/online"
このハッキングに副作用がないかどうかはわかりませんが、これまでのところ (少なくともテストでは) 機能しているようです。