
単一命令複数データ( SIMD ) は、 Flynn の分類法における並列処理の一種です。SIMD は内部 (ハードウェア設計の一部) に存在し、命令セット アーキテクチャ(ISA)を通じて直接アクセスできますが、ISA と混同しないでください。SIMD は、複数のデータ ポイントに対して同時に同じ操作を実行する複数の処理要素を備えたコンピューターを表します。
このようなマシンはデータ レベルの並列性を活用しますが、同時実行性は活用しません。つまり、同時 (並列) 計算は行われますが、各ユニットは任意の時点で (異なるデータで) まったく同じ命令を実行します。 SIMD は、デジタル画像のコントラストを調整したり、デジタル オーディオの音量を調整したりするなどの一般的なタスクに特に適しています。最近のCPU設計のほとんどには、マルチメディア使用のパフォーマンスを向上させる SIMD 命令が含まれています。 SIMD には、 Flynn の 1972 年分類法で 3 つの異なるサブカテゴリがあり、その 1 つがSIMTです。 SIMT をソフトウェア スレッドやハードウェア スレッドと混同しないでください。どちらもタスクのタイム シェアリング (タイム スライス) です。 SIMT は、真の同時並列ハードウェア レベル実行です。
最近のグラフィックス プロセッシング ユニット(GPU) は、多くの場合、ワイド SIMD 実装です。[引用が必要]
歴史
SIMD 命令が最初に使用されたのは、1966 年に完成したILLIAC IVでした。
SIMD は、 CDC Star-100やTexas Instruments ASCなど、1970 年代初期のベクトル スーパーコンピュータの基盤であり、単一の命令でデータの「ベクトル」を操作できました。ベクトル処理は、1970 年代と 1980 年代にCrayによって特に普及しました。ベクトル処理アーキテクチャは現在、SIMD コンピュータとは別のものと考えられています。Duncanの分類法にはベクトル処理アーキテクチャが含まれていますが、 Flynn の分類法には含まれていません。これは、Flynn の研究 (1966、1972) がCray-1 (1977) より前のものであるためです。
現代の SIMD コンピュータの最初の時代は、Thinking Machines CM-1 や CM-2などの超並列処理スタイルのスーパーコンピュータによって特徴づけられました。これらのコンピュータには、並列に動作する機能が制限されたプロセッサが多数搭載されていました。たとえば、Thinking Machines CM-2 の 65,536 個のシングルビット プロセッサはそれぞれ同時に同じ命令を実行し、ハイパーキューブ接続ネットワークまたはプロセッサ専用 RAM を使用してオペランドを検索することで、たとえば一度に 65,536 組のビットを論理的に組み合わせることができました。Intel i860 XPなどのコモディティ プロセッサに基づく安価なスカラーMIMDアプローチがより強力になり、SIMD への関心が薄れると、スーパーコンピューティングは SIMD アプローチから離れました。[2]
現在の SIMD プロセッサの時代は、スーパーコンピュータ市場ではなくデスクトップコンピュータ市場から生まれました。1990 年代にデスクトップ プロセッサがリアルタイム ゲームやオーディオ/ビデオ処理をサポートできるほど強力になると、この特定のタイプのコンピューティング パワーに対する需要が高まり、マイクロプロセッサ ベンダーは需要を満たすために SIMD に目を向けました。[3] Hewlett-Packard は、 1994 年にPA-RISC 1.1 デスクトップにMPEG デコードを高速化するためにMAX命令を導入しました。 [4] Sun Microsystems は、1995 年にUltraSPARC Iマイクロプロセッサの「 VIS」命令セット拡張に SIMD 整数命令を導入しました。MIPS も同様のMDMXシステムでこれに追随しました。
デスクトップ SIMD が最初に広く導入されたのは、1996 年に Intel がx86アーキテクチャにMMX拡張機能を導入したときでした。これがきっかけで、Motorola PowerPCと IBM のPOWERシステムに、はるかに強力なAltiVecシステムが導入されました。Intel は 1999 年にまったく新しいSSEシステムを導入してこれに応えました。それ以来、両方のアーキテクチャの SIMD 命令セットにいくつかの拡張機能が加えられました。高度なベクトル拡張機能である AVX、AVX2 、およびAVX- 512は Intel によって開発されました。AMD は現在の製品でAVX、AVX2、およびAVX-512をサポートしています。 [5]
これらの開発はすべてリアルタイム グラフィックスのサポートを目的としており、したがって 2 次元、3 次元、または 4 次元の処理を目的としています。通常、ベクトル長はデータ タイプとアーキテクチャに応じて 2 ~ 16 ワードです。新しい SIMD アーキテクチャを古いアーキテクチャと区別する必要がある場合、新しいアーキテクチャは「ショート ベクトル」アーキテクチャと見なされます。これは、以前の SIMD およびベクトル スーパーコンピュータのベクトル長が 64 ~ 64,000 であったためです。最新のスーパーコンピュータは、ほとんどの場合、それぞれが (ショート ベクトル) SIMD 命令を実装する MIMD コンピュータのクラスターです。
利点
SIMD を活用できるアプリケーションとしては、多数のデータ ポイントに同じ値を追加 (または減算) するアプリケーションがあります。これは、多くのマルチメディアアプリケーションで一般的な操作です。1 つの例としては、画像の明るさの変更が挙げられます。画像の各ピクセルは、赤 (R)、緑 (G)、青 (B) の各色の明るさを表す 3 つの値で構成されます。明るさを変更するには、R、G、B の値をメモリから読み取り、値を追加 (または減算) して、結果の値をメモリに書き戻します。オーディオDSPも同様に、音量コントロールのために、左右のチャンネルを同時に乗算します。
SIMD プロセッサでは、このプロセスに 2 つの改善が加えられています。1 つは、データがブロックとして認識され、複数の値を一度にロードできることです。「このピクセルを取得して、次のピクセルを取得」という一連の命令の代わりに、SIMD プロセッサでは、実質的に「n ピクセルを取得」という 1 つの命令が実行されます (n は設計ごとに異なる数値)。さまざまな理由から、従来の CPU 設計のように各ピクセルを個別に取得するよりも、はるかに短時間で済みます。
もう 1 つの利点は、命令が 1 回の操作でロードされたすべてのデータに対して実行されることです。つまり、SIMD システムが 8 つのデータ ポイントを一度にロードして動作する場合、データに適用される操作は 8 つの値すべてに対して同時に実行されます。この並列処理は、スーパースカラー プロセッサaddによって提供される並列処理とは別です。8 つの値は、スーパースカラー以外のプロセッサでも並列に処理され、スーパースカラー プロセッサは複数の SIMD 操作を並列に実行できる場合があります。
デメリット
- すべてのアルゴリズムを簡単にベクトル化できるわけではありません。たとえば、コード解析のようなフロー制御を多用するタスクは、SIMD の恩恵を受けにくいかもしれません。ただし、比較と「バッチ フロー」をベクトル化してキャッシュの最適化を最大限に高めることは理論的には可能ですが、この手法では中間状態がさらに必要になります。注: バッチ パイプライン システム (例: GPU またはソフトウェア ラスタライズ パイプライン) は、SIMD 組み込み関数を使用して実装するとキャッシュ制御に最も有利になりますが、SIMD 機能に限定されるわけではありません。コード文字列などのシリーズ内の依存関係を回避するために、さらに複雑になる場合がありますが、ベクトル化には独立性が求められます。[説明が必要]
- レジスタ ファイルが大きいため、消費電力と必要なチップ領域が増加します。
- 現在、SIMD 命令を使用してアルゴリズムを実装するには、通常、人手が必要です。たとえば、ほとんどのコンパイラは、一般的なCプログラムから SIMD 命令を生成しません。コンパイラでの自動ベクトル化は、コンピュータ サイエンスの研究で活発に行われている分野です。(ベクトル処理と比較してください。)
- 特定の SIMD 命令セットを使用したプログラミングには、多数の低レベルの課題が伴う可能性があります。
- SIMD にはデータ アラインメントに関する制限がある場合があります。特定のアーキテクチャに精通しているプログラマーはこれを予期していない可能性があります。さらに悪いことに、アラインメントは、あるリビジョンまたは「互換性のある」プロセッサから別のリビジョンまたは「互換性のある」プロセッサに変わる可能性があります。
- データを SIMD レジスタに収集し、正しい宛先の場所に分散させるのは難しく (場合によっては並べ替え操作が必要になる)、非効率的になる可能性があります。
- 回転や 3 つのオペランドの加算などの特定の命令は、一部の SIMD 命令セットでは使用できません。
- 命令セットはアーキテクチャ固有です。一部のプロセッサには SIMD 命令がまったくないため、プログラマーはそれらのプロセッサに対して非ベクトル化実装 (または異なるベクトル化実装) を提供する必要があります。
- 異なるアーキテクチャではレジスタ サイズ (例: 64、128、256、512 ビット) と命令セットが異なります。つまり、プログラマーは、特定の CPU で最適に動作するために、ベクトル化されたコードの複数の実装を提供する必要があります。さらに、新しいレジスタ サイズごとに、可能な SIMD 命令セットが増えます。残念ながら、レガシー サポート上の理由から、古いバージョンを廃止することはできません。
- 初期のMMX命令セットは浮動小数点スタックとレジスタ ファイルを共有していたため、浮動小数点コードと MMX コードを混在させると非効率が生じていました。しかし、SSE2 ではこれが修正されています。
問題 1 と 5 を解決するために、RISC-Vのベクトル拡張では別のアプローチを採用しています。サブレジスタ レベルの詳細をプログラマーに公開する代わりに、命令セットは、この命令セットを持つすべての CPU で同じインターフェイスを使用するいくつかの「ベクトル レジスタ」としてそれらを抽象化します。ハードウェアは、すべてのアライメントの問題とループの「ストリップマイニング」を処理します。異なるベクトル サイズを持つマシンで、同じコードを実行できます。LLVM はこのベクトル タイプを「vscale」と呼びます。[引用が必要]
同等のスカラーコードや同等のベクトルコードと比較すると、コードサイズが1桁増加するのは珍しいことではなく、ベクトルISAでは1桁以上の効率(命令あたりの作業量)を達成できます。[6]
ARM のスケーラブル ベクター拡張は、Flynn の分類法では「連想処理」と呼ばれ、現在では「述語付き」(マスク付き) SIMDとしてよく知られている別のアプローチを採用しています。このアプローチはベクター処理ほどコンパクトではありませんが、述語なし SIMD よりはるかに優れています。詳細な比較例は、ベクター処理のページに記載されています。
年表
ハードウェア
小規模 (64 または 128 ビット) SIMD は、1990 年代初めに汎用 CPU で普及し、1997 年まで続き、その後Alphaの Motion Video instruction (MVI) にも採用されました。SIMD 命令は、程度の差こそあれ、ほとんどの CPU に採用されています。これには、IBMのAltiVecおよび SPE for PowerPC、HPのPA-RISC Multimedia Acceleration eXtensions (MAX)、IntelのMMX および iwMMXt、SSE、SSE2、SSE3 、 SSSE3、SSE4.x、AMDの3DNow!、 ARCのARC Video サブシステム、SPARCのVISおよび VIS2、SunのMAJC、ARMのNeonテクノロジー、MIPSのMDMX (MaDMaX)、MIPS-3Dが含まれます。 IBM、ソニー、東芝が共同開発したCell プロセッサのSPUの命令セットは、SIMD ベースが中心です。Philips (現在はNXP)は、 Xetalという SIMD プロセッサをいくつか開発しました。Xetal には、特にビジョン タスク用に設計された 320 個の 16 ビット プロセッサ要素があります。
Intel のAVX-512 SIMD 命令は、一度に 512 ビットのデータを処理します。
ソフトウェア


SIMD命令は3Dグラフィックスの処理に広く使用されていますが、SIMDを組み込んだ最新のグラフィックスカードは、CPUからこのタスクをほぼ引き継いでいます。一部のシステムには、ベクトル内の要素を再パックする並べ替え関数も含まれており、特にデータ処理と圧縮に役立ちます。暗号化にも使用されます。[7] [8] [9] GPUでの汎用コンピューティング(GPGPU)のトレンドにより、将来的にはSIMDの使用が拡大する可能性があります。
当初、パーソナル コンピュータソフトウェアにおける SIMD システムの採用は、いくつかの問題のため、ゆっくりとしたものでした。その 1 つは、初期の SIMD 命令セットの多くは、既存の浮動小数点レジスタを再利用するため、システム全体のパフォーマンスが低下する傾向があったことです。MMXや3DNow!などの他のシステムでは、幅広いユーザーにとって興味のないデータ型がサポートされており、FPU レジスタと MMXレジスタを切り替えるためのコストのかかるコンテキスト切り替え命令がありました。コンパイラもサポートされていないことが多く、プログラマはアセンブリ言語コーディング に頼らざるを得ませんでした。
x86上の SIMD はゆっくりとしたスタートを切った。AMDによる3DNow!とIntelによるSSEの導入は多少混乱を招いたが、今日ではシステムは落ち着いてきているようで (AMD が SSE を採用した後)、新しいコンパイラによって SIMD 対応ソフトウェアが増えるはずだ。Intel と AMD はどちらも SIMD 命令を使用する最適化された数学ライブラリを提供しており、libSIMD、SIMDx86、SLEEF などのオープンソースの代替品が登場し始めている ( libmも参照)。[10]
Apple Computer は、 SIMD 市場に参入したのは他より遅かったにもかかわらず、やや成功した。AltiVecは機能豊富なシステムを提供し、Motorola、IBM、GNUのますます洗練されたコンパイラを使用してプログラムできるため、アセンブリ言語プログラミングはほとんど必要なかった。さらに、 iTunesやQuickTimeなど、 SIMD のメリットを享受できるシステムの多くは Apple 自身によって提供されていた。しかし、2006 年に Apple コンピュータは Intel x86 プロセッサに移行した。Apple のAPIと開発ツール( XCode )は、 AltiVec だけでなくSSE2とSSE3もサポートするように変更された。Apple は、 IBM とFreescale Semiconductorからの PowerPC チップの主要購入者であった。Apple は自社製品での PowerPC プロセッサの使用を中止したが、 Freescale と IBM のいくつかの PowerPC およびPower ISA設計で AltiVec のさらなる開発が続けられている。
レジスタ内 SIMD ( SWAR ) は、SIMD 命令を直接サポートしないハードウェア上の汎用レジスタで SIMD を実行するために使用される一連のテクニックとトリックです。これを使用すると、SIMD を直接サポートしないハードウェアでも、特定のアルゴリズムで並列処理を活用できます。
プログラマーインターフェース
SIMD 命令セットの発行元が、ベクトル コードの生成を保証する組み込み関数または特殊なデータ型 (演算子のオーバーロードを含む) を備えた独自の C/C++ 言語拡張機能を作成するのは一般的です。Intel、AltiVec、および ARM NEON は、自社の CPU をターゲットとするコンパイラで広く採用されている拡張機能を提供しています (より複雑な演算は、ベクトル数学ライブラリのタスクです)。
GNU C コンパイラは、 SIMD データ型を定義する方法を提供することで、拡張機能をあらゆるプラットフォームで使用できるユニバーサル インターフェースに抽象化することで、拡張機能をさらに一歩進めています。[11] LLVM Clangコンパイラもこの機能を実装しており、IR で定義された類似のインターフェースを備えています。[12] Rust のpacked_simdクレート (および実験的な) はこのインターフェースを使用しており、 Swiftstd::sims 2.0+も同様です。
std::experimental::simdC++には GCC 拡張と同様に動作する実験的なインターフェースがあります。LLVM の libcxx がそれを実装しているようです。 [引用が必要] GCC と libstdc++ では、GCC 拡張の上に構築されるラッパー ライブラリが利用可能です。[13]
MicrosoftはRyuJITで.NETにSIMDを追加しました。[14]System.Numerics.Vector NuGetで入手可能なパッケージはSIMDデータ型を実装しています。[ 15] Javaには、 OpenJDK 17のインキュベータモジュールで利用可能なSIMD命令用の新しいAPIも提案されています。 [16]また、サポートされていないCPUで単純なループに安全にフォールバックするメカニズムもあります。
SIMDデータ型を提供する代わりに、コンパイラーは、一部のループを自動ベクトル化するようにヒントを与えることもできます。これにより、データ依存性がないというアサーションがいくつか取得される可能性があります。これは、SIMD変数を直接操作するほど柔軟ではありませんが、使いやすいです。OpenMP 4.0+にはヒントがあります。[17]このOpenMPインターフェースは、Cilkの[18] 、 GCCの[ 19]など、幅広い非標準拡張機能を置き換えました。#pragma omp simd#pragma simd#pragma GCC ivdep
SIMD マルチバージョン
消費者向けソフトウェアは、通常、複数の世代にわたるさまざまな CPU で動作することが期待されているため、プログラマーが新しい SIMD 命令を使用してプログラムの計算パフォーマンスを向上させる能力が制限される可能性があります。解決策は、古い SIMD テクノロジまたは新しい SIMD テクノロジを使用する同じコードの複数のバージョンを含め、実行時にユーザーの CPU に最適なものを選択することです (動的ディスパッチ)。解決策には主に 2 つの陣営があります。
- 関数マルチバージョン化 (FMV):プログラムまたはライブラリ内のサブルーチンが多数の命令セット拡張用に複製およびコンパイルされ、プログラムは実行時にどれを使用するかを決定します。
- ライブラリのマルチバージョン化 (LMV):多くの命令セット拡張に対してプログラミング ライブラリ全体が複製され、オペレーティング システムまたはプログラムが実行時にどれをロードするかを決定します。
アセンブリ言語で手動でコーディングされた FMV は、glibc や libjpeg-turbo などのパフォーマンスが重要なライブラリでよく使用されています。Intel C++ コンパイラ、GCC 6 以降のGNU コンパイラ コレクション、および clang 7 以降のClang では、関数の複製と選択をコンパイラが処理する簡略化されたアプローチが可能です。GCC と clang では、関数をtarget_clones「複製」するためにコード内に明示的なラベルが必要ですが、[20] ICC では自動的にこれを行います (コマンドライン オプション/Qax)。Rustプログラミング言語も FMV をサポートしています。GCC や Clang とセットアップが似ており、コードでどの命令セットをコンパイルするかを定義しますが、複製はインライン展開によって手動で行われます。[21]
FMVを使用するにはGCCとClangのコード変更が必要であるため、ベンダーはライブラリのマルチバージョン化をより一般的に使用しています。これは、コンパイラスイッチを変更するだけで済むため、実現が簡単です。GlibcはLMVをサポートしており、この機能はIntelが支援するClear Linuxプロジェクトで採用されています。[22]
ウェブ上のSIMD
2013年にジョン・マカッチャンは、 Dartプログラミング言語用のSIMD命令セットへの高性能インターフェースを作成したと発表し、SIMDの利点を初めてWebプログラムにもたらした。インターフェースは2つのタイプから構成される。[23]
- Float32x4、4 つの単精度浮動小数点値。
- Int32x4、4 つの 32 ビット整数値。
これらの型のインスタンスは不変であり、最適化されたコードでは SIMD レジスタに直接マップされます。 Dart で表現される操作は通常、オーバーヘッドなしで 1 つの命令にコンパイルされます。 これは、C および C++ の組み込み関数に似ています。4×4 行列乗算、3D 頂点変換、およびマンデルブロ集合の視覚化のベンチマークでは、Dart で記述されたスカラー コードと比較して、約 400% の高速化が示されています。
McCutchanのDartに関する研究は、現在SIMD.jsと呼ばれており、 ECMAScriptに採用されており、IntelはIDF 2013で、McCutchanの仕様をV8とSpiderMonkeyの両方に実装していると発表した。[24]しかし、2017年までにSIMD.jsはECMAScriptの標準キューから外され、WebAssemblyで同様のインターフェースを追求することになりました。[25] 2020年8月現在、WebAssemblyインターフェースは未完成のままですが、そのポータブルな128ビットSIMD機能はすでに多くのエンジンで使用されています。
MozillaのC/C++からJavaScriptへのコンパイラであるEmscriptenは、拡張機能により、SIMD組み込み関数またはGCCスタイルのベクトルコードを使用するC++プログラムをJavaScriptのSIMD APIにコンパイルすることができ、スカラーコードと比較して同等の高速化を実現します。[26]また、WebAssembly 128ビットSIMD提案もサポートしています(現在は優先しています)。[27]
商用アプリケーション
SIMD のみのプロセッサ向けの持続可能な商用アプリケーションを見つけることは、一般的に困難であることが証明されています。
ある程度の成功を収めているものの 1 つがGAPPです。これはLockheed Martinによって開発され、同社のスピンオフである Teranex によって商業部門に導入されました。GAPP の最近のバージョンは、さまざまなビデオ規格とフレーム レート間の変換 ( NTSCからPAL、NTSC からHDTV形式など)、インターレース解除、画像ノイズ低減、適応型ビデオ圧縮、画像強調などのリアルタイムビデオ処理アプリケーションにおける強力なツールとなっています。
SIMD のより普遍的な用途は、ビデオ ゲームにあります。1998年以降、ほぼすべての最新のビデオ ゲーム コンソールは、アーキテクチャのどこかに SIMD プロセッサを組み込んでいます。PlayStation 2 は、そのベクトル浮動小数点ユニットの 1 つが、独自の命令ストリームを実行する自律 DSP として、または通常の CPU 命令によって駆動されるコプロセッサとして機能できるという点で珍しいものでした。3D グラフィックス アプリケーションは、4 次元ベクトルの操作に大きく依存するため、SIMD 処理に適している傾向があります。MicrosoftのDirect3D 9.0 は、 SIMD 対応命令の使用を含む、独自の数学演算のプロセッサ固有の実装を実行時に選択するようになりました。
ベクトル処理を採用した最近のプロセッサは、Playstation 3 で使用されているCell プロセッサです。これはIBMが東芝およびソニーと共同で開発したものです。このプロセッサは多数の SIMD プロセッサ (それぞれが独立したローカル ストアを持ち、汎用 CPU によって制御されるNUMAアーキテクチャ) を使用し、3D およびビデオ処理アプリケーションに必要な膨大なデータセットに対応しています。従来の ISA とは異なり、最初から SIMD であり、個別のスカラー レジスタがありません。
Ziilabsは、メディアプレーヤーや携帯電話などのモバイルデバイスで使用するためのSIMD型プロセッサを製造しました。[28]
より大規模な商用 SIMD プロセッサは、ClearSpeed Technology, Ltd. および Stream Processors, Inc. から提供されています。ClearSpeedのCSX600 (2004) には、それぞれ 2 つの倍精度浮動小数点ユニットを備えた 96 個のコアがあり、CSX700 (2008) には 192 個のコアがあります。Stream Processors は、コンピュータ アーキテクトのBill Dallyが率いています。同社の Storm-1 プロセッサ (2007) には、MIPS CPU によって制御される 80 個の SIMD コアが含まれています。
参照
- ストリーミング SIMD 拡張、MMX、SSE2、SSE3、高度ベクトル拡張、AVX-512
- 命令セットアーキテクチャ
- フリンの分類法
- レジスタ内のSIMD (SWAR)
- 単一プログラム、複数データ (SPMD)
- オープンCL
参考文献
- ^ Flynn, Michael J. (1972 年 9 月). 「いくつかのコンピュータ組織とその有効性」(PDF) . IEEE Transactions on Computers . C-21 (9): 948–960. doi :10.1109/TC.1972.5009071.
- ^ 「MIMD1 - XP/S、CM-5」(PDF)。
- ^ Conte, G.; Tommesani, S.; Zanichelli, F. (2000). 「MMX/SSE による高性能画像処理への長く曲がりくねった道」. Proc. Fifth IEEE Int'l Workshop on Computer Architectures for Machine Perception . doi :10.1109/CAMP.2000.875989. hdl :11381/2297671. S2CID 13180531.
- ^ Lee, RB (1995). 「 PA-RISC プロセッサによるソフトウェア解凍によるリアルタイム MPEG ビデオ」。Compcon '95 論文ダイジェスト。情報スーパーハイウェイのテクノロジ。pp. 186–192。doi :10.1109 / CMPCON.1995.512384。ISBN 0-8186-7029-0.S2CID 2262046 。
- ^ 「Ryzen 9 7950XレビューにおけるAMD Zen 4 AVX-512パフォーマンス分析」www.phoronix.com . 2023年7月13日閲覧。
- ^ パターソン、デビッド、ウォーターマン、アンドリュー(2017年9月18日)。「SIMD命令は有害であると考えられる」SIGARCH。
- ^ RE: SSE2 の速度、SSE2 が SHA ハッシュ アルゴリズムの実装にどのように使用されているかを示します
- ^ Salsa20 の速度。SSE2 を使用して実装されたストリーム暗号を示す Salsa20 ソフトウェア
- ^ 件名: SSE2 を使用した最大 1.4 倍の RSA スループット。非 SIMD SSE2 整数乗算命令を使用して実装された RSA を示します。
- ^ 「SIMD ライブラリ数学関数」。Stack Overflow。2020年1 月 16 日閲覧。
- ^ 「ベクター拡張」。GNUコンパイラ コレクション (GCC) の使用。2020年1 月 16 日閲覧。
- ^ 「Clang 言語拡張」。Clang 11 ドキュメント。2020年1 月 16 日閲覧。
- ^ 「VcDevel/std-simd」。VcDevel。2020年8月6日。
- ^ 「RyuJIT: .NET 向けの次世代 JIT コンパイラ」。2013 年 9 月 30 日。
- ^ 「JIT がついにプロポーズ。JIT と SIMD が結婚します」。2014 年 4 月 7 日。
- ^ 「JEP 338: ベクター API」。
- ^ 「SIMD ディレクティブ」。www.openmp.org。
- ^ “Tutorial pragma simd”. CilkPlus . 2012年7月18日. 2020年12月4日時点のオリジナルよりアーカイブ。 2020年8月9日閲覧。
- ^ Kruse, Michael. 「OMP5.1: ループ変換」(PDF)。
- ^ 「GCC 6 での関数のマルチバージョン化」lwn.net。
- ^ "2045-target-feature". Rust RFCブック。
- ^ 「Intel® アーキテクチャ向けに最適化されたライブラリー・パッケージの透過的な使用」。Clear Linux* プロジェクト。2019年9 月 8 日閲覧。
- ^ John McCutchan. 「Dart 経由で SIMD を Web に導入する」(PDF) 。2013 年 12 月 3 日のオリジナル(PDF)からアーカイブ。
- ^ 「JavaScript の SIMD」01.org . 2014 年 5 月 8 日。
- ^ 「tc39/ecmascript_simd: EcmaScript の SIMD 数値型」。GitHub。Ecma TC39。2019 年 8 月 22 日。2019年9 月 8 日に閲覧。
- ^ Jensen, Peter; Jibaja, Ivan; Hu, Ningxin; Gohman, Dan; McCutchan, John (2015). 「C++ と Emscripten による JavaScript での SIMD」(PDF)。
- ^ 「WebAssembly をターゲットとした SIMD コードの移植」。Emscripten 1.40.1 ドキュメント。
- ^ 「ZiiLABS ZMS-05 ARM 9 メディアプロセッサ」。ZiiLabs 。 2011年7月18日時点のオリジナルよりアーカイブ。2010年5月24日閲覧。
外部リンク
- SIMD アーキテクチャ (2000)
- Pentium 3 の分解 (1999)
- 商用マイクロプロセッサにおけるショートベクトル拡張
- Intel ストリーミング SIMD 拡張命令を使用したアニメーション モデルのレンダリング パイプラインの最適化に関する記事
- 「Yeppp!」: ジョージア工科大学のクロスプラットフォーム、オープンソース SIMD ライブラリ
- LLNL ローレンス・リバモア国立研究所による並列コンピューティング入門 2013-06-10 にWayback Machineでアーカイブ
- GitHubの simde : C/C++ ヘッダーを使用して、他のプラットフォーム用のプラットフォーム固有の組み込み関数 (例: ARM NEON の SSE 組み込み関数) を移植可能な実装
