2017-11-15 5 views
1

Minimax-Algorithm Iコードでは、ビット単位の操作で実験を行い、高速化したいと考えています。各gamestateはUInt128として保存され、4x4タイルベースのボードを記述します。各タイルは0〜32(排他的)の値を持つことができ、1タイルあたり5ビットです。2次元のビット配列からビットを抽出する

+-------+-------+-------+-------+ 
| 0-4 | 5-9 | 10-14 | 15-19 | 
+-------+-------+-------+-------+ 
| 20-24 | 25-29 | 30-34 | 35-39 | 
+-------+-------+-------+-------+ 
| 40-44 | 45-49 | 50-54 | 55-59 | 
+-------+-------+-------+-------+ 
| 60-64 | 65-69 | 70-74 | 75-79 | 
+-------+-------+-------+-------+ 

実際にボード上で操作を実行するには、3x3の中心に基づいて4x4から3x3ブロックを抽出する必要があります。どのように私はそれについて約行くだろうか?ビットシフトを使ってすべてのセルに簡単にアクセスすることで手動で問題なく動作しますが、より高速な方法があるのだろうかと思います。

ありがとうございました!

(問題がある場合は言語がCです)

答えて

1

Bit opsはかなり高速です。ビットシフトを使用して手作業で問題なく作業しているので、4x4のコピーを作成して3x3に減らしてから操作して、パフォーマンスの問題がないかどうか確認してください。

「操作」を実行すると、読み取り専用となります.4x4のビットに直接アクセスするコスト、コピー、シフト、さらには3x3にアクセスする必要がある場合は、余分なコピーが増える可能性があります。

128ビットタイプを使用しているため、バイト[16](または3x3操作ではバイト[9])を使用できます。これにより、個々のセルにアクセスする方が速くなります。

+0

awnserに感謝します。バイトアレイはそれをコピーするときに非常に高価にならないでしょうか? (構造体の中でそれらを使用) –

+0

これは、私が見てほしいと提案したものでした。私の要点は、1つの128ビットアレイを別のものに抽出することよりもコストがかかるため、ビットマスクの読み取り/書き込み(計算位置など)になります。いくつかの構造体(おそらくUInt128は何ですか?)を作成することもできます.16バイトの変数Cell1-16(System.Numerics.Matrix4x4とよく似ています)とCell1-9を持つものがあります。これらは現在ValueType(参照型のバイト配列ではなく)なので、UInt128のようにコピーされます。 – Rob

関連する問題