カットシステムの書籍のご案内

IA-32 SIMD
リファレンスブック(上)

著者 北山 洋幸 / 中田 潤也
判型 B5変型判、818頁
本体価格 9,000円
ISBN 978-4-87783-169-1

本書について

 本書は、パーソナルユースの分野を筆頭に最も広く利用されているIntel IA-32アーキテクチャ(以下IA-32と表記)でサポートされるSIMD命令セットを紹介したリファレンスです。IA-32のアセンブラ全般を扱ったものではありません。こうしたスコープが限定された書籍を執筆するに至るにはいくつかの背景がありました。
 一つには、本書と同じ執筆陣による既刊「アセンブラ画像処理プログラミング」に対する反応のうち、後半のSIMD命令セットに関する部分への反響が予想以上に大きかった点があります。また、執筆に際してSIMD命令セットのエッセンシャルな部分を集中的に説明した資料があまり見当たらず、大変苦労したことも大きなモチベーションとなっています。
 もう一つの背景として、近年のコンパイラの進化、特にオプティマイザの性能の向上によって、C言語等の高級言語で記述されたコードをアセンブラで置き換えることによる最適化では、保守性の低下等のトレードオフを考慮すると十分なRoI(費用対効果)が得られない、つまり労多くして功少なしといった状況が発生することが多くなってきている点も挙げられます。それはSIMD命令セットに関しても同じことが言えるのではないか? と思われる方もいらっしゃるでしょう。ところが、SIMD命令セットに関しては、積極的に利用する価値のあると考えられるいくつかの理由があります。代表的なものとして、SIMD命令セット自体が大幅な性能の向上を第一義として用意されたものである点、またアルゴリズムだけではなく、データ構造も含めSIMD命令セットに最適化することはオプティマイザの領分を越えているという点もその理由となります。このことは、SIMD命令セットを利用した最適化を行うためには、単純に高級言語で記述された処理をSIMD命令セットで置き換えるだけではなく、SIMD命令セットによる処理に適したデータ構造を採用してこそその真価が発揮されることをも示しています。
 本書では、このアルゴリズムとデータ構造の最適化に有用なリファレンスとなるよう、図を多用することによって個々の命令の動作を理解することができるのみならず、その命令が有効に作用するためにはどのような構造でデータを保持していなければならないのかをイメージできるものとなることを念頭に置いて執筆を行いました。本書がカテゴリを問わず、さまざまな分野における処理の高速化の一助となることを願っております。

中田 潤也

 ソフトウェア開発の抽象化が進むにつれ、おもにアプリケーション寄りの開発を行うエンジニアがCPUをはじめとするハードウェアを強く意識する必要性は薄れてきています。いまや、ハードウェアはおろかソフトウェア環境についてさえも、部分的な知識しか必要とされないような場面が多くみられます。実際、CPUの動作の詳細やアセンブリ言語の理解を必要不可欠とするソフトウェア開発は、現在では一部に限られるでしょう。
 このような抽象化の進行という流れがある一方で、それを下から支えるクラスやコンポーネント、もしくはよりコアな部分を開発するエンジニアには、より高度な処理をより早くという要求に応えるべく、与えられた環境の性能を最大限に引き出すことが求められます。また、ハードウェアの性能の向上にともなってソフトウェア処理の適用範囲も広がりつつあります。その傾向は、今後CPUのマルチコア化やSIMD命令の使用が一般化することによってますます強まるでしょう。
 ソフトウェア処理の適用範囲の拡大は、開発の柔軟性の向上にも寄与します。ある機能の実装をハードウェアで行うかソフトウェアで行うかという判断に悩まされる状況は減少し、より多くの時間をアルゴリズムの検討などに割くことができるようになるでしょう。それとともに、SIMD命令をいかに活用するかが重要視される場面も増すことでしょう。
 本書は、すでに中田氏が触れているように、既刊の「アセンブラ画像処理プログラミング」への反響を受け、SIMD命令に焦点を絞って企画されました。CPUやアセンブリ言語についての解説書はすでに多数出版されていますが、SIMD命令についての解説書はそれほど多くありません。本書の特徴は、SIMD命令の解説に特化した点はもとより、図を多用し、さらに各種プラットフォームで動作するサンプルプログラムを提供して、SIMD命令の理解を分かりやすくした点にあります。上巻はリファレンスのみですが、下巻ではそれに加えて、SIMD命令をより興味深く学習できるようなアプリケーションの解説も行う予定です。
 本書は、以下のような方々を読者対象としています。

● SIMD命令の分かりやすいリファレンスを求めている方
● SIMD命令の神髄を理解したい方
● SIMD命令の実際をサンプルプログラムで理解したい方
● 高性能なプログラムを開発したい方

 微力ながら本書が、読者の方々のSIMD命令の理解と高性能なプログラム開発の一助となれば幸いです。


北山 洋幸

目 次

第1章 データ転送命令

MOVD(MMX、SSE2)
MOVQ(MMX、SSE2)
MOVAPS(SSE)
MOVUPS(SSE)
MOVHPS(SSE)
MOVHLPS(SSE)
MOVLPS(SSE)
MOVLHPS(SSE)
MOVMSKPS(SSE)
MOVSS(SSE)
MOVAPD(SSE2)
MOVUPD(SSE2)
MOVHPD(SSE2)
MOVLPD(SSE2)
MOVMSKPD(SSE2)
MOVSD(SSE2)
MOVDQA(SSE2)
MOVDQU(SSE2)
MOVQ2DQ(SSE2)
MOVDQ2Q(SSE2)
MOVSHDUP(SSE3)
MOVSLDUP(SSE3)
MOVDDUP(SSE3)
LDDQU(SSE3)

第2章 算術命令

PADDB(MMX、SSE2)
PADDW(MMX、SSE2)
PADDD(MMX、SSE2)
PADDSB(MMX、SSE2)
PADDSW(MMX、SSE2)
PADDUSB(MMX、SSE2)
PADDUSW(MMX、SSE2)
PSUBB(MMX、SSE2)
PSUBW(MMX、SSE2)
PSUBD(MMX、SSE2)
PSUBSB(MMX、SSE2)
PSUBSW(MMX、SSE2)
PSUBUSB(MMX、SSE2)
PSUBUSW(MMX、SSE2)
PMULHW(MMX、SSE2)
PMULLW(MMX、SSE2)
PMADDWD(MMX、SSE2)
ADDPS(SSE)
ADDSS(SSE)
SUBPS(SSE)
SUBSS(SSE)
MULPS(SSE)
MULSS(SSE)
DIVPS(SSE)
DIVSS(SSE)
RCPPS(SSE)
RCPSS(SSE)
SQRTPS(SSE)
SQRTSS(SSE)
RSQRTPS(SSE)
RSQRTSS(SSE)
MAXPS(SSE)
MAXSS(SSE)
MINPS(SSE)
MINSS(SSE)
PAVGB(SSE、SSE2)
PAVGW(SSE、SSE2)
PEXTRW(SSE、SSE2)
PINSRW(SSE、SSE2)
PMAXUB(SSE、SSE2)
PMAXSW(SSE、SSE2)
PMINUB(SSE、SSE2)
PMINSW(SSE、SSE2)
PMOVMSKB(SSE、SSE2)
PMULHUW(SSE、SSE2)
PSADBW(SSE、SSE2)
PSHUFW(SSE)
ADDPD(SSE2)
ADDSD(SSE2)
SUBPD(SSE2)
SUBSD(SSE2)
MULPD(SSE2)
MULSD(SSE2)
DIVPD(SSE2)
DIVSD(SSE2)
SQRTPD(SSE2)
SQRTSD(SSE2)
MAXPD(SSE2)
MAXSD(SSE2)
MINPD(SSE2)
MINSD(SSE2)
ADDSUBPS(SSE3)
ADDSUBPD(SSE3)
PMULUDQ(SSE2)
PADDQ(SSE2)
PSUBQ(SSE2)
HADDPS(SSE3)
HSUBPS(SSE3)
HADDPD(SSE3)
HSUBPD(SSE3)

第3章 比較命令

PCMPEQB(MMX、SSE2)
PCMPEQW(MMX、SSE2)
PCMPEQD(MMX、SSE2)
PCMPGTB(MMX、SSE2)
PCMPGTW(MMX、SSE2)
PCMPGTD(MMX、SSE2)
CMPPS(SSE)

CMPSS(SSE)
COMISS(SSE)
UCOMISS(SSE)
CMPPD(SSE2)
CMPSD(SSE2)
COMISD(SSE2)
UCOMISD(SSE2)

第4章 論理命令

PAND(MMX、SSE2)
PANDN(MMX、SSE2)
POR(MMX、SSE2)
PXOR(MMX、SSE2)
ANDPS(SSE)
ANDNPS(SSE)
ORPS(SSE)
XORPS(SSE)
ANDPD(SSE2)
ANDNPD(SSE2)
ORPD(SSE2)
XORPD(SSE2)