概要
AXCL は、AXERA チッププラットフォーム上でディープニューラルネットワーク推論、トランスコードなどのアプリケーションを開発するための C 言語 / Python API ライブラリで、実行リソース管理、メモリ管理、モデルの読み込みと実行、メディアデータ処理などの API を提供します。以下はその論理アーキテクチャ図です。
概念
AXCL ランタイムライブラリには Device、Context、Stream、Task などの基本概念があり、その関係は以下の図の通りです。
- Device:計算およびメディア処理を提供するハードウェアデバイスで、PCIe インターフェースを介してホストと接続します。
- Device のライフサイクルは初回の
axclrtSetDevice 呼び出しで開始します。 - Device は参照カウントでライフサイクルを管理し、
axclrtSetDevice で + 1、axclrtResetDevice で - 1 されます。 - 参照カウントがゼロになると、当該プロセス内で Device 資源は使用不可になります。
- 複数の Device が存在する場合、各 Device 間でメモリは共有できません。
- Context:実行コンテキストコンテナで、Stream やメモリなどのライフサイクルを管理し、アプリケーションスレッドにバインドされます。1 つの Context は必ず 1 つの Device に所属します。Context には暗黙と明示の 2 種類があります:
- 暗黙的 Context(デフォルト Context):
axclrtSetDevice でデバイスを指定すると、暗黙的 Context が作成され、axclrtResetDevice の参照カウントがゼロになると自動的に破棄されます。 - 1 つの Device に暗黙的 Context は 1 つだけで、
axclrtDestroyContext で破棄できません。
- 明示的 Context:
axclrtCreateContext で作成し、axclrtDestroyContext で破棄します。 - プロセス内では Context を共有でき、
axclrtSetCurrentContext で切り替え可能。各スレッドで明示的 Context を作成・破棄することを推奨。
- Stream:実行タスクフローで、Context に所属し、同一 Stream 内のタスクは順序通りに実行されます。Stream も暗黙と明示の 2 種類があります:
- 暗黙的 Stream(デフォルト Stream):
- 各 Context に 1 つの暗黙的 Stream が作成され、ライフサイクルは Context に従属します。
- ネイティブ sdk モジュール(例:
AXCL_VDEC_XXX、AXCL_SYS_XXXなど)は暗黙的 Stream を使用します。
- 明示的 Stream:
axclrtCreateStream で作成し、axclrtDestroyStream で破棄します。 - 所属先 Context が破棄された場合、その Stream は未破棄でも使用不可になります。
- Task:Device のタスク実行実体であり、アプリケーションからは見えません。
アプリケーションスレッドと Context
- アプリケーションスレッドは必ず 1 つの Context にバインドされ、全ての Device タスクは Context を基盤として実行されます。
- 1 スレッド内には常に 1 つの Context が存在し、その Context は当該スレッドでタスクを実行する Device にバインドされています。
- 1 スレッド内で
axclrCreateContext により複数の Context を作成可能ですが、同時使用できるのは 1 つのみです。複数作成すると、最後に作成された Context がバインドされます。 - プロセス内では
axclrtSetCurrentContext により現在のスレッドに Context をバインドできます。複数回連続で呼び出すと、最後の Context がバインドされます。 - マルチスレッド環境では、各スレッドで明示的に Context を作成することを推奨します。
- デバイス切り替えは
axclrtSetCurrentContext を推奨します。
ヒント
SDK の axcl/sample/runtime に、スレッド内での Context 作成と破棄方法のサンプルコードがあります。