スーパーコンピュータで培われてきた並列計算の技術が組込みシステムに降りてきたのは,今に始まったことではなく,今思い起こせば,1994年発売の初代PlayStationや,2000年発売のPlayStation 2のときにも起こっていたことでした。2021年3月には次期ARMアーキテクチャとなるArmv9アーキテクチャではスーパーコンピュータ富岳で用いられるベクトル命令SVE/SVE2が採用されます。新興のISAであるRISC-Vでもベクタ拡張を搭載したD1 chip搭載のIoTボードが市販され,2021年6月にはIntelがベクタ拡張を搭載したRISC-Vチップを含む高性能RISC-Vチップを作ると発表がありました。SIMDについてはこれに先んじて普及しており,広く普及している現行のArmv8アーキテクチャに搭載されています。Arm MaliやNVIDIA JetsonのようにGPUを搭載したIoTも一般的になってきていますが,これらも基本的にはSIMDアーキテクチャをしています。
このようにハイエンドの組込みシステムで用いられるCPUにSIMD/ベクトル処理機能が搭載されていますが,それらを活用するにはどのようにしたらいいでしょうか? 一般的な答えとしては,スーパーコンピュータで長年培われてきた技術に由来するBLAS/LAPACKという線形代数に基づくライブラリと,それを活用するOSSライブラリを利用しましょう,ということになります。といいますのも,BLAS/LAPACKは,人知のかぎりを尽くしてSIMD/ベクトル処理機能を極限まで活用すべくチューニングされていて,これを超えるようなものを容易に開発することはできない「金字塔」だからです。しかし,このようなライブラリを活用するときっとメモリ・ストレージのサイズがかかるだろうとか,原理や仕組みがわからないと安心して使えないとか,そういった要望をおそらく組込みシステムエンジニアは持つのではないかと予想します。
そこで,本分科会では,SIMD/ベクトル処理を活用する上で基礎となるSIMD(Single Instruction Multiple Data)の考え方と,これを生かすためのメモリ配置,SIMD命令・ベクトル命令活用の要点をレクチャーします。BLAS/LAPACKの活用方法については扱いませんが,BLASのAPIのごく一部を例にして,SIMD/ベクトル処理プログラミングのヒントを読み取ってみたいと思います。