問題タブ [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 - SSE/AVX で Fused Multiply-Add (FMA) 命令を使用する方法
一部の Intel/AMD CPU は、SSE/AVX で同時に乗算と加算を実行できることを知りまし
た。
コードでこれを行う方法を知りたいのですが、CPU の内部でどのように行われるかも知りたいです。つまり、スーパースカラー アーキテクチャのことです。SSEで次のような長い金額をやりたいとしましょう:
私の質問は、これをどのようにして同時乗算と加算に変換するのですか? データは依存できますか? つまり、CPUは_mm_add_ps(sum, _mm_mul_ps(a1, b1))
同時に実行できますか、それとも乗算と加算に使用されるレジスタは独立している必要がありますか?
最後に、これは FMA (Haswell) にどのように適用されますか? _mm_add_ps(sum, _mm_mul_ps(a1, b1))
単一の FMA 命令またはマイクロ操作に自動的に変換されますか?
c++ - gcc 4.6.1 を使用して mex で AVX 命令を有効にします。
いくつかの AVX 組み込み関数をいじりたいと思います。/arch:AVX
ビジュアル スタジオと同様に、可能であれば gcc で AVX のみを使用するようにしてください。mexを使用してgccでこれを行う方法はありますか?
私は次のようなものを使ってみました:
mex -g -O $CFLAGS='$CFLAGS -march=corei7-avx' ncorr_alg_rgdic.cpp standard_datatypes.o ncorr_datatypes.o
しかし、コンパイラは言うeval: 1: = -march=corei7-avx: not found
. どのフラグを使用する必要があり、mex にそれを受け入れさせる方法を知っている人はいますか? デフォルトでは、SSE命令を使用しているようです(アセンブリ出力を見ると、いくつかのsが表示されます)が、ここで問題を引き起こす可能性があることmulsd
を読んだので、SSEとAVXを混在させたくありません。
EDIT1:
gcc 4.6.1でubuntu 11.04を使用しています。
EDIT2:
コンパイル:
mex CXXOPTIMFLAGS='-mtune=corei7-avx -S' ncorr_alg_rgdic.cpp standard_datatypes.o ncorr_datatypes.o
収量:
でコンパイル:
mex CXXOPTIMFLAGS='-mavx -S' ncorr_alg_rgdic.cpp standard_datatypes.o ncorr_datatypes.o
およびmex CXXOPTIMFLAGS='-march=corei7-avx -S' ncorr_alg_rgdic.cpp standard_datatypes.o ncorr_datatypes.o
両方の結果:
今、私はmulsd
sse命令であると確信しています。AVX 命令ですかvmulsd
(不思議なことに、結果が得られませんでした)。ymm
また、奇妙なレジスタが使用されていることもわかりません。
c++ - AVX 整数演算の実行
AVX を使用していくつかの整数 (_int64) 操作を最適化しようとしています。しかし、単純な追加操作すらできません。それは私に違法な命令を言い続けます。Plsは私が間違っていることを修正できますか? ありがとう
c++ - AVXは64ビット整数を64ビット浮動小数点数に変換します
AVX を使用して、4 つのパックされた 64 ビット整数を 4 つのパックされた 64 ビット浮動小数点数に変換したいと思います。私は次のようなことを試しました:
デバッガーに表示されるもの:
これまでのところわかりましたが、私が見つけることができる唯一のキャスト/変換操作は _mm256i_castsi256_pd であり、これでは私が望むものは得られません:
私が本当に見たいのは:
c++ - AVX での 6 要素倍精度ベクトル行列ベクトル乗算
次の操作を倍精度で行う必要があります。
数値は、値がメモリに格納される方法を表します。これをAVXで実装したい。最初にの列を 8 要素までパディングして[QK]
から、行列ベクトルの乗算を実行し、その後[x]
に[QK]
内積を実行するのが最善でしょうか?
編集: わかりましたので、以下に示すように、ベクトルが埋め込まれたFLOAT 32 ビットバージョンを実装することにしました。
現状では、以下よりも約 3 倍高速に実行されます。
5 億回の反復では、標準の C バージョンは約 9 秒で実行され、単精度の AVX バージョンは約 3.5 秒で実行されます。最後に水平合計をコメントアウトすると、約 0.5 秒で実行されます。水平合計は本当にパフォーマンスを殺します...
x86 - _mm256_testz_pd が機能しない?
私は Linux で Core i7 に取り組んでおり、g++ 4.63 を使用しています。
次のコードを試しました:
3 つの 1 が出力されました。そのうちの少なくとも 1 つが 0 になると予想していました。
を使用してみ_mm256_castpd_si256
まし_mm256_testz_si256
たが、最初の行に 0 が出力されます。
なんで?