Intelの組み込み関数を使用して、複数の単精度演算を並列に実行するアルゴリズムを作成しました。私のアルゴリズムの各繰り返しの結果は、単一の256ビットベクトル(__m256
)の非ゼロエントリの数です。例えば__mm256ベクトルの非ゼロエントリの数を数える最速の方法は何ですか?
:
反復の結果は、4ベクトル内の数の非ゼロのエントリをカウントするための最速の方法は何である
00000000 FFFFFFFF 00000000 00000000 00000000 FFFFFFFF FFFFFFFF FFFFFFFF
?
float results[8];
_mm256_storeu_ps(results, result_vector);
int count = 0;
for (uint32_t idx = 0; idx < 8; ++idx)
{
if (results[idx] != 0)
{
++count;
}
}
このアプローチはうまく動作しますが、おそらく、店を伴わないもの、それを行うには、より効率的な方法があれば、私は疑問に思う:
は現在、私はこのような何かをやっています。
ゼロ以外のエントリは「0xFFFFFFFF」であることが保証されていますか?もしそうなら、1つのアイデアは、各32ビットセクションの最下位ビットを分離するためにマスクをANDにしてから、絶対差の和を適用することです。 – njuffa
または単にゼロ( '_mm256_cmp_ps')と比較し、ビットマスク(' _mm256_movemask_ps')を抽出し、 'popcnt'を使ってビットを数えますか? 3つの指示。 –
すでに0/0xFFF ...(比較結果)の場合は、 'cmpps'のステップをスキップしてmovemask/popcntだけを実行することができます。 –