C#ベクトルプログラミング入門
x86系SIMD命令の利用とBenchmarkDotNetを使った性能評価
著者 | 北山 洋幸 |
---|---|
判型 | B5変型、224頁 |
ISBN | 978-4-87783-524-8 |
価格 | 本体 2,800円 |
発行日 | 2022年6月10日(初版第1刷) |
本書について
近年において、必要以上にハードウェアを意識したソフトウェア開発はポータビリティやスケーラビリティを下げることからあまり勧められません。しかしながら、アルゴリズムの工夫などでは必要な性能が得られない場合もあります。
本書では、C#を利用しながら、比較的大規模な数値演算を行いたときに重宝するベクトル処理について解説を行います。また、副産物としてC#の性能評価についても触れます。
C#では、System.Runtime.Intrinsics.X86クラスなどでx86系CPUのSIMD命令をサポートするメソッドが提供されています。このクラスは、C++のイントリンシックと対応したメソッドを用意しています。ベクトル処理に慣れていない人でも、これらのメソッドを利用すると、容易にC#でベクトルプログラミングを行うことができるでしょう。
目次
- 第1章 SIMD概論
- 1.1 フリンの分類
- 1.2 SIMD概要
- 1.3 SIMD命令で扱うデータ形式
- 1.4 SIMD命令とは
- 1.5 C#とSIMD
- 第2章 はじめてのプログラム
- 2.1 一般的なC#で記述
- 2.2 C#のベクトルクラスで記述
- 2.3 fixedステートメント
- 2.4 stackallocステートメント
- 2.5 stackallocステートメントとfixedステートメントの使い分け
- 2.6 C#でSIMDメソッドを利用する手続き
- 2.7 SseメソッドとAvx2メソッド
- 2.8 使用できるクラスの判断
- 2.9 アライメント
- 第3章 各メソッド
- 3.1 算術演算系メソッド
- 3.2 ビット単位演算系メソッド
- 3.3 条件付き混合または条件付きマージ系メソッド
- 3.4 ベクトル比較系メソッド
- 3.5 変換系メソッド
- 3.6 最大値と最小値を特定するメソッド
- 3.7 その他の操作系メソッド
- 第4章 簡単な応用例
- 4.1 2つの配列を加算
- 4.2 2つの配列を乗算
- 4.3 長大な一次元配列に定数を乗ずる
- 4.4 配列の水平演算
- 4.5 配列の最大値と最小値
- 第5章 3Dベクトルの正規化(AOS、SOA)
- 5.1 AOSとSOA
- 5.2 AOSからSOAへのシャッフル
- 5.3 256ビットのAOSとSOA
- 5.4 一般化したメソッド
- 第6章 ベンチマーク
- 6.1 Stopwatchクラス
- 6.2 BenchmarkDotNet
- 6.3 乗算
- 6.4 一次元配列に定数を乗ずる
- 6.5 長い配列の総和を求める
- 第7章 ヘルパークラス
- 7.1 配列同士の加算(1)
- 7.2 配列同士の加算(2)
- 7.3 配列同士の乗算
- 7.4 長大な一次元配列に定数を乗ずる
- 7.5 長い配列の総和を求める
- 7.6 ヘルパークラスの拡張
- 第8章 ヘルパークラスとベンチマーク
- 8.1 加算
- 8.2 乗算
- 8.3 一次元配列に定数を乗ずる
- 8.4 長い配列の総和を求める
- 8.5 ヘルパークラスと性能
- 第9章 BenchmarkDotNet
- 9.1 引数を即値で指定
- 9.2 引数をIEnumerableで指定
- 9.3 引数が配列の例
- 9.4 配列引数をIEnumerableで指定
- 9.5 乗算
- 9.6 一次元配列に定数を乗ずる
- 9.7 長い配列の総和を求める
- 9.8 配列の最大値と最小値
- 付録 APPENDIX - SIMDと並列化
- A.1 逐次プログラム
- A.2 並列プログラム
- A.3 ベンチマーク
- A.4 並列プログラム・Task.Run
- A.5 配列タスクで並列化