忍者ブログ
コンピュータ将棋など…。
[51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

アマゾンからは19日に届いていたけど、本日インストール。
動作環境はAthlon64X2 4600+(2.4GHz)/RAM:2GB/WindowsXP(32bit)。

詰将棋用メモリ設定を1024MBにして図巧100番「寿」から。

実行時間: 26.2秒: 探索節点数: 3491762

んー、意外と時間がかかっている?!
で、最長手数のミクロコスモス。

実行時間: 540.9秒: 探索節点数: 58492046

約9分!!
5849万局面!!

マジッスか?!一桁間違ってないですか?!
手数を見ると1533手までだし、問題の入力ミスはなさそう・・・。

i7 とかでやったら6分切りそうだな・・・。

PR
をした場合、関数は64bit以内の引数4個まではレジスタで渡してくれる。
128bitだと一旦メモリに入れてポインタで渡される。ということは bitboard を XMM レジスタで処理しようとした場合は、関数コールするときは 64bit×2 に分割しないとレジスタ渡しにならなくておいしくないのか…。
この場合は __forceinline にしても一旦メモリに入れられてしまうのか??

実験すればいいんだろうけど、今は気が向かないのでパス。

VS2010でもEEが出て、そいつがx64対応してくれるとありがたいなぁ~。

コメントを受けて64bit環境でも試してみました。
ダウンロード(popcnt64.zip)


ただ、VS2005だと新しいSSE命令はインラインできないようです…。
32bit環境ではMMXを使ってやってみました(popcnt646_cとpopcnt64_d)が、普通に64bit変数を使うほうが速かったです(これはコードが悪い??)。

以下の結果では PhenomIIX4 940 の64bit環境ではpopcnt_a(1)<popcnt_a(2)<popcnt_a(4)<popcnt_b()なので、常にpopcnt_a()を使うのがいいのかなぁ~。

C:\home\popcnt>popcnt64_x64
64 bit環境

32bit演算
popcnt_a:00000000000000000000000000000000: 0: 0.7810 sec
popcnt_b:00000000000000000000000000000000: 0: 1.2340 sec
popcnt_a:00000000000000000000000000000001: 1: 0.6100 sec
popcnt_b:00000000000000000000000000000001: 1: 1.2340 sec
popcnt_a:10000000000000000000000000000000: 1: 0.6090 sec
popcnt_b:10000000000000000000000000000000: 1: 1.1100 sec
popcnt_a:00000000000000000000000000010001: 2: 0.7650 sec
popcnt_b:00000000000000000000000000010001: 2: 1.2500 sec
popcnt_a:00000000000000000001000100010001: 4: 1.1100 sec
popcnt_b:00000000000000000001000100010001: 4: 1.2340 sec
popcnt_a:00010001000100010001000100010001: 8: 1.7970 sec
popcnt_b:00010001000100010001000100010001: 8: 1.2500 sec
popcnt_a:01010101010101010101010101010101:16: 5.2810 sec
popcnt_b:01010101010101010101010101010101:16: 1.2500 sec
popcnt_a:11111111111111111111111111111111:32: 7.9220 sec
popcnt_b:11111111111111111111111111111111:32: 1.5310 sec

ここから64bit
popcnt64_a:0000000000000000000000000000000000000000000000000000000000000000: 0: 0.7660 sec
popcnt64_b:0000000000000000000000000000000000000000000000000000000000000000: 0: 1.5310 sec
popcnt64_a:0000000000000000000000000000000100000000000000000000000000000001: 1: 0.5940 sec
popcnt64_b:0000000000000000000000000000000100000000000000000000000000000001: 1: 1.3750 sec
popcnt64_a:0000000000000000000000000000000100000000000000000000000000000001: 2: 1.2350 sec
popcnt64_b:0000000000000000000000000000000100000000000000000000000000000001: 2: 1.3590 sec
popcnt64_a:0000000000000001000000000000000100000000000000010000000000000001: 4: 1.1870 sec
popcnt64_b:0000000000000001000000000000000100000000000000010000000000000001: 4: 1.3750 sec
popcnt64_a:0000000100000001000000010000000100000001000000010000000100000001: 8: 1.8750 sec
popcnt64_b:0000000100000001000000010000000100000001000000010000000100000001: 8: 1.3750 sec
popcnt64_a:0001000100010001000100010001000100010001000100010001000100010001:16: 5.1250 sec
popcnt64_b:0001000100010001000100010001000100010001000100010001000100010001:16: 1.3590 sec
popcnt64_a:0101010101010101010101010101010101010101010101010101010101010101:32: 7.9380 sec
popcnt64_b:0101010101010101010101010101010101010101010101010101010101010101:32: 1.3750 sec
popcnt64_a:1111111111111111111111111111111111111111111111111111111111111111:64:13.3750 sec
popcnt64_b:1111111111111111111111111111111111111111111111111111111111111111:64: 1.8750 sec

C:\home\popcnt>popcnt64_x86
32 bit環境

32bit演算
popcnt_a:00000000000000000000000000000000: 0: 1.7810 sec
popcnt_b:00000000000000000000000000000000: 0: 1.3750 sec
popcnt_a:00000000000000000000000000000001: 1: 0.7650 sec
popcnt_b:00000000000000000000000000000001: 1: 1.3590 sec
popcnt_a:10000000000000000000000000000000: 1: 0.7820 sec
popcnt_b:10000000000000000000000000000000: 1: 1.3590 sec
popcnt_a:00000000000000000000000000010001: 2: 4.5470 sec
popcnt_b:00000000000000000000000000010001: 2: 1.3590 sec
popcnt_a:00000000000000000001000100010001: 4: 5.0470 sec
popcnt_b:00000000000000000001000100010001: 4: 1.3600 sec
popcnt_a:00010001000100010001000100010001: 8: 6.2180 sec
popcnt_b:00010001000100010001000100010001: 8: 1.3600 sec
popcnt_a:01010101010101010101010101010101:16: 7.8430 sec
popcnt_b:01010101010101010101010101010101:16: 1.3750 sec
popcnt_a:11111111111111111111111111111111:32:10.5630 sec
popcnt_b:11111111111111111111111111111111:32: 1.3590 sec

ここから64bit
popcnt64_a:0000000000000000000000000000000000000000000000000000000000000000: 0: 0.6870 sec
popcnt64_b:0000000000000000000000000000000000000000000000000000000000000000: 0: 3.5790 sec
popcnt64_c:0000000000000000000000000000000000000000000000000000000000000000: 0: 6.1410 sec
popcnt64_d:0000000000000000000000000000000000000000000000000000000000000000: 0: 4.8120 sec
popcnt64_a:0000000000000000000000000000000000000000000000000000000000000001: 1: 0.9850 sec
popcnt64_b:0000000000000000000000000000000000000000000000000000000000000001: 1: 3.5780 sec
popcnt64_c:0000000000000000000000000000000000000000000000000000000000000001: 1: 6.1400 sec
popcnt64_d:0000000000000000000000000000000000000000000000000000000000000001: 1: 4.8130 sec
popcnt64_a:0000000000000000000000000000000100000000000000000000000000000001: 2: 1.2970 sec
popcnt64_b:0000000000000000000000000000000100000000000000000000000000000001: 2: 3.5780 sec
popcnt64_c:0000000000000000000000000000000100000000000000000000000000000001: 2: 6.1410 sec
popcnt64_d:0000000000000000000000000000000100000000000000000000000000000001: 2: 4.8120 sec
popcnt64_a:0000000000000001000000000000000100000000000000010000000000000001: 4: 2.2190 sec
popcnt64_b:0000000000000001000000000000000100000000000000010000000000000001: 4: 3.5790 sec
popcnt64_c:0000000000000001000000000000000100000000000000010000000000000001: 4: 6.1400 sec
popcnt64_d:0000000000000001000000000000000100000000000000010000000000000001: 4: 4.8130 sec
popcnt64_a:0000000100000001000000010000000100000001000000010000000100000001: 8: 3.9220 sec
popcnt64_b:0000000100000001000000010000000100000001000000010000000100000001: 8: 3.5780 sec
popcnt64_c:0000000100000001000000010000000100000001000000010000000100000001: 8: 6.1400 sec
popcnt64_d:0000000100000001000000010000000100000001000000010000000100000001: 8: 4.8130 sec
popcnt64_a:0001000100010001000100010001000100010001000100010001000100010001:16: 8.9380 sec
popcnt64_b:0001000100010001000100010001000100010001000100010001000100010001:16: 3.5780 sec
popcnt64_c:0001000100010001000100010001000100010001000100010001000100010001:16: 6.1250 sec
popcnt64_d:0001000100010001000100010001000100010001000100010001000100010001:16: 4.8130 sec
popcnt64_a:0101010101010101010101010101010101010101010101010101010101010101:32:15.5470 sec
popcnt64_b:0101010101010101010101010101010101010101010101010101010101010101:32: 3.5780 sec
popcnt64_c:0101010101010101010101010101010101010101010101010101010101010101:32: 6.1400 sec
popcnt64_d:0101010101010101010101010101010101010101010101010101010101010101:32: 4.8130 sec
popcnt64_a:1111111111111111111111111111111111111111111111111111111111111111:64:29.1410 sec
popcnt64_b:1111111111111111111111111111111111111111111111111111111111111111:64: 3.5930 sec
popcnt64_c:1111111111111111111111111111111111111111111111111111111111111111:64: 6.1410 sec
popcnt64_d:1111111111111111111111111111111111111111111111111111111111111111:64: 4.8120 sec
 

セットされているbitを数える関数を作ってみました。
ダウンロード(popcnt.zip)


popcnt_a はループによる数え上げ、popcnt_bはbitシフトと論理積(AND)と加算による数え上げ。
Athlon64X2 4600+ではpopcnt_bは一定の時間で終了するんだけど、セットされているbitの数だけループを回るpopcnt_aは思わぬ結果が?!

popcnt_aではセットされたbitの数が 1 が最速で以下、0、2、・・・と続きました。
Core2Duoでは確か 0 が一番でしたけど…??

以下の結果では Athlon64X2 ではpopcnt_a(1)<popcnt_b()<popcnt_a(0)<popcnt_a(2)<・・・<popcnt_a(32)なので、
常にpopcnt_b()を使うのがいいのかなぁ~。

結果:
popcnt_a:00000000000000000000000000000000: 2.3590 sec
popcnt_b:00000000000000000000000000000000: 1.9370 sec
popcnt_a:00000000000000000000000000000001: 0.7970 sec
popcnt_b:00000000000000000000000000000001: 1.9370 sec
popcnt_a:00000000000000000000000000010001: 5.9070 sec
popcnt_b:00000000000000000000000000010001: 1.9370 sec
popcnt_a:00000000000000000001000100010001: 6.5470 sec
popcnt_b:00000000000000000001000100010001: 1.9380 sec
popcnt_a:00010001000100010001000100010001: 7.8280 sec
popcnt_b:00010001000100010001000100010001: 1.9380 sec
popcnt_a:01010101010101010101010101010101: 9.9840 sec
popcnt_b:01010101010101010101010101010101: 1.9380 sec
popcnt_a:11111111111111111111111111111111:13.5150 sec
popcnt_b:11111111111111111111111111111111: 1.9380 sec

8月29日の日記で「悩むなぁ~」とかいいながら、予算の捻出が出来たのでアマゾンでポチッとしてしまいました! もちろん(?)らき☆すたカードでwww
(といっても証券会社に少しだけ預けてあったお金を銀行に移しただけですが…)

無双の詰将棋の画面イメージでは実行時間が0.1秒単位、探索節点数も表示されるようでいい目標になるかも?!(高すぎる目標かも…)

気が向いたら&&いろいろ行き詰ってきたら、勝手にfloodgateに参戦させてしまうかもwww



忍者ブログ [PR]
カレンダー
03 2025/04 05
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
フリーエリア
なのはの応援をしていただき、かつ協力いただける方は、アマゾンでの買い物は下のリンクからお願いします
最新CM
[04/27 とおりすがり]
[10/21 おてだま]
[10/20 おてだま]
[01/24 なのはminiふぁん]
[01/08 sakura]
最新TB
プロフィール
HN:
かず
性別:
非公開
バーコード
ブログ内検索
最古記事
カウンター
アクセス解析