SIMD

行列の積

FMA命令を使用し、行列の積を求めるプログラムを紹介します。行列a (n × m) と b (m × p) の積 c は(n × p) の行列です。分かりやすいように、行列を以降に示します。 これらの積をc に求めるには、 を行います。行列c を以降に示します。

性能評価:FMA

C++言語で記述したプログラムと、アセンブリ言語で記述した関数を利用したときの性能差を検証してみましょう。

FMA

AVX-512はFMA(fused multiply-add、 融合積和)命令を実装しています。FMA命令を数式にしたものを以下に示します。 a × b + k 式が表すように、積と和が合体した演算です。性能が向上すだけでなく、丸め(浮動小数点数で正確に表せない値を近い値にする)が…

任意長の配列処理

以前紹介した、一連の「一次元配列同士の演算」などを任意長を扱えるように拡張します。 arques.hatenablog.com 機能は、配列同士の各要素を演算し、別の配列へ格納するするプログラムです。処理概要を図で示します。

性能評価:特定値のインデックス抽出

C++言語で記述したプログラムと、アセンブリ言語で記述した関数を利用したときの性能差を検証してみましょう。

特定値のインデックス抽出

一次元配列の各要素を検査し、与えられた値と一致する要素のインデックスを抽出します。戻り値は一次元配列に存在する特定値の数です。

性能評価:抽出・インデックス

C++言語で記述したプログラムと、アセンブリ言語で記述した関数を利用したときの性能差を検証してみましょう。

抽出・インデックス

一次元配列の各要素を検査し、条件を満足していたら、その要素を抽出します。当時に抽出した要素の位置を得ます。ここでは任意の値以上の要素を抽出、任意の値以下の要素を抽出、任意範囲の要素を抽出するとともに、そのインデックスを得る例を示します。前…

性能評価:抽出

C++言語で記述したプログラムと、アセンブリ言語で記述した関数を利用したときの性能差を検証してみましょう。

抽出

一次元配列の各要素を検査し、条件を満足していたら、その要素を抽出します。ここでは任意の値以上の要素を抽出する、任意の値以下の要素を抽出する、任意範囲の要素を抽出する例を示します。以降に処理概要を図で示します。

性能評価:総和

一次元配列の総和を求めるプログラムを応用して、C++言語で記述したプログラムと、アセンブリ言語で記述した関数を利用したときの性能差を検証してみましょう。

総和

一次元配列の総和を求めるプログラムを紹介します。以降に処理の概要図を示します。

性能評価:値の検索

一次元配列から特定の値を探すプログラムを応用して、C++言語で記述したプログラムと、アセンブリ言語で記述した関数を利用したときの性能差を検証してみましょう。

値の検索

特定の値を一次元配列内から探し、そのインデックス値を返します。指定した値が配列内に存在しない時は-1を返します。特定の値が一次元配列内に複数含まれる場合は、一番若いインデックス値を返します。以降に処理の概要図を示します。

性能評価:最小値・最大値・インデックス

一次元配列から最小値・最大値を探すプログラムを応用して、C++言語で記述したプログラムと、アセンブリ言語で記述した関数を利用したときの性能差を検証してみましょう。

最小値・最大値・インデックス

一次元配列に含まれる最小値か最大値を見つけ、かつその位置を得るプログラムを紹介します。以降に処理の概要図を示します。

性能評価:最小値・最大値

一次元配列から最小値・最大値を探すプログラムを応用して、C++言語で記述したプログラムと、アセンブリ言語で記述した関数を利用したときの性能差を検証してみましょう。

最小値・最大値

一次元配列に含まれる最小値か最大値を見つけるプログラムを紹介します。以降に処理の概要図を示します。

任意範囲へ飽和:符号付・なし

任意の範囲へ飽和させる飽和処理を紹介します。

型飽和:符号付・なし型

データ型を変更するとき、特に大きなデータ型から小さなデータ型へ変換するときにオーバーフローやアンダーフローが発生しないように飽和させて代入する必要があります。ここでは、そのような型飽和処理を紹介します。 符号付、あるいは符号なし64ビット整数…

性能評価:予測と分岐・加算とクリア

予測と分岐・加算とクリアのプログラムを応用して、C++言語で記述したプログラムと、アセンブリ言語で記述した関数を利用したときの性能差を検証してみましょう。性能評価は「予測と分岐・加算とクリア・64ビット浮動小数点型」を用います。

予測と分岐・加算とクリア・32ビット浮動小数点型

配列の値によって処理を変更するプログラム紹介します。 AVX-512 命令のマスクレジスターを使用すると、プレディケーション(分岐の排除)によって、条件判断が必要な処理を効率良く実行できます。

予測と分岐・加算とクリア・64ビット浮動小数点型

配列の値によって処理を変更するプログラム紹介します。 AVX-512 命令のマスクレジスターを使用すると、プレディケーション(分岐の排除)によって、条件判断が必要な処理を効率良く実行できます。プレディケーションでは、各レーンで命令を実行するかしない…

性能評価:予測と分岐・設定

予測と分岐・設定のプログラムを応用して、C++言語で記述したプログラムと、アセンブリ言語で記述した関数を利用したときの性能差を検証してみましょう。性能評価は「予測と分岐:設定・64ビット整数型」を用います。

予測と分岐・設定・32ビット浮動小数点型

プレディケーション(分岐の排除)によって、条件判断が必要な処理を効率良く実行できます。

性能評価:予測と分岐・設定とクリア

予測と分岐・設定とクリアのプログラムを応用して、C++言語で記述したプログラムと、アセンブリ言語で記述した関数を利用したときの性能差を検証してみましょう。性能評価は「予測と分岐・設定とクリア・32ビット浮動小数点型」を用います。

予測と分岐・設定とクリア・32ビット浮動小数点型

配列の値によって処理を変更するプログラム紹介します。 AVX-512 命令のマスクレジスターを使用すると、プレディケーション(分岐の排除)によって、条件判断が必要な処理を効率良く実行できます。プレディケーションでは、各レーンで命令を実行するかしない…

予測と分岐・設定とクリア・64ビット浮動小数点型

配列の値によって処理を変更するプログラム紹介します。 AVX-512 命令のマスクレジスターを使用すると、プレディケーション(分岐の排除)によって、条件判断が必要な処理を効率良く実行できます。プレディケーションでは、各レーンで命令を実行するかしない…

予測と分岐・設定とクリア・8ビット整数型

配列の値によって処理を変更するプログラム紹介します。 AVX-512 命令のマスクレジスターを使用すると、プレディケーション(分岐の排除)によって、条件判断が必要な処理を効率良く実行できます。プレディケーションでは、各レーンで命令を実行するかしない…

予測と分岐・設定とクリア・16ビット整数型

配列の値によって処理を変更するプログラム紹介します。 AVX-512 命令のマスクレジスターを使用すると、プレディケーション(分岐の排除)によって、条件判断が必要な処理を効率良く実行できます。プレディケーションでは、各レーンで命令を実行するかしない…