問題タブ [avx]
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がSSE3命令セットをサポートしているかどうかを確認するにはどうすればよいですか?
次のコードは、CPUがSSE3命令セットをサポートしているかどうかを確認するために有効ですか?
このIsProcessorFeaturePresent()
機能の使用は、WindowsXPでは明らかに機能しません。
c++ - const非整数指数を使用したpow()の最適化?
コードにホットスポットがpow()
あり、実行時間の約10〜20%を占めています。
私の入力は非常に具体的であるため、より高いパフォーマンスで2つの近似(各指数に1つ)pow(x,y)
をロールする方法があるかどうか疑問に思っています。pow()
- 2.4と1/2.4の2つの定数指数があります。
- 指数が2.4の場合、xは(0.090473935、1.0]の範囲になります。
- 指数が1/2.4の場合、xは(0.0031308、1.0]の範囲になります。
- SSE/AVX
float
ベクトルを使用しています。プラットフォームの詳細を利用できる場合は、すぐに!
float
完全な精度(の)アルゴリズムにも関心がありますが、最大エラー率は約0.01%が理想的です。
私はすでに高速pow()
近似を使用していますが、これらの制約は考慮されていません。もっとうまくやることは可能ですか?
memory - 新しいHaswellAVXの「収集」命令の配置制限は何ですか?
私はAVXプログラミングリファレンスを見ています。新しいHaswellの指示には、待望の「収集」ロードが含まれています。ただし、インデックス付けされたデータ項目の配置制限が何であるかを理解できません。リファレンスのセクション2.5「メモリアライメント」は、VGATHER*
表2.4または2.5のいずれかにさまざまな命令をリストする必要があるようです...しかし、そうではありません。
背景:収集命令でサポートされているデータサイズは4バイトと8バイトですが、私のアプリケーションは、隣接する16ビットデータ値のペアを収集してDWORDSにロードすることでメリットが得られる可能性があります。2バイトスケールの奇数インデックスは2バイトに整列された4バイトのロードを生成し、これが失敗するか、そうでなければ意図したとおりに機能しないかはマニュアルからは明らかではありません(私はすべてを考えると運が悪いと思いますアラインされていないアクセスをサポートする命令には、「U」が含まれているようです)。
intrinsics - AVX _m256_unpack*_ps unpack 組み込みからの予期しない結果
_m256_unpacklo_ps
AVX 組み込みのアンパック命令を使用して、 _m256_unpackhi_ps
16 個の float 値をインターリーブしようとしています。AVX でアンパックがどのように機能するかを理解していないか、何かが正常に機能していないため、得られた結果は奇妙です。
私が見ているのは、たとえば、2 つのベクトル v1 と v2 から低次浮動小数点数を 3 番目の v3 にアンパックしようとすると、次のように表示されることです。
v1 が [a b c d e f g h]
v1 の場合[i j k l m n o p]
その後v3 = _m256_unpacklo_ps(v1, v2)
、
[a i b j e m f n]
v3が与えると思ったとき[a i b j c k d l]
私の期待は間違っていますか、それともこれを間違って使用していますか? それとも他の何かが故障していますか?
テストコードは次のとおりです。
コンパイルに gcc 4.5.2 を使用しています。
助けてくれてありがとう!- ジャスティン
x86 - 256 ビット AVX (YMM) レジスタで下位 128 ビットと上位 128 ビットを交換するにはどうすればよいですか?
256 ビット AVX 拡張機能を使用するために SSE SIMD コードを移植していますが、上位 128 ビットと下位 128 ビットをブレンド/シャッフル/移動する命令が見つからないようです。
裏話:
私が本当に望んでいるのはVHADDPS
/_mm256_hadd_ps
のように振る舞うことですHADDPS
、_mm_hadd_ps
256 ビットワードだけで。残念ながら、それHADDPS
は下位語と上位語で独立して行動するための 2 つの呼び出しのように機能します。
c++ - Sandy Bridgeの一連のintでビットを別々のビンにすばやくカウントするにはどうすればよいですか?
更新:コードを読んでください、それは1つのintのビットを数えることではありません
いくつかの巧妙なアセンブラを使用して、次のコードのパフォーマンスを向上させることは可能ですか?
Count
私のアルゴリズムの最も内側のループにあります。
更新: アーキテクチャ:x86-64、Sandy Bridge、SSE4.2、AVX1、およびそれ以前の技術を使用できますが、AVX2またはBMI1/2は使用できません。
bits
変数にはほぼランダムなビットがあります(半分のゼロと半分の1に近い)
c++ - AVX CPU命令の使用:「/ arch:AVX」がないとパフォーマンスが低下します
私のC++コードはSSEを使用していますが、AVXが利用可能になったときにサポートするようにSSEを改善したいと考えています。そこで、AVXが利用可能になるタイミングを検出し、AVXコマンドを使用する関数を呼び出します。Win7 SP1 +VS2010SP1とAVXを搭載したCPUを使用しています。
AVXを使用するには、次のものを含める必要があります。
_mm256_mul_ps
次に、などの組み込みAVX関数を使用できます_mm256_add_ps
。問題は、デフォルトで、VS2010が非常に低速で動作し、警告を表示するコードを生成することです。
警告C4752:Intel(R)AdvancedVectorExtensionsが見つかりました。/ arch:AVXの使用を検討してください
VS2010は実際にはAVX命令を使用していないようですが、代わりにそれらをエミュレートします。/arch:AVX
コンパイラオプションを追加して、良い結果を得ました。ただし、このオプションは、可能な場合はどこでもAVXコマンドを使用するようにコンパイラーに指示します。そのため、AVXをサポートしていないCPUでコードがクラッシュする可能性があります。
したがって、問題は、VS2010コンパイラを作成してAVXコードを生成する方法ですが、AVX組み込み関数を直接指定する場合に限ります。SSEの場合は、SSE組み込み関数を使用するだけで、のようなコンパイラオプションなしでSSEコードを生成します/arch:SSE
。しかし、AVXの場合、何らかの理由で機能しません。
c++ - VS2010 SP1はAVX命令セットの一部のみをサポートしますか?
Microsoftは、VS2010がAVX命令のフルセットをサポートしていると述べています。
... VS2010リリースでは、すべてのAVX機能と命令が組み込みおよびを介して完全に/arch:AVX
サポートされています。..。
しかし、FusedMultiplyAdd操作の組み込み関数が見つかりません
関数を使用する必要があり_mm256_fmadd_ps
ますが、「immintrin.h」ヘッダーにありません。私は本当にそれに固執しています。
c++ - SSE/AVX値を含む型の受け渡し
私が次のものを持っているとしましょう
ハードコアループで一般的に優れているのは次のうちどれですか(もしあれば、その理由)?
x86 - Intel AVXを使用して、パックされたダブルベクトルから個々のダブルを格納する
IntelのAVX命令用のC組み込み関数を使用してコードを書いています。パックされた二重ベクトル(a __m256d
)がある場合、それぞれをメモリ内の異なる場所に格納するための最も効率的な方法(つまり、操作の数が最も少ない)は何でしょうか(つまり、次のような異なる場所にファンアウトする必要があります)彼らはもう詰め込まれていません)?擬似コード:
SSEを使用すると、および組み込み関数__m128
を使用する型でこれを行うことができます。個々の64ビット部分をメモリに保存できるAVXに類似したものを見つけることができませんでした。存在しますか?_mm_storel_pi
_mm_storeh_pi