のらりくらり

物理化学分野のポスドクです。プログラミング、読書、自転車などが好きです。

自分のマシンのCPUに実装されている機能を調べる

 最近のCPUは非常に多くの種類の命令があって、僕はそのなかでも最近、SIMD命令と言うものに少々興味があります。SIMD命令というのは、ざっくり説明すると同じような計算をたくさんのデータに対して行うときに、128ビットまたは256ビットの少々大きなレジスタを32ビット整数であれば4個または8個、64ビット整数であれば2個または4個、というように分割してデータを送り込み、同じ演算を一気に行ういわゆるベクトル演算に関する命令で、これらは、IntelのCPUではMMX命令やSSE, SSE2, SSE3(SSE stands for Streaming SIMD Extensions)という名前のマシン語命令群に分類されます。
 これらの実装の有無はIntelのCPUでも世代別に異なるため、もしそれらを使用する場合は、用いる計算機のプロセッサが実際にその命令群をサポートしているか否かをしらべる必要があります。そこでそれらを調べる手段として、(もしコンピュータの詳細な仕様書が手元にあるならばそれらを使えを読めば良いのですが)、CPUID命令というマシン語命令を使用することで、自分がつかっているCPU自身にどのような命令が実装されているかを問い合わせることができます。
それを実際にgccインラインアセンブラをつかって自分のマシンで書いて試してみたことに関するメモ。
 詳細は、こんな記事みるより
http://www.intel.co.jp/content/dam/www/public/ijkk/jp/ja/documents/developer/Processor_Identification_071405_i.pdf
を見てもらった方が確実なのだけれど。

CPUID命令は自分が問い合わせる内容を示すビット列をeaxレジスタに書き込んでおくことで、それに応じた結果を返してくれるようになっています。そしてこの内容に関して、問い合わせるフローは上にしめしたIntel社のpdfに書いてあるのですが、それはちょっとなんか違和感を感じるものだったので、こっちでは実際に自分が使った順番とともに示します。
まず、eaxの内容別に分類すると、

eaxの値 返してくれる内容
0 CPUID命令が使えるか否か(ということにしておく)、及びCPUのベンダ
1 CPUの実装している機能をしめすフラグ群
0x80000000 CPUの名前(ブランドストリングと言います)を取得できるか否か
0x80000002~0x80000004 CPUの名前(ASCII文字列)

他にも細かな情報はいろいろあるのですが(ドキュメントを見てください)、上記に示した内容を取得するコードをインラインアセンブラをつかって書いてみました。
すると、自分のMacBookAir(13-inch, Mid 2012)は、以下のような結果でした。終わり。

あとでもう少し詳しく書き足すかも。