Section 5 - ベクトル設計の例
プログラミング例は、Ryzen™ AIのAI EngineとNPU配列の独自機能をさらに説明するための多数のサンプル設計です。
最もシンプルな例
Passthrough
passthrough例は、最もシンプルな「入門」例です。ベクトル化されたロードとストアを使用して、入力から出力へ4096バイトをコピーします。この設計例は、他の例でも簡単に再現できる典型的なプロジェクト構成を示しています。ここで重要なファイルは実質4つだけです。
passthrough_kernel.py- 外部メモリに接続されたシムタイルと、コピーを実行する単一のAIEコアを含むAIE構造設計。セクション2で説明されているObject FIFOの簡単な使用例も示しています。passthrough.cc- ベクトル化されたコピー操作を実行するC++ファイル。test.cppまたはtest.py- 設計を実行し、CPUリファレンスと比較するためのC++またはPythonメインアプリケーション。Makefile- 様々なアーティファクトのビルドプロセスを文書化(および実装)するMakefile。
passthrough DMAs例は、コアを使わずにループバックを実行してコピーを行う別の方法を示しています。
基本設計
| 設計名 | データ型 | 説明 |
|---|---|---|
| Vector Scalar Add | i32 | ベクトルの各要素に1を加算 |
| Vector Scalar Mul | i32 | ベクトルにスケールファクタを乗算 |
| Vector Vector Add | i32 | 2つのベクトルを加算 |
| Vector Vector Modulo | i32 | ベクトル同士の剰余演算 |
| Vector Vector Multiply | i32 | 2つのベクトルの要素ごとの乗算 |
| Vector Reduce Add | bfloat16 | ベクトルの全要素の合計値を返す |
| Vector Reduce Max | bfloat16 | ベクトルの全要素の最大値を返す |
| Vector Reduce Min | bfloat16 | ベクトルの全要素の最小値を返す |
| Vector Exp | bfloat16 | 入力のexを表すベクトルを返す |
| DMA Transpose | i32 | npu_dma_memcpy_ndを使用してShim DMAで行列を転置 |
| Matrix Scalar Add | i32 | 行列とスカラーの乗算 |
| Single core GEMM | bfloat16 | 単一コアの行列-行列乗算 |
| Multi core GEMM | bfloat16 | オペランドブロードキャストを使用した16個のAIEによる行列-行列乗算。シンプルな「その場で累積」戦略を使用 |
| GEMV | bfloat16 | ベクトルを返すベクトル-行列乗算 |
機械学習カーネル
| 設計名 | データ型 | 説明 |
|---|---|---|
| Eltwise Add | bfloat16 | 2つのベクトルの要素ごとの加算 |
| Eltwise Mul | i32 | 2つのベクトルの要素ごとの乗算 |
| ReLU | bfloat16 | ベクトルに対する正規化線形ユニット(ReLU)活性化関数 |
| Softmax | bfloat16 | 行列に対するSoftmax演算 |
| Conv2D | i8 | CNN用の単一コア2次元畳み込み |
| Conv2D+ReLU | i8 | ベクトルレジスタレベルでReLUが融合されたConv2D |
演習問題
-
passthrough設計を変更して、より多く(または少なく)データをコピーできますか?
答えを見る
Makefileを確認してください。in1_sizeとout_sizeを変更します。 -
Vector Exp例のtest.cppのテストベンチを見てください。データ型とテストベクトルのサイズに注目してください。何に気づきますか?
答えを見る
65536個の値、つまり2^16個をテストしています。したがって、すべての可能なbfloat16値を近似を通してテストしています。 -
ReLUにおける通信対計算比は何ですか?
答えを見る
トレースによると約6です。これが、Conv2DやGEMMとのカーネル融合が機械学習において有効な理由です。 -
難問 どの基本例がSoftmaxのコンポーネントになっていますか?
答えを見る
Vector Exp