編集この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。data(シングルインストラクション・マルチプルデータ、SIMD[1])とはフリンの分類のひとつで、1つの命令を同時に複数のデータに適用する、コンピュータの並列化の形態を指す[2]。通例、SIMD命令により同時処理するのに適したデータ構造あるいはデータ型を利用するため、命令実行の前に処理対象のデータ列はいったん結合(パック)され、処理完了後に分解(アンパック)される。data(パックデータ、パックトデータ)と呼ばれる。演算を繰り返すような操作をスカラー計算機のように逐次的に行なうのではなく、一度に行なうものである。Wの成分ごとに加算処理を行なう。32ビットのレジスタ幅を持ち、1命令で32ビットのデータを1組だけ処理できるプロセッサの場合、成分ごとの加算処理すなわち4回の加算命令を逐次実行する必要がある。128ビットのレジスタ幅を持ち、1命令で32ビットのデータ4組を同時に処理できるSIMD命令セットをサポートするプロセッサの場合、1回の命令で全成分をまとめて演算することができ、処理にかかる理論上の消費サイクル数は1/4になる。多くの場合、128ビットを使い切るデータはあまりなく、一般に128ビットを2分割し64ビット×2として使ったり、4分割し32ビット×4として使ったり、8分割し16ビット×8として使ったり、16分割し8ビット×16として使ったりするが、結局それぞれ1回のサイクルで2倍、4倍、8倍、16倍のデータ処理が可能になり、結果として相対的に低いクロック周波数でも高い性能を引き出しやすい。音声データ全体の音量を倍にしたいとする。デジタルデータではある瞬間の音量が数値として記録されているので、全ての値を倍にすればよい。このように大量のデータに同じ処理を施すときに性能を発揮するため、一般にはマルチメディアの処理に向いているとされる。これに対し、Cray-1のような典型的なベクトル型スーパーコンピュータでは並列に計算するのではなく、パイプライン処理により1個の演算装置を休ませることなく計算させ続ける。ベクトル演算という用語は、広義には1命令で複数の要素を計算させるものについて、同時(並列)に計算するものも、パイプラインで計算するものも指すが、ベクトル計算機と言った場合は主として、20世紀のスーパーコンピュータに多く採用されていたパイプライン型を指すことが多い。他の技術と同じく1990年代後半からパーソナルコンピュータのCPU/GPU、ゲーム機等にも応用された。SIMD命令を使ったとしても、プロセッサの命令実装形態によっては演算性能が向上しないケースもある。256ビットSIMD命令に対応したプロセッサであっても、256ビット幅の命令を1サイクルで実行できるとは限らず、128ビットの演算器を使って2サイクルで実行する実装になっていることもある。全ての処理をSIMDで行なえないこともないが、32ビット幅で十分な整数スカラー演算や論理演算の場合、本数の多い従来の汎用レジスタを有効利用するため、SIMDユニットは使わず通常のALUを使うことが多い。コンペア・アンド・スワップのような特殊命令は汎用レジスタとメモリの間でデータ交換をするため、SIMDレジスタは使えない。このような演算内容やプロセッサに合わせた最適化をコンパイラが行なってくれることも多い。ElementGPU編集GPUはSIMD型がほとんどである。GPGPU対応が進むにつれて、1プロセッサで複数のデータを扱うSIMDだけではなく、複数のプロセッサを用いて実現されるハードウェアマルチスレッドに対して同一の命令を発行することで複数のデータを同時に処理するSIMT(英語版)の併用が主流となっている。行なうスカラー型プロセッサを複数束ねるSIMTが主流となった。SIMDをサポートするGPUも出現し、SIMDとSIMTの併用が始まっている[3]。TeslaシリーズなどNVIDIA製GPUでは32個のハードウェアスレッド集合をWarpと呼ぶ。FireProシリーズなどAMD製GPUでは64個のハードウェアスレッド集合をWavefrontと呼ぶ。物理演算プロセッサ編集3Dゲームに必要な物理演算を高速化するため、SIMDを利用。Express接続の汎用SIMDアクセラレータ。倍精度の行列演算を高速に行う目的で、ワークステーション、スーパーコンピュータなどに搭載される。通例C言語/C++コンパイラには各プロセッサ固有の組み込み関数を定義したヘッダーファイルが用意されており、組み込み関数を呼び出すことで、アセンブラを使用することなく対応するSIMD命令を利用したソースコードを記述することができる。SIMD命令セットおよび組み込み関数はプロセッサによって異なるため、このように手動でベクトル化するとソースコードの移植性が低下するという問題がある。本来のアルゴリズムとは関係のない下位レベルのコードを記述しなければならないため、メンテナンス性も低下する。コンパイラの中には、SIMD命令による自動ベクトル化に対応しているものもある。自動ベクトル化はコンパイラ最適化の一種であり、特定のデータ型の連続したメモリ領域に対する同一の演算の繰り返しなど、特定のパターンに合致する処理を、SIMD命令を使ったベクトル演算に置き換えて高速化する[4][5]。自動ベクトル化は手動ベクトル化と比較してきめ細やかな制御は難しく、高速化の度合いはコンパイラの解析能力に左右されるが、ソースコードの移植性やメンテナンス性を維持したまま高速化できるというメリットもある。4.0ではSIMDベクトル化のプラグマ指令が導入された[6]。System.Numerics名前空間に含まれるSIMD対応型を使って記述されたマネージコードを、SIMD命令で並列化されたネイティブ機械語コードにJITコンパイルすることができる[7]。命令は、複数のビットを同時に処理することのできる並列性を持つため、広義のSIMDとして並列計算に利用されることもある。英語では「シムディー」のように読まれる。日本では「シムド」と呼ぶことがある。Docs関連項目編集マルチプロセッシングベクトル計算機フリンの分類ベクトル化この項目は、コンピュータに関連した書きかけの項目です。この項目を加筆・訂正などしてくださる協力者を求めています(PJ:コンピュータ/P:コンピュータ)。3.0のもとで利用可能です。プライバシーデスクトップ。