問題タブ [sse]
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.
c++ - 特別な CPU 機能の C/C++ の使用
新しいコンパイラは、MMX SSE、3DNow! などの新しい CPU に組み込まれた追加機能を使用しますか? など?
つまり、元の 8086 には FPU さえなかったので、古いコンパイラはそれを使用することさえできませんが、FPU はすべての新しい CPU の一部であるため、新しいコンパイラは使用できます。では、新しいコンパイラは CPU の新しい機能を使用しますか?
または、新しい C/C++ 標準ライブラリ関数は新しい機能を使用していますか?
ご回答ありがとうございます。
編集:
わかりましたので、すべてが正しければ、特に浮動小数点数を使用する標準的な操作でさえ、SSE を使用してより高速に実行できます。
これを使用するには、コンパイラでこの機能を有効にする必要があります (サポートされている場合)。もしそうなら、対象のプラットフォームがその機能をサポートしていることを確認する必要があります。
OpenGL、DirectX など、最高のパフォーマンスを必要とする一部のシステム ライブラリの場合、このサポートはシステムでサポートされる場合があります。
デフォルトでは、互換性の理由から、コンパイラはそれをサポートしていませんが、Intel などによって提供される特別な C 関数を使用して、このサポートを追加できます。これは、任意のプラットフォームを直接制御でき、目的のプラットフォームの特別な機能を使用してマルチ CPU をサポートするアプリケーションを作成できるため、最適な方法です。
g++ - 組み込みプログラム (SSE) - g++ - ヘルプが必要
stackoverflow に質問を投稿するのはこれが初めてなので、質問やコードの書式設定で行った可能性のあるエラーを見逃さないようにしてください。しかし、私がもっと注意するように、同じことを私に指摘してください。
私は、2 つの 128 ビット (4 つの float 変数を含む) の数値を加算するための単純な組み込みルーチンをいくつか作成しようとしていました。ネット上でいくつかのコードを見つけ、それを自分のシステムで実行しようとしていました。コードは次のとおりです。
私が使用する g++ パラメータは次のとおりです。
私が得るエラーは次のとおりです。
これらのエラーをデバッグしたり、ググったりするのに多くの時間を費やしました。私は組み込み関数の完全な初心者なので、いくつかの重要なことを見落としている可能性があります。
どんな助けでも大歓迎です、
ありがとう、
Sriram。
visual-c++ - ループのSSESIMD最適化
ループ内にいくつかのコードがあります
したがって、uとbは同じ長さのベクトルであり、cとsはスカラーです。このコードは、高速化のためにSSEで使用するためのベクトル化の良い候補ですか?
アップデート
私はベクトル化を学び(組み込み関数を使用すればそれほど難しくないことがわかりました)、SSEにループを実装しました。ただし、VC ++コンパイラでSSE2フラグを設定すると、自分のSSEコードとほぼ同じパフォーマンスが得られます。一方、Intelコンパイラは、私のSSEコードやVC++コンパイラよりもはるかに高速でした。
これが私が参考のために書いたコードです
assembly - 私のSSE/アセンブリの試みについて建設的な批判が必要です
私は少しのコードをSSEに変換する作業をしていますが、正しい出力がありますが、標準のc++コードよりも遅いことがわかりました。
これを行うために必要なコードは次のとおりです。
私がSSEコードについて持っているのは:
コードを読むのは非常に難しいので、私がしたことを説明します。
ロードされたvector4、xmm0 _____ p = [px、py、px、py]
mult。vector4により、xmm1 _ cs = [c、c、s、s]
__________________________ mult ----------------------------
result、_____________ xmm0 = [px c、py c、px s、py s]
再利用結果、xmm0 = [px c、py c、px s、py s]
シャッフル結果、xmm2 = [py s、px s、py c、pxc ]
_____________________減算------------- ---------------
結果、xmm0 = [px c-py s、py c-px s、px s-py c、py s-px c]
再利用結果、xmm0 = [px c-py s、py c-px s、px s-py c、py s-px c]
load m vector4、scale = [m、m、m、m]
__________________________ mult ---- ------------------------
結果、xmm0 = [(px c-py s)m、(py c-px * s)m、(px s-py * c)m、(py s-px * c)m]
load xy vector4、xmm3 = [p2x、p2x、p2y、p2y]
再利用、xmm0 = [(px c-py * s)m、(py c-px * s)m、(px s-py * c)m、(py s-px * c)m]
_____________________ subtract --------------------- -------
結果、xmm3 = [p2x-(pxc-py * s)m、p2x-(py c-px * s)m、p2y-(px s-py * c)m、p2y-(py s-px * c)* m]
次に、ox =xmm3[0]およびoy=xmm3 [3]なので、基本的にxmm3[1]またはxmm3[4]は使用しません。
これを読むのが難しいことをお詫びしますが、標準のc ++コードは0.001444msで実行され、SSEコードは0.00198msで実行されるため、誰かが私に何らかのガイダンスを提供してくれることを願っています。
これをさらに説明/クリーンアップするために私にできることがあれば教えてください。私がSSEを使おうとしている理由は、この計算を何百万回も実行しているためです。これは、現在のコードの速度を低下させている原因の一部です。
助けてくれてありがとう!ブレット
g++ - g++ SSE 組み込みのジレンマ - 組み込みの「飽和」からの値
2 つの大きな (100000 要素以上の) ベクトルの内積を計算するための SSE 組み込み関数を実装する簡単なプログラムを作成しました。このプログラムは、従来の方法で計算された内積と組み込み関数を使用した両方の実行時間を比較します。内積を計算するステートメントの前に (楽しみのために) 内部ループを挿入するまで、すべてがうまくいきます。先に進む前に、コードを次に示します。
これをビルドするには、次の g++ 呼び出しを使用します。
上記の各ループは、両方の関数で合計 N^2 回実行されます。ただし、arr1 と arr2 (2 つの浮動小数点ベクトル) が値 2.5 でロードされる場合、配列の長さは 100,000 であり、両方の場合の結果は 6.25e+10 になります。私が得る結果は次のとおりです。
結果:
result_Conventional = 6.25e+10
result_Intrinsics = 5.36871e+08
これだけではありません。組み込み関数を使用した関数から返される値は、上記の値で「飽和」しているようです。配列の要素と異なるサイズに他の値を入れてみました。しかし、配列の内容の 1.0 を超える値と 1000 を超えるサイズは、上記と同じ値になるようです。
最初は、SSE 内のすべての操作が浮動小数点で行われるためではないかと考えましたが、浮動小数点は e+08 のオーダーの数値を格納できるはずです。
どこが間違っている可能性があるかを確認しようとしていますが、それを理解できないようです。g++ バージョンを使用しています: g++ (GCC) 4.4.1 20090725 (Red Hat 4.4.1-2)。
これに関するヘルプは大歓迎です。
ありがとう、
スリラム。
assembly - レイテンシとスループットを含む簡潔な SSE および MMX 命令リファレンス
インライン アセンブリで MMX および SSE 命令セットを使用して、いくつかの演算を最適化しようとしています。ただし、これらの強化された命令セットのタイミングと使用法に関する適切なリファレンスを見つけることができませんでした。スループット、レイテンシ、オペランド、およびおそらく命令の簡単な説明に関する情報を含むリファレンスを見つけるのを手伝ってくれませんか?
これまでのところ、私は見つけました:
Intel 命令リファレンス Intel 64 and IA-32 Architectures Developer's Manual: Vol. 2Aおよび Intel 64 および IA-32 アーキテクチャ開発者マニュアル: Vol. 2B
インテル最適化ガイド http://www.intel.com/Assets/PDF/manual/248966.pdf
整数演算のタイミング http://gmplib.org/~tege/x86-timing.pdf
c - 高速な 24 ビット配列 -> 32 ビット配列変換?
簡単な要約:
24 ビット値の配列があります。個々の 24 ビット配列要素を 32 ビット要素にすばやく拡張する方法について何か提案はありますか?
詳細:
DirectX 10 のピクセル シェーダーを使用して、着信ビデオ フレームをリアルタイムで処理しています。つまずきは、私のフレームが 24 ビット ピクセル (YUV または RGB 画像として) のキャプチャ ハードウェアから受信されていることですが、DX10 は 32 ビットを使用します。ピクセル テクスチャ。そのため、24 ビット値を GPU にロードする前に 32 ビットに拡張する必要があります。
残りの 8 ビットを何に設定したか、または受信した 24 ビットがその 32 ビット値のどこにあるかは気にしません。ピクセル シェーダーですべてを修正できます。しかし、24 ビットから 32 ビットへの変換は非常に迅速に行う必要があります。
私は SIMD SSE 操作にあまり詳しくありませんが、読み取りと書き込みのサイズが同じでないことを考えると、ざっと見ただけでは、それらを使用して拡張を実行できるようには見えません。助言がありますか?それとも、このデータセットを順番にマッサージしているのでしょうか?
これは非常にばかげているように感じます。並列処理のためにピクセル シェーダーを使用していますが、その前にピクセルごとの順次操作を行う必要があります。明らかな何かが欠けているに違いない...
c - 高速ダブル->SSEを使用したクランプによる短い変換?
double値をshorts(16ビット符号付き)にキャストする高速な方法はありますか?現在、私は次のようなことをしています:
SSEを使用してこれを行うには、はるかに効率的な高速な方法があると思います。
c - WindowsコンパイラとGCCコンパイラの両方でSSEを使用するには?
SSE 拡張機能を使用してコードを最適化する必要があります。私のターゲット プラットフォームは Windows と Linux であるため、MS コンパイラ (VStudio) と GCC コンパイラを使用してアプリケーションをビルドします。
SSE を巻き込むためにどのようなアプローチが存在しますか? GCC で SSE を使用する方法の多くの例を見つけることができますが、MS コンパイラで使用するには互換性がないようです。Milti プラットフォームの SSE アプローチはありますか?
ruby - Ruby SIMD & SSE
ruby Array 型を拡張して SIMD & SSE ベクトル計算を行う方法があるかどうか疑問に思っています。
つまり、Ruby プログラムで処理タスクに番号を付けるために使用される低水準言語で実装するということです。