2017-06-15 2 views
0

私は空間インデックス用のモートン番号を作成していますが、私は__int128番号に変わる8個の符号なし16ビット番号を持っています。効率は非常に重要なので、純粋なソリューション(すべてをループ)または別々の8個の128ビット番号を構築するには高価です。効率的に8 __int16の数字からビットをインターリーブする方法は?

私はGCCを使用していますが、ターゲットマシンは64ビットですが、BMI2はサポートされていません。

どのように計算を高速化できますか?

+0

[This](http://programming.sirrida.de/bit_perm.html#shuffle)は興味深いかもしれません。 –

+0

@MatteoItaliaありがとうございます。はい、私はそれを認識しています。残念ながら、BMI2にはPDEPやPEXT命令がなく、一度に多くのコードを計算したいと考えています。 – Evil

答えて

3

マシンがx86でSSE2をサポートしている場合は、movmsk命令を使用して賢明な答えがあります。フルコード用のGoogle SSE2 bit matrix transpose

+0

はい、それはx86_64です。それは一つの巧妙な考えです。私はしばらく待ってから、もっと速いものが現れなければ受け入れます。私は[このSSE2コード](https://github.com/mischasan/sse2)はあなたのものだと思いますか?ありがとうございました。 – Evil

+0

はい。申し訳ありませんが、私は電話から投稿しており、記事にリダイレクトしています。あなたの狭い「マトリックス」についても、コードは実行可能になります。 – Mischa

関連する問題