SIMDのソースを表示
←
SIMD
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
{{出典の明記|date=2017年11月}} [[ファイル:SIMD.svg|thumb|SIMDの概念図<br>PU = 処理装置 (processing unit)]] '''単一命令・複数データ'''({{lang-en-short|single instruction, multiple data}}、'''SIMD'''{{efn|[[英語]]では「シムディー」("sim-dee") のように読まれる<ref>[https://developer.mozilla.org/en-US/docs/Glossary/SIMD SIMD - MDN Web Docs Glossary: Definitions of Web-related terms | MDN]</ref>。日本では「シムド」と呼ぶことがある。}}{{efn|{{lang|en|"single instruction stream, multiple data stream"}} とする資料もある<ref>{{cite book |title=Computer Architecture and Organization |last=P.HAYES |first=JOHN |isbn=0-07-027363-4 |year=1978,1979 |date= |publisher=McGRAW-HILL INTERNATIONAL BOOK COMPANY |page=211}}</ref><ref>[http://www.ieice-hbkb.org/files/06/06gun_05hen_04.pdf 6 群「コンピュータ - 基礎理論とハードウェア」 - 5 編「コンピュータアーキテクチャ(II) 先進的」 - 4 章「ベクトルコンピュータ」 | 電子情報通信学会「知識ベース」]</ref><ref>{{cite book|author=David A. Patterson and John L. Hennessy|title=Computer Organization and Design: The Hardware/Software Interface|publisher=Morgan Kaufmann Publishers|id=ISBN 978-0-12-370606-5|year=2007|page=596}}</ref>。}})とは[[コンピューター]]の演算処理に関する[[フリンの分類]]のひとつで、1つの命令を同時に複数のデータに適用する[[並列計算|並列化]]の形態を指す<ref>[http://e-words.jp/w/SIMD.html SIMD(Single Instruction/Multiple Data)とは - IT用語辞典 e-Words]</ref>。この手法にもとづく演算をベクトル演算 ({{lang|en|vector operation}}) と呼ぶこともある。通例、SIMD命令により同時処理するのに適したデータ構造あるいはデータ型を利用するため、命令実行の前に処理対象のデータ列はいったん結合(パック)され、処理完了後に分解(アンパック)される。結合されたデータは{{lang|en|packed data}}(パックデータ、パックトデータ)と呼ばれる。 ==解説== 同一の演算を繰り返すような操作を[[スカラー計算機]]のように逐次的に行うのではなく、一度に行うものである。 例えば、4次元ベクトル同士の加算を実行する場合、X, Y, Z, Wの成分ごとに加算処理を行う。 :<math> \left\{ \begin{array}{l} c_x \leftarrow a_x + b_x \\ c_y \leftarrow a_y + b_y \\ c_z \leftarrow a_z + b_z \\ c_w \leftarrow a_w + b_w \end{array} \right. </math> ここで、それぞれの成分を32ビットの[[単精度浮動小数点数]]で表すとする。[[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倍の[[データ処理]]が可能になり、結果として相対的に低いクロック周波数でも高い性能を引き出しやすい。 例えば音声データ全体の音量を倍にしたいとする。[[デジタル]]データではある瞬間の音量が数値として記録されているので、全ての値を倍にすればよい。このように大量のデータに同じ処理を施すときに性能を発揮するため、一般には[[マルチメディア]]の処理に向いているとされる。 SIMD型で、複数の[[演算装置]]を並列に使用する計算を初期に試みたコンピュータとしては、[[ILLIAC IV]]がある。これに対し、[[Cray-1]]のような典型的な[[ベクトル計算機|ベクトル型]][[スーパーコンピュータ]]では並列に計算するのではなく、[[パイプライン処理]]により1個の演算装置を休ませることなく計算させ続ける。ただしベクトル演算という用語は、広義には1命令で複数の要素を計算させるものについて、同時(並列)に計算するものも、パイプラインで計算するものも指すが、ベクトル計算機と言った場合は主として、20世紀のスーパーコンピュータに多く採用されていたパイプライン型を指すことが多い。 他の技術と同じく[[1990年代]]後半から[[パーソナルコンピュータ]]の[[CPU]]/[[Graphics Processing Unit|GPU]]、[[ゲーム機]]等にも応用された。 なお、SIMD命令を使ったとしても、プロセッサの命令実装形態によっては演算性能が向上しないケースもある。例えば256ビットSIMD命令に対応したプロセッサであっても、256ビット幅の命令を1サイクルで実行できるとは限らず、128ビットの演算器を使って2サイクルで実行する実装になっていることもある。 全ての処理をSIMDで行ないこともないが、32ビット幅で十分な整数スカラー演算や論理演算の場合、本数の多い従来の汎用レジスタを有効利用するため、SIMDユニットは使わず通常の[[演算装置#ALU|ALU]]を使うことが多い。また、[[コンペア・アンド・スワップ]]のような特殊命令は汎用レジスタとメモリの間でデータ交換をするため、SIMDレジスタは使えない。このような演算内容やプロセッサに合わせた最適化を[[コンパイラ]]が行ってくれることも多い。 ==例== ===マイクロプロセッサ=== ====命令拡張==== * [[x86]]の[[MMX]]・[[3DNow!]]・[[ストリーミングSIMD拡張命令]] (SSE) * [[x64]]の[[ストリーミングSIMD拡張命令#AVX|Advanced Vector Extensions (AVX)]], [[ストリーミングSIMD拡張命令#AMX|Advanced Matrix Extensions (AMX)]] * [[ARMアーキテクチャ|ARM]]のAdvanced SIMD (NEON)<ref>[https://developer.arm.com/documentation/101028/0010/Advanced-SIMD--Neon--intrinsics Arm C Language Extensions Release ACLE Q4 2019 - Advanced SIMD (Neon) intrinsics | Arm Developer]</ref>, [[AArch64#Scalable Vector Extension|Scalable Vector Extension (SVE)]]<ref>[https://developer.arm.com/Architectures/Scalable%20Vector%20Extensions Scalable Vector Extension (SVE) | Arm Developer]</ref>, SVE2<ref>{{Cite web|和書|title=Arm、10年ぶりの新アーキテクチャ「Armv9」。富岳のSVE改良版やコンフィデンシャルコンピューティング機能追加|url=https://pc.watch.impress.co.jp/docs/news/1315481.html|website=PC Watch|date=2021-03-31|accessdate=2021-12-30|language=ja|publisher=株式会社インプレス}}</ref>, [[AArch64#Scalable Matrix Extension|Scalable Matrix Extension (SME)]] * [[RISC-V]]のベクトル拡張(Vector Extension)<ref>{{cite web |url=https://github.com/riscv/riscv-v-spec/blob/master/v-spec.adoc |title=riscv-v-spec/v-spec.adoc at master · riscv/riscv-v-spec |date= |author= |accessdate=2024-06-21}}</ref> * [[PowerPC]]の[[AltiVec]] (VMX) * [[SPARC]]のVIS ([[:en:Visual Instruction Set]]) * [[MIPSアーキテクチャ|MIPS]]のMIPS-3D ([[:en:MIPS-3D]])・MDMX ([[:en:MDMX]]) * [[PA-RISC]]の MAX ([[:en:Multimedia Acceleration eXtensions]]) * [[Emotion Engine]]のCPUコア ====演算装置==== 演算装置自体がSIMD型のもの * [[Cell Broadband Engine#Synergistic Processor Element]] ===GPU=== [[Graphics Processing Unit|GPU]]はSIMD型がほとんどである。ただし、[[GPGPU]]対応が進むにつれて、1プロセッサで複数のデータを扱うSIMDだけではなく、複数のプロセッサを用いて実現されるハードウェアマルチ[[スレッド (コンピュータ)|スレッド]]に対して同一の命令を発行することで複数のデータを同時に処理する[[Single Instruction, Multiple Threads|SIMT]]の併用が主流となっている。 もともとGPUはXYZW/RGBA(各成分は32ビット[[単精度浮動小数点数]])を同時に演算する128ビットの4-way SIMDが主流だったが、1サイクルで1回の単精度浮動小数点数もしくは32ビット整数の融合[[積和演算]] (FMA) を行うスカラー型プロセッサを複数束ねるSIMTが主流となった。しかしその後、単精度演算器にて半精度浮動小数点数演算を2回行う2-way SIMDや、8ビット整数演算を4回行う4-way SIMDをサポートするGPUも出現し、SIMDとSIMTの併用が始まっている<ref>[https://pc.watch.impress.co.jp/docs/column/kaigai/1023668.html 【後藤弘茂のWeekly海外ニュース】NVIDIA次世代SoC「Xavier」は進化版DenverとVoltaを搭載 - PC Watch]</ref>。 * [[NVIDIA GeForce]]、[[NVIDIA Quadro]]、[[NVIDIA Tesla]]シリーズなど : [[NVIDIA]]製GPUでは32個のハードウェアスレッド集合を''Warp''と呼ぶ。 * [[AMD Radeon]]、[[AMD FirePro]]シリーズなど : [[アドバンスト・マイクロ・デバイセズ|AMD]]製GPUでは64個のハードウェアスレッド集合を''Wavefront''と呼ぶ。 * {{仮リンク|イマジネーションテクノロジーズ|en|Imagination Technologies}}の[[PowerVR]] : PowerVR Series5では4-way、PowerVR Series6では16-wayのベクタユニット<ref>{{Cite web|和書|title=【後藤弘茂のWeekly海外ニュース】 スマートフォンのグラフィックスを加速する「PowerVR Series6 Rogue」|url=https://pc.watch.impress.co.jp/docs/column/kaigai/640315.html|website=PC Watch|date=2014-03-19|accessdate=2021-12-29|language=ja|publisher=株式会社インプレス}}</ref> ===物理演算プロセッサ=== 3Dゲームに必要な物理演算を高速化するため、SIMDを利用。 *[[PhysX]](用のチップ) ===汎用アクセラレータ=== [[PCI Express]]接続の汎用SIMDアクセラレータ。[[倍精度]]の[[行列]]演算を高速に行う目的で、[[ワークステーション]]、[[スーパーコンピュータ]]などに搭載される。 *CSX600 - [[クリアスピード・テクノロジー|クリアスピード]]によるメニーコアSIMD演算ユニット *[[NEC SX-Aurora TSUBASA|SX-Aurora TSUBASA]] Vector Engine - [[NEC]]のスパコンSX-Aurora TSUBASA搭載の演算ユニットをバラ売りしたもの。8コア、最大2.45TFLOPS<ref>[https://prtimes.jp/main/html/rd/p/000000317.000008686.html NEC SX-Aurora TSUBASA Vector Engineの取り扱いを開始]</ref> == コンパイラサポート == SIMD命令を利用するには、各プロセッサの固有命令を[[アセンブリ言語|アセンブラ]]で直接記述するほか、高水準言語の[[コンパイラ]]に実装されている{{仮リンク|組み込み関数|en|intrinsic function}} (intrinsics/intrinsic functions) を利用する方法もある。通例[[C言語]]/[[C++]]コンパイラには各プロセッサ固有の組み込み関数を定義したヘッダーファイルが用意されており、組み込み関数を呼び出すことで、アセンブラを使用することなく対応するSIMD命令を利用したソースコードを記述することができる。ただしSIMD命令セットおよび組み込み関数はプロセッサによって異なるため、このように手動でベクトル化するとソースコードの[[移植性]]が低下するという問題がある。また、本来のアルゴリズムとは関係のない下位レベルのコードを記述しなければならないため、メンテナンス性も低下する。 コンパイラの中には、SIMD命令による自動ベクトル化に対応しているものもある。自動ベクトル化は[[コンパイラ最適化]]の一種であり、特定のデータ型の連続したメモリ領域に対する同一の演算の繰り返しなど、特定のパターンに合致する処理を、SIMD命令を使ったベクトル演算に置き換えて高速化する<ref>[https://blogs.msdn.microsoft.com/nativeconcurrency/2012/04/12/auto-vectorizer-in-visual-studio-2012-overview/ Auto-Vectorizer in Visual Studio 2012 – Overview – Parallel Programming in Native Code]</ref><ref>[https://jp.xlsoft.com/documents/intel/compiler/Compiler_AutoVectorization_Guide.pdf インテル® C++ コンパイラーのベクトル化ガイド - Compiler_AutoVectorization_Guide.pdf]</ref><ref>[https://llvm.org/docs/Vectorizers.html Auto-Vectorization in LLVM — LLVM git documentation]</ref>。自動ベクトル化は手動ベクトル化と比較してきめ細やかな制御は難しく、高速化の度合いはコンパイラの解析能力に左右されるが、ソースコードの移植性やメンテナンス性を維持したまま高速化できるというメリットもある。[[Clang]]/[[LLVM]]のように、コンパイラ最適化のヒントとしてベクトル幅などを固有のプラグマ指令で指定できるものもある。 [[OpenMP]] 4.0ではSIMDベクトル化のプラグマ指令が導入された<ref>[https://www.isus.jp/products/c-compilers/enabling-simd-in-program-using-openmp40/ OpenMP 4.0 を使用してプログラムで SIMD を有効にする | iSUS]</ref>。 [[Java]]では[[HotSpot]] Server VM用のHotSpot C2 Compilerがx86/x64/AArch64の自動ベクトル化に対応している<ref>[https://static.linaro.org/connect/bud17/Presentations/BUD17-117%20Auto-vectorization-support-in-OpenJDK9-Hotspot-C2-compiler.pptx.pdf BUD17-117 Auto Vectorization Support in OpenJDK 9 AArch64 Hotspot C2 Compiler | Linaro]</ref><ref>[https://cr.openjdk.org/~vlivanov/talks/2017_Vectorization_in_HotSpot_JVM.pdf Vectorization in HotSpot JVM | Oracle]</ref>。Java 16以降は実験的機能モジュール(incubator module)のひとつ<code>jdk.incubator.vector</code><ref>[https://docs.oracle.com/javase/jp/16/docs/api/jdk.incubator.vector/jdk/incubator/vector/package-summary.html jdk.incubator.vector (Java SE 16 & JDK 16)]</ref>の初期版としてVector APIが追加されており<ref>{{Cite web |title=JEP 338: Vector API (Incubator) |author= |website=openjdk.org |date= |access-date=2024-09-08 |url= https://openjdk.org/jeps/338}}</ref>、バージョンアップのたびに段階的に機能が追加されている<ref>[https://community.arm.com/arm-community-blogs/b/high-performance-computing-blog/posts/java-vector-api-on-aarch64 Java Vector API on AArch64 - High Performance Computing (HPC) blog - Arm Community blogs - Arm Community]</ref>。 [[.NET]]および[[.NET Framework]] 4.6以降の64ビット版[[実行時コンパイラ]] (RyuJIT) は、<code>System.Numerics</code>名前空間に含まれるSIMD対応型を使って記述された[[マネージコード]]を、SIMD命令で並列化されたネイティブ機械語コードにJITコンパイルすることができる<ref>[https://learn.microsoft.com/ja-jp/dotnet/standard/numerics .NET における数値 | Microsoft Docs]</ref>。 [[WebAssembly]]では、128ビットのSIMD命令があり、Chrome 91、Firefox 89、Safari 16.4などで実装されている<ref>{{Cite web |title=Using SIMD with WebAssembly — Emscripten 3.1.61-git (dev) documentation |author= |website=emscripten.org |date= |access-date=2024-06-01 |url= https://emscripten.org/docs/porting/simd.html}}</ref>。 == ビット演算 == [[ビット演算]] ({{lang|en|bitwise operation}}) の命令は、複数のビットを同時に処理することのできる並列性を持つため、広義のSIMDとして[[並列計算]]に利用されることもある。 == 脚注 == === 注釈 === {{notelist}} === 出典 === {{reflist}} == 関連項目 == * [[マルチプロセッシング]] * [[ベクトル計算機]] * [[フリンの分類]] * [[ベクトル化]] * [[Single Instruction, Multiple Threads]] (SIMT) {{CPU technologies}} {{並列コンピューティング}} {{Normdaten}} [[Category:SIMDコンピューティング|*]] [[Category:CPU]] [[Category:並列コンピューティング]] [[Category:フリンの分類]]
このページで使用されているテンプレート:
テンプレート:CPU technologies
(
ソースを閲覧
)
テンプレート:Cite web
(
ソースを閲覧
)
テンプレート:Efn
(
ソースを閲覧
)
テンプレート:Lang
(
ソースを閲覧
)
テンプレート:Lang-en-short
(
ソースを閲覧
)
テンプレート:Normdaten
(
ソースを閲覧
)
テンプレート:Notelist
(
ソースを閲覧
)
テンプレート:Reflist
(
ソースを閲覧
)
テンプレート:並列コンピューティング
(
ソースを閲覧
)
テンプレート:仮リンク
(
ソースを閲覧
)
テンプレート:出典の明記
(
ソースを閲覧
)
SIMD
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報