Think Parallelで行こう!

第6回 IntelとCell/B.E.のベクトル演算

株式会社フィックスターズ
好田 剛介

2010/2/15

CPUの周波数の高速化競争が頭打ちになり、1コアにおける処理能力は限界となった。CPUの進化がマルチコア化に向かった結果、並列コンピューティングの門戸が開かれた(編集部)

ベクトル演算を使った高速化

 ベクトル演算を積極的に用いてプログラムを高速化する方法を説明します。

 CPUの持つベクトル演算という機能は、第2回「現代のプロセッサと並列実行」でも解説しましたが、おさらいしておきましょう。

 ベクトル演算とは、CPUの持つ命令のうち、複数個の整数値や実数値に対して1つの演算を同時に実行させるものです。

 例えば、4個の32bitデータを1個の128bitデータにまとめ、op演算を行う場合のベクトル演算は、図1のようになります。

ベクトル演算
図1 32bitデータを4個もつ128bitレジスタのベクトル演算

Intel SSE演算器

 PCの世界で有名なIntelのプロセッサもベクトル演算を持っています。いわゆるx86アーキテクチャのベクトル演算としては、最初にMMXが登場しました。

 Intelのプロセッサでは、複数のスカラデータをベクトルデータにまとめたものをパックドと呼んでおり、8bitデータをまとめたものをパックドバイト、16bitデータをまとめたものをパックドワード、32bitデータをまとめたものをパックドダブルワードと呼んでいます。

 MMXでは、8個の64bitMMXレジスタに置かれた、パックドバイト、パックドワード、パックドダブルワードの整数に対してベクトル演算を行うことができました。

 その後、同社はさらにベクトル演算を強化したSSEを世に送り出します。SSEでは、8個の128ビットXMMレジスタあるいはメモリに置かれた、パックド単精度浮動小数点数も扱えます。

MMXとXMM
図2 64bitMMXレジスタと128ビットXMMレジスタ

 SSE2では、パックド倍精度浮動小数点数を扱えるようになりました。SSE3では、ビデオ処理、複素数演算、スレッド同期等のために、SIMDデータの非対称処理、水平計算の簡易化、キャッシュライン分割ロード防止のための命令を扱えるようになりました。

 SSSE3では、デジタルビデオと信号処理に関する命令が増えました。

 SSE4.1では、ビデオ、画像処理、3Dを高速化する命令が追加となり、また、パックドダブルワード演算が強化されました。

 SSE4.2では、いわゆる数値計算のための命令だけでなく、文字列操作のための命令もサポートされました。これによって、Cの標準ライブラリにあるstrlen()関数のような基本的な文字列操作について、SSEによる高速化が期待できます。

 後にx86は拡張され、64ビット・モードを持つようになります。64ビット・モードではXMMレジスタが16個になりました。

XMM(64bitモード)
図3 XMMレジスタ(64bitモード)

 以上のように、SSEは段階的にさまざまな命令やレジスタを追加しています。より詳しくは、Intelが提供している「インテル(R)64アーキテクチャーおよびIA-32アーキテクチャー最適化リファレンス・マニュアル」を参照してください。

 ベクトル演算以外にも現行のx86系プロセッサの構造全般について丁寧に記載されている資料ですので、これから同プロセッサを学ぼうとする方に適していると思います。

Cell/B.E. SPE ベクトル演算器

 PlayStation 3で有名なCell Broadband Engine(Cell/B.E.あるいはCBEあるいは単にCellと略される)もベクトル演算器を持っています。

 Cell/B.E.は、PPESPEの2種類のコアを内包しています。PPEでは、VMXと呼ばれるベクトル演算器を持っています(ほかのPowerPC系プロセッサにおけるベクトル演算器の名称から、Altivecと呼ばれることもあります)。一方、SPEは、PPEとは独自の命令セット持っています。

 SPEは、ベクトル演算を基本としたプロセッサで、四則演算などほとんどの命令はベクトル演算となっており、128bitレジスタのみを128個持っています。SPEの性能を引き出すためには、ベクトル演算を使いつつ128個あるレジスタを有効活用する必要があります。

SPE
図4 SPEレジスタ

 SPEのベクトル演算では、128bitのレジスタを8bit×16個、16bit×8個、32bit×4個、64bit×2個、128bit×1個の形で扱う命令があります。

 SPEでスカラ演算を行いたい場合には、128bitレジスタ内の特定の場所(プリファードスロットと呼ばれる)にスカラデータを入れたベクトルデータに対してベクトル演算を行い、ベクトルデータの結果のうちスカラデータが格納されている場所を使用します。スカラデータを入れた以外の部分は、演算が行われるものの結果は捨ててしまいます。つまり、スカラ演算であっても、内部的にはベクトル演算が行われます。

 Cell/B.E.に関するより詳しい情報はIBMが提供している「Cell Broadband Engine Programming Handbook」を参照してください。SPUのベクトル演算以外にもCell/B.E.系プロセッサの構造全般について丁寧に記載されている資料ですので、これから同プロセッサを学ぼうとする方に適していると思います。

 また、フィックスターズでもCell/B.E.に関する総合的な情報を掲載しています。

 
1/2
next

Index
IntelとCell/B.E.のベクトル演算
Page1
ベクトル演算を使った高速化
Intel SSE演算器
Cell/B.E. SPE ベクトル演算器
  Page2
ベクトル演算のためのデータ構造
簡単なベクトル演算例(SPE on PlayStation 3)

index Think Parallelで行こう!


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間