Nanashi-softプログラマ専用Linux ARM


◇Linux ARM -ARMの NEON (SIMD)を操る(1-

ほぼ説明が見当たらないのですが(汗
↓ここに公式(?)のリファレンスがあります
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0348bj/BABDEAGJ.html
下の「PDF version」リンクを右クリックして,リファレンスを一式ダウンロードできます
これがなんと日本語なのですよ! 訳してくれた人に感謝です('-'*)

ヘッダーとこの資料を解析すれば,大抵のことはわかるようになるでしょう


まずは基本からいきます(私が思い出すためにw)
SIMD(シムド)とは,同時に演算を行う為の仕組みです
CPUに SIMD用の演算器が備えられており,ARM CPUの場合,それを操る為の拡張命令を NEONと呼んでいます(インテルでのSSEとかのことね)

SIMDには int型(32bit)の演算が,同時に4つできます(int以外の型も色々あります)
例えば,変数4つに1を足したい場合,
変数A=変数A+1
変数B=変数B+1
変数C=変数C+1
変数D=変数D+1
と4回演算するところを,SIMDでは
変数A〜D=変数A〜D+1
と,1回の演算で行うことができます


SIMDを操るために知らなければならないことは,
・専用の型と内部構造を詳しく知る
・専用の関数の意味を知る
型と関数がわかれば,それで使えるようになります
問題はその後で,当てはめるようなロジックを考える事が非常に難しい点です

・専用の型
NEONの型一覧は,上記資料の「NEON サポートの使用」→「E.2 ベクタのデータ型」にあります

とりあえず,int型(32bit)が4つ入る型が「int32x4_t」だということを覚えておきます

・専用の関数
上記資料の「NEON サポートの使用」→「E.3 コンパイラ組み込み関数」にザザーッと書かれてあり,発行されるアセンブラがコメントで書かれています(汗
アセンブラで書かれてもわかんないし(*'-')
最初に書かれてある例や,コメントから解読して,少しずつ意味がわかってきています

とりあえず,いくつかわかったのを書いておきます
・足し算
d=a + b → d=vaddq_s32(a, b)
・引き算
d=a - b → d=vsubq_s32(a, b)
・掛け算
d=a * b → d=vmulq_s32(a, b)
・右シフト(割り算の代用)
d = a >> b → vshlq_s32(a, -b);


膨大な資料の中から,たったこれだけの事がわかっただけでも,かなりの高速化を行う事が可能です
実際のプログラミングは,次の記事へ


TOPプログラマ専用Linux ARM