この記事は、https://www.oneapi.io/spec/ で 2023年9月14日に公開された『oneAPI 1.3 Provisional Specification Rev. 1』 (HTML、PDF) をベースにしています。原文は2000 ページ近くあり、翻訳の時間とリソースも限られるため、全文翻訳ではなく、記事形式で区切った仕様とその解説を提供することにしました。
この回では、『oneAPI 1.3 Provisional Specification Rev. 1』の「oneCCL」の「Communication Operations」の節を取り上げています。
通信操作
このセクションでは、oneCCL 仕様で定義される通信操作について説明します。
データタイプ
oneCCL 仕様で定義されている通信操作に使用できるデータタイプについては、こちら (英語) を参照してください。
リダクション
oneCCL 仕様では、Allreduce、Reduce および ReduceScatter 集合操作に対しリダクション操作が定義されています。詳しくは、こちら (英語) を参照してください。
集合操作
oneCCL 仕様では、次の集合操作による通信操作が定義されています。
- Allgatherv
- Allreduce
- Alltoallv
- Barrier
- Broadcast
- Reduce
- ReduceScatter
これらの操作は集合操作です。つまり、oneCCL コミュニケーターに属するすべてのランクと通信する必要があり、集合操作の順番はすべてのランクで同一でなければなりません。
communicator は、コミュニケーターの作成に使用されるデバイスに応じて、ホストまたはデバイスのメモリーバッファーのどちらかで通信操作を行う機能を提供します。さらに、通信操作は、通信が関連する実行コンテキスト (ストリーム) およびイベントのベクトルを受け入れることがあります。出力イベント・オブジェクトは、操作の進行を追跡する機能も提供します。
注: 入力イベント処理のサポートはオプションです。
BufferType は、通信操作のデータバッファー (buf、send_buf および recv_buf) 内の要素の C++ タイプを定義するため以下で使用されます。少なくとも、[u]int{8/16/32/64}_t、float、double タイプがサポートされている必要があります。 関数の引数から推測できないデータ型を有効にするには、明示的に datatype パラメーターを指定しなければなりません。
注: 「カスタム Datatypes」を参照。
通信操作はストリーム・オブジェクトを受け入れる必要があります。コミュニケーターが native_device_type から作成された場合、デフォルトのストリームは対応するデバイスで native_stream_type に変換されます。
通信操作は属性オブジェクトを受け入れることがあります。パラメーターが指定されていない場合、デフォルトの属性オブジェクトが使用されます (default_<operation_name>_attr)。デフォルトの属性オブジェクトはライブラリーによって提供されます。
注: 「操作属性」を参照。
通信操作の呼び出しに指定された引数が操作の要件を満たしていない場合、特に定義されていない限り動作は未定義です。
Allgatherv
Allgatherv は、コミュニケーター内のすべてのランクから単一のバッファーにデータを収集する集合通信操作です。ランクが異なると、異なるサイズのセグメントが収集されることがあります。出力バッファーの結果データは、ランクごとに同一である必要があります。
構文とパラメーターについては、こちら (英語) を参照してください。
Allreduce
Allreduce は、コミュニケーターのすべてのランクの値に対しグローバルなリダクション操作を実行し、その結果をすべてのランクに送信する集合通信操作です。
構文とパラメーターについては、こちら (英語) を参照してください。
Alltoallv
Alltoall は、各ランクがそれぞれのランクに個別のデータブロックを送信する集合通信操作です。ブロックサイズは異なる可能性があります。i 番目のランクから捜査員された送信バッファーの j 番目のブロックは、j 番目のランクによって受信され、受信バッファーの i 番目のブロックに保持されます。
構文とパラメーターについては、こちら (英語) を参照してください。
Barrier
Barrier 同期は、コミュニケーターのすべてのランクで実行され、コミュニケーターのすべてのランクが呼び出しを終えたときにのみ完了します。
構文とパラメーターについては、こちら (英語) を参照してください。
Broadcast
Broadcast は、コミュニケーターの 1 つのランク (通常はルートとして示される) から、他のすべてのランクにデータを配信 (ブロードキャスト) する集合通信操作です。
構文とパラメーターについては、こちら (英語) を参照してください。
Reduce
Reduce は、コミュニケーターのすべてのランクの値に対しグローバルなレデュース操作を実行し、その結果をすべてのランクに送信する集合通信操作です。
構文とパラメーターについては、こちら (英語) を参照してください。
ReduceScatter
Reduce-scatter は、コミュニケーターのすべてのランクの値に対しグローバルなリダクション操作を実行し、その結果をすべてのランクに分散する集合通信操作です。
構文とパラメーターについては、こちら (英語) を参照してください。
ポイントツーポイント (P-P) 通信接続
ポイントツーポイント (P-P) 通信接続については、こちら (英語) を参照してください。
操作属性
oneCCL 仕様は、操作の動作修飾子として機能する通信操作の属性を定義します。オプションで、それらは対応する通信操作に渡されることがあります。
oneCCL 仕様では、次の操作属性のクラスが定義されています。
- allgatherv_attr
- allreduce_attr
- alltoallv_attr
- barrier_attr
- broadcast_attr
- reduce_attr
- reduce_scatter_attr
oneCCL 仕様は、操作属性オブジェクトを埋めるために使用できる属性識別子を定義します。
操作属性については、こちら (英語) を参照してください。
操作状況の追跡
oneCCL 通信操作は、操作の進行状況を追跡するために使用するイベント・オブジェクトを返します。
event クラスは、ブロック方式で操作の完了を待機する機能、非ブロッキング方式で完了ステータスをチェックする機能、および操作の完了時に通知されるネイティブ・オブジェクトを取得する機能を提供する必要があります。
イベント
イベントについては、こちら (英語) を参照してください。
エラー処理
oneCCL エラー処理は、C++ の例外メカニズムに関連しています。エラーが発生すると、標準の C++ エラー処理メカニズムを使用してキャッチされた関数呼び出しに伝搬されます。
例外の分類
oneCCL の例外分類は、C++ 標準ライブラリーの分類と一致しています。oneCCL は、oneCCL 例外クラスの階層に基本クラスを定義するクラスを導入します。すべての oneCCL ルーチンは、基本クラスから継承される例外をスローします。
oneCCL 例外階層では、ccl::exception は std::exception クラスから継承された基本クラスです。他のすべての oneCCL 例外クラスは、この基本クラスから派生しています。
この仕様では、エラーチェックを行う機能を実装する必要はありません。ただし、実装がエラーチェックを提供する場合、次の例外クラスを使用する必要があります。追加される実装固有の例外クラスは、これらのクラスのいずれにも適合しない例外条件に使用できます。
一般的な例外
例外クラス | 説明 |
---|---|
ccl::exception |
一般的な不特定のエラーをレポートします。 |
ccl::invalid_argument |
操作への引数が拒否されたときのエラーをレポートします。 |
ccl::host_bad_alloc |
ホストのメモリー割り当てで発生したエラーをレポートします。 |
ccl::unimplemented |
要求された操作が実装されていない場合にエラーをレポートします。 |
ccl::unsupported |
要求された操作がサポートされていない場合にエラーをレポートします。 |
法務上の注意書き
The content of this oneAPI Specification is licensed under the Creative Commons Attribution 4.0 International License (英語). Unless stated otherwise, the sample code examples in this document are released to you under the MIT license (英語).
This specification is a continuation of Intel’s decades-long history of working with standards groups and industry/academia initiatives such as The Khronos Group*, to create and define specifications in an open and fair process to achieve interoperability and interchangeability. oneAPI is intended to be an open specification and we encourage you to help us make it better. Your feedback is optional, but to enable Intel to incorporate any feedback you may provide to this specification, and to further upstream your feedback to other standards bodies, including The Khronos Group SYCL* specification, please submit your feedback under the terms and conditions below. Any contribution of your feedback to the oneAPI Specification does not prohibit you from also contributing your feedback directly to other standard bodies, including The Khronos Group under their respective submission policies.
By opening an issue, providing feedback, or otherwise contributing to the specification, you agree that Intel will be free to use, disclose, reproduce, modify, license, or otherwise distribute your feedback at its sole discretion without any obligations or restrictions of any kind, including without limitation, intellectual property rights or licensing obligations.
This document contains information on products, services and/or processes in development. All information provided here is subject to change without notice.
© Intel Corporation. Intel、インテル、Intel ロゴ、その他のインテルの名称やロゴは、Intel Corporation またはその子会社の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。