GとSとRのbitが1。(Gのbitは無くてもいいような気がしますが、Gを入れておいたほうが金と同じ近接王手として判定できることがあって多少得だということでしょうか...)のように駒の移動特性ごとに分解され、それらのbit和として表現されています。andをとることでその升に利きがあるかどうかがわかるというわけです。2回で集めてくることが出来ます。0x20);このあとはパッとは思いつかないですが、AVX2の匠の技を持ってすれば、なんとかなるのでしょう。後手の香)でなければならないので、飛車のbit以外をマスクして(andを取って)しまい、残ったものが非0ならそこに飛車の利きの特性を持つ駒があって、対象升に利いているということが言えます。「駒があるところ以降をmaskしてしまい」の部分はパっとは思いつきません。お気づきの方がおられましたら、コメント欄で教えてもらえると嬉しいです。このようにしてある升に利きがあるかないかを調べるのであれば、Bitboardより速そうです。bitboard、あるいはそれをBMI2のpext命令で取ってくるのが主流です。この場合、bitの並び順がbitboardのlayoutに依存してしまいます。大きなテーブルを引く必要がありました。これがByteBoardだと_mm256_shuffle_epi8()によって任意の16升を任意の順番で取ってこれるので、pext命令を使うより使い勝手が良いのです。ByteBoardを用いた指し手生成は何故速いのか?駒は、駒の移動特性ごとに分解されているのでたぶんそのあと、AVX2の命令を駆使すると各升から8近傍のうち移動できる方向が1になっている8bitの値に変換するというようなことも可能なはずで、そうなれば次のようなコードで指し手生成が出来ます。(実際は、桂と飛び駒と成り、打ちなどがありますが、そのへんは考えてみてください。make_move(i,sq_of(i,j));これ自体は、Bitboardから1bitを取り出すときと違い、変な変換が入らない分だけ速いような気がします。内側のループは表引きするようにすれば高速化できそうですし。歩の成る指し手」「王手になる指し手」のような変則的な指し手生成を行なおうとすると一筋縄ではいかなさそうな印象はあります。私の予想としては、それは難しい(簡単に書けない=Bitboardと同じか遅い)ということなんですけど、このへんも、匠の技でなんとかなってしまうのでしょうか。非常に興味深いところです。ByteBoardを用いたSEE(静的交換評価)将棋ソフトにSEEが必要なのかどうかは意見がわかれるところだと思います。評価関数の精度が十分よければ要らないような気もしなくもありませんが、やねうら王やAperyレベルの評価関数ですと、SEEを用いて指し手のオーダリングを行なったほうが若干良いようです。若干なのでSEEを用いないでその分色々高速化できるなら、SEEなしというのも別にいいのではないかと思います。そのへんの議論はさておき、ByteBoardでSEEの実装は私は絶望的だと考えています。SEEでは安い駒で取っていく必要があるのですが、ByteBoardで安い駒を順番に列挙するためにはsortが必要になるからです。その升に利いている駒は平均的には1枚あるかないかぐらいなので、sort自体はそんなに重くないのかも知れませんが、駒の価値順に並べたりしているとAVX2の命令が使えなくなってくるのでByteBoardの利点が生きなくなってきます。SEEでは、その対象升に駒を移動させたと仮定して、その駒を除外して、また対象升に利く駒を列挙していかないといけないのですが(影の利きが対象升に利いているケースがあるため)、そのへんの処理がByteBoardでは非常に難しいというのが私の考えです。SEEでその処理までしたほうがいいのかという議論はあります。このへん私にはよくわかりません。結論ともかく、ByteBoardでSEEの実装は難しいことは間違いなく、たこっとではSEEは実装していないと思います。quiet等)行おうと思うと色々難しい問題が出てくるような気はします。そのへんを匠の技でなんとか回避出来るのかに注目しています。この部分が回避できるなら、いずれ上位のソフトはBitboardからByteBoardに切り替わっていくのではないでしょうか。ByteBoardはそれぐらいのポテンシャルを秘めていると思います。:今更なんですが、_mm256_shuffle_epi8だと、それぞれのレーンの下位16bitのindex分しかとってこれない気がするのですが勘違いか何かなのでしょうか。:_mm256_shuffle_epi8()で、それぞれのレーンの上位16バイトに関して任意の16個を取り、かつ下位16バイトに関しても任意の16個を取ってこれます。最終的に16バイト単位ですべてをor(xorでも可)すると、盤上の任意の(theShuffleで指定した)16升が取ってこれたことになります。:theShuffleは上位と下位に分けて指定しないといけないんですね。この辺の疑似コードを見てたら、どうもそういう理解に至らなかったもので。:SIMD関係の命令は、このサイトがよくまとまっていてお勧めです。http://www.officedaytime.com/tips/simd.html件のshuffleは以下のリンクの下図の動作です。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。