Hi, let me show my humble bunch of numbers ...
All tests have been done without use of hashing (which I have not implemented in perft), however with hash keys as well as all other unnecessary data structures updated in make/unmake functions (they are the same as in the regular search). Only move evaluation in generator is switched off, therefore there is no call of SEE (what would otherwise slow down the whole thing a lot).
Code: Select all
CPU Type: Intel(R) Core(TM)2 CPU T5500 @ 1.66GHz
CPU Frequency: 1662.5 MHz
1. fastest possible case = not making/unmaking last ply, no check detection in last ply (thanks legal move generator, of course)
Code: Select all
perft(7): SubtreePerft SubtreeInnerNodes
----------------------------------------------------------------------------------
01/14 Ra1-b1 50,081,018 2,291,566 1.02 s 2241.49 kN/s
02/14 Ra1-c1 47,457,788 2,191,590 2.00 s 2238.51 kN/s
03/14 Ra1-d1 33,831,669 1,605,787 2.72 s 2247.99 kN/s
04/14 Rh1-f1 36,304,708 1,651,084 3.45 s 2237.62 kN/s
05/14 Rh1-g1 51,302,720 2,277,740 4.48 s 2215.29 kN/s
06/14 a2-a3 23,941,522 1,284,348 5.04 s 2319.04 kN/s
07/14 a2-a4 26,931,187 1,411,249 5.65 s 2289.24 kN/s
08/14 h2-h3 24,346,577 1,295,833 6.21 s 2322.20 kN/s
09/14 h2-h4 27,793,666 1,432,291 6.84 s 2292.21 kN/s
10/14 Ke1-d1 21,704,666 1,164,297 7.34 s 2334.56 kN/s
11/14 Ke1-d2 52,542,952 2,478,059 8.44 s 2253.03 kN/s
12/14 Ke1-e2 59,615,160 2,776,871 9.68 s 2227.64 kN/s
13/14 Ke1-f1 20,933,844 1,142,686 10.17 s 2335.73 kN/s
14/14 Ke1-f2 51,601,182 2,446,145 11.26 s 2248.66 kN/s
----------------------------------------------------------------------------------
Total: PERFT(7) = 528,388,659 25,449,546 11.26 s 2260.19 kN/s
FOUND: PERFT(7)=528388659
OK!
2. with make/unmake of last ply but still without check detection in leaves
Code: Select all
perft(7): SubtreePerft SubtreeInnerNodes
----------------------------------------------------------------------------------
01/14 Ra1-b1 50,081,018 2,291,566 2.88 s 794.44 kN/s
02/14 Ra1-c1 47,457,788 2,191,590 5.70 s 778.01 kN/s
03/14 Ra1-d1 33,831,669 1,605,787 7.68 s 813.74 kN/s
04/14 Rh1-f1 36,304,708 1,651,084 9.78 s 783.95 kN/s
05/14 Rh1-g1 51,302,720 2,277,740 12.74 s 770.55 kN/s
06/14 a2-a3 23,941,522 1,284,348 14.19 s 885.88 kN/s
07/14 a2-a4 26,931,187 1,411,249 15.81 s 871.99 kN/s
08/14 h2-h3 24,346,577 1,295,833 17.28 s 881.72 kN/s
09/14 h2-h4 27,793,666 1,432,291 18.94 s 863.39 kN/s
10/14 Ke1-d1 21,704,666 1,164,297 20.27 s 870.31 kN/s
11/14 Ke1-d2 52,542,952 2,478,059 23.34 s 807.64 kN/s
12/14 Ke1-e2 59,615,160 2,776,871 26.76 s 811.44 kN/s
13/14 Ke1-f1 20,933,844 1,142,686 28.04 s 894.73 kN/s
14/14 Ke1-f2 51,601,182 2,446,145 31.01 s 823.15 kN/s
----------------------------------------------------------------------------------
Total: PERFT(7) = 528,388,659 25,449,546 31.01 s 820.59 kN/s
3. with make/unmake of last ply and check detection in leaves
Code: Select all
perft(7): SubtreePerft SubtreeInnerNodes
----------------------------------------------------------------------------------
01/14 Ra1-b1 50,081,018 2,291,566 3.38 s 677.50 kN/s
02/14 Ra1-c1 47,457,788 2,191,590 6.67 s 666.26 kN/s
03/14 Ra1-d1 33,831,669 1,605,787 8.99 s 693.44 kN/s
04/14 Rh1-f1 36,304,708 1,651,084 11.45 s 671.22 kN/s
05/14 Rh1-g1 51,302,720 2,277,740 14.89 s 660.96 kN/s
06/14 a2-a3 23,941,522 1,284,348 16.58 s 762.77 kN/s
07/14 a2-a4 26,931,187 1,411,249 18.45 s 754.37 kN/s
08/14 h2-h3 24,346,577 1,295,833 20.15 s 761.95 kN/s
09/14 h2-h4 27,793,666 1,432,291 22.06 s 751.30 kN/s
10/14 Ke1-d1 21,704,666 1,164,297 23.60 s 753.30 kN/s
11/14 Ke1-d2 52,542,952 2,478,059 27.18 s 693.23 kN/s
12/14 Ke1-e2 59,615,160 2,776,871 31.20 s 689.96 kN/s
13/14 Ke1-f1 20,933,844 1,142,686 32.67 s 779.91 kN/s
14/14 Ke1-f2 51,601,182 2,446,145 36.13 s 706.55 kN/s
----------------------------------------------------------------------------------
Total: PERFT(7) = 528,388,659 25,449,546 36.13 s 704.39 kN/s
4. like previous case but also updating attack bitboards in leaves
Code: Select all
perft(7): SubtreePerft SubtreeInnerNodes
----------------------------------------------------------------------------------
01/14 Ra1-b1 50,081,018 2,291,566 14.31 s 160.08 kN/s
02/14 Ra1-c1 47,457,788 2,191,590 28.01 s 160.01 kN/s
03/14 Ra1-d1 33,831,669 1,605,787 37.62 s 167.18 kN/s
04/14 Rh1-f1 36,304,708 1,651,084 47.88 s 160.94 kN/s
05/14 Rh1-g1 51,302,720 2,277,740 62.50 s 155.75 kN/s
06/14 a2-a3 23,941,522 1,284,348 69.42 s 185.66 kN/s
07/14 a2-a4 26,931,187 1,411,249 77.20 s 181.45 kN/s
08/14 h2-h3 24,346,577 1,295,833 84.28 s 182.88 kN/s
09/14 h2-h4 27,793,666 1,432,291 92.29 s 178.80 kN/s
10/14 Ke1-d1 21,704,666 1,164,297 98.58 s 185.14 kN/s
11/14 Ke1-d2 52,542,952 2,478,059 113.71 s 163.78 kN/s
12/14 Ke1-e2 59,615,160 2,776,871 130.90 s 161.61 kN/s
13/14 Ke1-f1 20,933,844 1,142,686 136.99 s 187.51 kN/s
14/14 Ke1-f2 51,601,182 2,446,145 151.90 s 164.10 kN/s
----------------------------------------------------------------------------------
Total: PERFT(7) = 528,388,659 25,449,546 151.90 s 167.55 kN/s
5. previous case with additional move generation in leaves (de facto perft(8), only without counting and calling perft() function in last ply)
Code: Select all
perft(7): SubtreePerft SubtreeInnerNodes
----------------------------------------------------------------------------------
01/14 Ra1-b1 50,081,018 2,291,566 23.32 s 98.25 kN/s
02/14 Ra1-c1 47,457,788 2,191,590 45.65 s 98.17 kN/s
03/14 Ra1-d1 33,831,669 1,605,787 61.53 s 101.13 kN/s
04/14 Rh1-f1 36,304,708 1,651,084 78.25 s 98.73 kN/s
05/14 Rh1-g1 51,302,720 2,277,740 101.98 s 95.97 kN/s
06/14 a2-a3 23,941,522 1,284,348 113.16 s 114.91 kN/s
07/14 a2-a4 26,931,187 1,411,249 125.73 s 112.30 kN/s
08/14 h2-h3 24,346,577 1,295,833 137.10 s 113.96 kN/s
09/14 h2-h4 27,793,666 1,432,291 150.13 s 109.95 kN/s
10/14 Ke1-d1 21,704,666 1,164,297 160.23 s 115.24 kN/s
11/14 Ke1-d2 52,542,952 2,478,059 184.61 s 101.63 kN/s
12/14 Ke1-e2 59,615,160 2,776,871 212.57 s 99.32 kN/s
13/14 Ke1-f1 20,933,844 1,142,686 222.35 s 116.86 kN/s
14/14 Ke1-f2 51,601,182 2,446,145 246.23 s 102.45 kN/s
----------------------------------------------------------------------------------
Total: PERFT(7) = 528,388,659 25,449,546 246.23 s 103.36 kN/s
6. circle is closing: real perft(8) with same conditions as in 1.
Code: Select all
perft(8): SubtreePerft SubtreeInnerNodes
----------------------------------------------------------------------------------
01/14 Ra1-b1 1,062,390,196 52,372,584 23.53 s 2226.17 kN/s
02/14 Ra1-c1 994,961,141 49,649,378 45.89 s 2220.36 kN/s
03/14 Ra1-d1 699,902,214 35,437,456 61.61 s 2254.24 kN/s
04/14 Rh1-f1 749,864,388 37,955,792 78.51 s 2246.09 kN/s
05/14 Rh1-g1 1,078,224,310 53,580,460 102.57 s 2226.71 kN/s
06/14 a2-a3 521,883,593 25,225,870 113.92 s 2223.07 kN/s
07/14 a2-a4 584,490,738 28,342,436 126.63 s 2229.25 kN/s
08/14 h2-h3 530,959,096 25,642,410 138.09 s 2237.70 kN/s
09/14 h2-h4 602,822,744 29,225,957 151.19 s 2231.24 kN/s
10/14 Ke1-d1 471,895,061 22,868,963 161.47 s 2225.16 kN/s
11/14 Ke1-d2 1,138,087,181 55,021,011 186.01 s 2241.76 kN/s
12/14 Ke1-e2 1,299,305,185 62,392,031 214.01 s 2228.49 kN/s
13/14 Ke1-f1 452,781,746 22,076,530 223.81 s 2251.11 kN/s
14/14 Ke1-f2 1,109,817,568 54,047,327 247.82 s 2251.37 kN/s
----------------------------------------------------------------------------------
Total: PERFT(8) = 11,297,385,161 553,838,205 247.82 s 2234.83 kN/s
So, updating of attack bitboards costs me the most, even little bit more than the move generation ...