2017-10-27 7 views
2

私はAVX(ARM NEONから来たもの)の新人であり、AVXには多くのU8算術が欠けていることに驚いていました。AVX2:U8の絶対的な相違

は、そのため私は、インライン関数でmax(a,b)-min(a,b)に頼らなければならなかった:

static inline __m256i _mm256_abd_epu8(__m256i a, __m256i b) 
{ 
    return _mm256_sub_epi8(_mm256_max_epu8(a, b), _mm256_min_epu8(a, b)); 
} 

この問題に対処するより効率的な方法がある場合、私は好奇心が強いです。

はい、私は_mm256_sad_epu8を認識していますが、私はその合計ではなく、違いが必要です。

私はどんな入力もありがとうと思います。AVX2では正常です。下位互換性は無視してください。

ありがとうございます。

答えて

5

2つ以下の命令でこれを行うには、何のトリックも知られていません。 (そして、この質問のSSE版は、より良いものもありません:Compute the absolute difference between unsigned integers using SSE)。私はこの答えで使用した飽和方法について言及しています。


少し前Skylakeマイクロアーキテクチャ上のよりよい:符号なし飽和との両方の方法、OR結果を引きます。 (各要素に対してゼロのいずれかAB又はBA飽和。)

ハズウエルで_mm256_or_si256(_mm256_subs_epu8(a,b), _mm256_subs_epu8(b,a))

/pmaxpminpsubのみポート1またはポート5上で動作するが、por三のベクトル実行のいずれかで実行することができポート(0,1,5)。

Skylakeには3番目のベクトル整数加算器が追加されているため、そのuarchには違いはありません。 (インテルの最適化マニュアルを含むタグウィキ内http://agner.org/optimize/や他のリンクを参照してください。)

これはわずかに良いVPORはP0123のいずれかの上で実行することができRyzen、上にもあるが、PADD/PMINのみによるP013上で実行することができますAgner Fogのテスト。 (Ryzenは256bベクトル演算を2つのuopに分割しますが、それが有効であるためにはスループットがあり、1-uop命令だけを使って6-uopのワイドパイプを満たすことはできません)

ポートは割り当てられたポートを待つ(リソースの競合)可能性が低いため、実際には2サイクルの合計レイテンシを得る可能性が高くなります(両方の入力から出力が準備完了になる)。また、特定のポート(インテルHaswell以降のシャッフルユニットのみのポート5など)と競合する場合、スループットのボトルネックになる可能性は低くなります。

+0

うわー、私はもっと包括的な答えを想像することすらできません。正確に私が必要としたもの。ありがとうございました。 –

+0

@ Jake'Alquimista'LEE:喜んで、私はあなたがマイクロアーキテクチャのものに感謝すると思ったので、私はそれ以外の場合よりも詳細に入りました。 –

+0

絶対に!!!!今私はパイプラインを深く掘り下げなければならないことを理解しています。あなたが与えたリンクは神です。 –

関連する問題