問題タブ [simd]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
35192 参照

arm - ARM Cortex-A8:VFPとNEONの違いは何ですか

ARM Cortex-A8プロセッサでは、NEONとは何かを理解しています。これは、SIMDコプロセッサです。

しかし、コプロセッサーでもあるVFP(Vector Floating Point)ユニットはSIMDプロセッサーとして機能しますか?もしそうなら、どちらを使用するのが良いですか?

私は次のようないくつかのリンクを読みました-

  1. Link1

  2. Link2

しかし、それらが何を意味するのかはあまり明確ではありません。彼らは、VFPがSIMDに使用されることを意図したものではなかったと言っていますが、Wikiで次のように読んでいます-「VFPアーキテクチャは短いベクトル命令の実行もサポートしていますが、これらは各ベクトル要素で順番に動作するため、真のSIMDのパフォーマンスを提供しません(シングルインストラクションマルチデータ)並列処理。

何を信じるべきかはそれほど明確ではありませんが、誰かがこのトピックについてもっと詳しく説明できますか?

0 投票する
4 に答える
27082 参照

c - CでSSE組み込み関数を使用して単一ベクトルの内積を計算する方法

2つのベクトルを掛け合わせようとしています。ここで、一方のベクトルの各要素に、もう一方のベクトルの同じインデックスの要素を掛けます。次に、結果のベクトルのすべての要素を合計して、1つの数値を取得します。たとえば、ベクトル{1,2,3,4}と{5,6,7,8}の計算は次のようになります。

基本的に、私は2つのベクトルの内積を取ります。これを行うためのSSEコマンドがあることは知っていますが、コマンドには組み込み関数が関連付けられていません。この時点では、Cコードでインラインアセンブリを記述したくないので、組み込み関数のみを使用したいと思います。これは一般的な計算のように思われるので、Googleで答えが見つからなかったことに私は驚いています。

注:SSE4.2までをサポートする特定のマイクロアーキテクチャー向けに最適化しています。

0 投票する
4 に答える
3203 参照

c - SSE組み込み関数を使用して、4つのドット積をCの連続した配列に格納する最も効率的な方法

SSE組み込み関数を使用して、Intelx86Nehalemマイクロアーキテクチャ用にいくつかのコードを最適化しています。

私のプログラムの一部は4つの内積を計算し、各結果を配列の連続したチャンクの前の値に追加します。すなわち、

各ドット積の結果を保持するために4つの一時xmmレジスタを使用してこれを実行していることに注意してください。各xmmレジスタでは、結果は他の一時的なxmmレジスタに対して一意の32ビットに配置され、最終結果は次のようになります。

tmp0=R0-ゼロ-ゼロ-ゼロ

tmp1=ゼロ-R1-ゼロ-ゼロ

tmp2=ゼロ-ゼロ-R2-ゼロ

tmp3=ゼロ-ゼロ-ゼロ-R3

次の手順でそれらを合計することにより、各tmp変数に含まれる値を1つのxmm変数に結合します。

最後に、ドット積の4つの結果すべてを含むレジスタを配列の連続部分に追加して、配列のインデックスがドット積によって増分されるようにします(C_0nは、更新される配列に現在ある4つの値です)。 ; C_2は、これら4つの値を指すアドレスです):

ドット積の結果を取得して、それらを配列の連続するチャンクに追加するための、より回りくどく、より効率的な方法があるかどうかを知りたいです。このようにして、ゼロ以外の値が1つしかないレジスタ間で3つの加算を実行しています。これを回避するためのより効果的な方法があるはずです。

私はすべての助けに感謝します。ありがとうございました。

0 投票する
1 に答える
162 参照

optimization - SSE を使用した有限差分の最適化

次のループを最適化するために SSE (1,2,3,4,...) を使用できるかどうか疑問に思っています。

この[j*size + k]イディオムは、メモリのブロックを多次元配列であるかのように扱うために使用されます。

残念ながら、-ftree-vectorizeGCC (4.5) のフラグは、ループが SIMD タイプの最適化に適しているとは考えていません。-ftree-vectorize(ただし、最も単純なループ以外を最適化するのを見たことはありません。)

ループのパフォーマンスを改善する方法が他にもたくさんあることは承知していますが (OpenMP、アンローリング、インプレース アルゴリズムなど)、SIMD を使用できるかどうかを特に知りたいと思っています。私はおそらく、具体的な実装とは対照的に、そのようなループをどのように変換できるか (もしあれば) の一般的な概要にもっと興味があります。

0 投票する
2 に答える
1045 参照

simd - MMX/SSE命令をAltiVecに移植する

はじめに..私はASMの経験が非常に限られており、SIMDの経験はさらに少ないです。

しかし、次のMMX / SSE最適化コードがあり、PPC/Cellプロセッサで使用するためにAltiVec命令に移植したいと思います。

これはおそらく大きな質問です。数行のコードですが、ここで何が起こっているのかを理解するのに問題はありませんでした。

元の機能:

AltiVec命令を使用するためにこれを書き直す方法に関するヒントはありますか?

私の最初の試み(非常に間違った試み)は次のようになります。しかし、それは完全に(またはリモートでさえ)正しくありません。

0 投票する
2 に答える
5257 参照

c - What's the most efficient way to load and extract 32 bit integer values from a 128 bit SSE vector?

I'm trying to optimize my code using SSE intrinsics but am running into a problem where I don't know of a good way to extract the integer values from a vector after I've done the SSE intrinsics operations to get what I want.

Does anyone know of a good way to do this? I'm programming in C and my compiler is gcc version 4.3.2.

Thanks for all your help.

0 投票する
1 に答える
447 参照

c++ - 浮動小数点値に相当するAltiVecvec_msum

float値のベクトルに対してvec_msum機能を実現する方法を知っている人はいますか?

私はSIMDにまったく慣れていません。私はそれを理解し始めていると思いますが、まだいくつかのパズルがあります。

私の最終目標は、関数 "convolve_altivec"(この質問の受け入れられた回答にある)を書き直して、入力パラメーターをshortではなくfloat値として受け入れるようにすることです。

つまり、プロトタイプは

以下の元の最適化されていない関数によって提供される機能を一致させようとしています。

私の最初の努力は、この同じ関数の既存のSSEバージョンをaltivec命令に移植しようとしているのを見てきました。

0 投票する
1 に答える
1618 参照

c - 64ビット固有のsimd組み込み

SSE2では次のユニオン宣言を使用しています。

アイデアは、2つの符号なしlong変数(64ビット長)をそれぞれaとbに割り当て、それらをXORして、結果をcに配置することです。

ここでは明示的な割り当て(a.data[0] = something)が機能しますが、より多くの時間が必要です。

組み込み関数を使用する予定です。を使用する_mm_set_epi64 (unsigned long x, unsigned long y)と、変数を要求し__m64ます。これらの変数をキャストすると正常に(__m64)x機能しますが、間違った結果になります。

上記のコードはエラーになります:

いくつかの代替案(組み込み関数)を提案できますか?

0 投票する
4 に答える
4072 参照

c - SIMDコードはスカラーコードよりも実行が遅くなります

elmaelmcは両方ともunsigned long配列です。res1とですres2

forループ内には、要素のXORの非simdバージョンとsimdバージョンの両方が含まれています。2番目のforループ内の最初の2行は、明示的なXORを実行しますが、残りは同じ操作のsimdバージョンを実装します。

このループは外部から何百回も呼び出されるため、このループを最適化すると、合計計算時間を短縮できます。

問題は、simdコードがスカラーコードよりも何倍も遅く実行されることです。

編集:部分的な展開を行いました

しかし、結果はあまり変わりません。それでもスカラーコードの2倍の時間がかかります。

0 投票する
2 に答える
2443 参照

c - SIMD コードとスカラー コード

次のループは何百回も実行されます。
elma and elmc are both unsigned long (64-bit) arrays, so is res1 and res2.

for ループ内では、スカラー バージョンのコード (コメント付き) は、simd コードよりも 2 倍速く実行されます。上記の行の cachegrind 出力 (命令読み取り) を以下に示します。

行1:668,460,000 2 2 2
行目2行目:668,460,000 1 1
行3:89,985,000 1 1
行4:89,985,000 1 1 行 5
:617,040,000 2 2 2
行6:44,992,500 0 0
行7:44,992,500 0 : 128,550,000 0 0 行 10: 。. . 11 行目: 205,680,000 0 0 12 行目: 205,680,000 0 0




上の図から、コメント化された (スカラー コード) は、simd コードよりもはるかに少ない数の命令を必要とするように見えます。

このコードを高速化するにはどうすればよいですか?