Usually a few positions are not enough to check with perft if your movegen/movemake combo is working properly. I've seen several times that everything looks fine with the usual positions like the initial and kiwipete, but the movegen is still broken on others. There are databases freely available on the internet which contain hundreds of positions with perft numbers, I don't have them, but I know they exist.
Perft speed doesn't mean much, perft is so small that it completely runs from the cache, in a full fledged engine you have a totally different situation.
My perft numbers on the initial position at depth 7 are: ~166 mnps with bulk-counting and ~60 mnps without bulk counting, this is with the latest MSVC compiler on a 3.7 Ghz. AMD-TR3 with precision boost disabled.
Code: Select all
{
// initial position
{"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 6, 119060324},
//{"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR b KQkq - 0 1", 6, 119060324},
{"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 7, 3195901860},
//{"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR b KQkq - 0 1", 7, 3195901860},
{"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", 8, 84998978956},
//{"rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR b KQkq - 0 1", 8, 84998978956},
// KiwiPete
{"r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 4, 4085603},
{"r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 5, 193690690},
// SJE
{"rnb1kbnr/ppp1pppp/8/3p4/1P6/P2P3q/2P1PPP1/RNBQKBNR b KQkq - 0 4", 7, 44950307154},
{"rnb1kbnr/pp1pp1pp/1qp2p2/8/Q1P5/N7/PP1PPPPP/1RB1KBNR b Kkq - 2 4", 7, 14794751816},
// old positions
{"1Q5Q/8/3p1p2/2RpkpR1/2PpppP1/2QPQPB1/8/4K3 b - - 0 1", 7, 290063345},
{"1Q5Q/8/3p1p2/2RpkpR1/2PpppP1/2QPQPB1/8/4K3 b - - 0 1", 8, 17665826996},
{"r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 5, 193690690},
{"8/PPP4k/8/8/8/8/4Kppp/8 w - - 0 1", 6, 34336777},
{"8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 1", 7, 178633661},
{"r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 6, 8031647685},
{"r3r1k1/1pq2pp1/2p2n2/1PNn4/2QN2b1/6P1/3RPP2/2R3KB b - - 0 1", 6, 15097513050},
{"8/p1p1p3/8/1P1P2k1/1K2p1p1/8/3P1P1P/8 w - - 0 1", 7, 118590233},
// new positions
{"r3k2r/8/8/8/3pPp2/8/8/R3K1RR b KQkq e3 0 1", 6, 485647607},
{"r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1", 6, 706045033},
{"8/7p/p5pb/4k3/P1pPn3/8/P5PP/1rB2RK1 b - d3 0 28", 6, 38633283},
{"8/3K4/2p5/p2b2r1/5k2/8/8/1q6 b - - 1 67", 7, 493407574},
{"rnbqkb1r/ppppp1pp/7n/4Pp2/8/8/PPPP1PPP/RNBQKBNR w KQkq f6 0 3", 6, 244063299},
{"8/p7/8/1P6/K1k3p1/6P1/7P/8 w - - 0 1", 8, 8103790},
{"n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1", 6, 71179139},
{"r3k2r/p6p/8/B7/1pp1p3/3b4/P6P/R3K2R w KQkq - 0 1", 6, 77054993},
{"8/5p2/8/2k3P1/p3K3/8/1P6/8 b - - 0 1", 8, 64451405},
{"r3k2r/pb3p2/5npp/n2p4/1p1PPB2/6P1/P2N1PBP/R3K2R w KQkq - 0 1", 5, 29179893},
{"r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1", 4, 4085603},
{"rnbqkbnr/ppN5/3ppppp/8/B3P3/8/PPPP1PPP/R1BQK1NR b KQkq - 0 1", 7, 1029536265},
{"k7/8/8/8/8/8/3b1P2/4K3 w - - 0 1", 10, 1555125531},
{"r3k2r/1bp2pP1/5n2/1P1Q4/1pPq4/5N2/1B1P2p1/R3K2R b KQkq c3 0 1", 6, 8419356881},
{"rrrrkr1r/rr1rr3/8/8/8/8/8/6KR w k - 0 1", 7, 1941335854},
// avoid illegal ep (thanks to Steve Maughan):
{"3k4/3p4/8/K1P4r/8/8/8/8 b - - 0 1", 6, 1134888},
{"8/8/8/8/k1p4R/8/3P4/3K4 w - - 0 1", 6, 1134888},
// avoid illegal ep #2
{"8/8/4k3/8/2p5/8/B2P2K1/8 w - - 0 1", 6, 1015133},
{"8/b2p2k1/8/2P5/8/4K3/8/8 b - - 0 1", 6, 1015133},
// en passant capture checks opponent:
{"8/8/1k6/2b5/2pP4/8/5K2/8 b - d3 0 1", 6, 1440467},
{"8/5k2/8/2Pp4/2B5/1K6/8/8 w - d6 0 1", 6, 1440467},
// short castling gives check:
{"5k2/8/8/8/8/8/8/4K2R w K - 0 1", 6, 661072},
{"4k2r/8/8/8/8/8/8/5K2 b k - 0 1", 6, 661072},
// long castling gives check:
{"3k4/8/8/8/8/8/8/R3K3 w Q - 0 1", 6, 803711},
{"r3k3/8/8/8/8/8/8/3K4 b q - 0 1", 6, 803711},
// castling (including losing cr due to rook capture):
{"r3k2r/1b4bq/8/8/8/8/7B/R3K2R w KQkq - 0 1", 4, 1274206},
{"r3k2r/7b/8/8/8/8/1B4BQ/R3K2R b KQkq - 0 1", 4, 1274206},
// castling prevented:
{"r3k2r/8/3Q4/8/8/5q2/8/R3K2R b KQkq - 0 1", 4, 1720476},
{"r3k2r/8/5Q2/8/8/3q4/8/R3K2R w KQkq - 0 1", 4, 1720476},
// promote out of check:
{"2K2r2/4P3/8/8/8/8/8/3k4 w - - 0 1", 6, 3821001},
{"3K4/8/8/8/8/8/4p3/2k2R2 b - - 0 1", 6, 3821001},
// discovered check:
{"8/8/1P2K3/8/2n5/1q6/8/5k2 b - - 0 1", 5, 1004658},
{"5K2/8/1Q6/2N5/8/1p2k3/8/8 w - - 0 1", 5, 1004658},
// promote to give check:
{"4k3/1P6/8/8/8/8/K7/8 w - - 0 1", 6, 217342},
{"8/k7/8/8/8/8/1p6/4K3 b - - 0 1", 6, 217342},
// underpromote to check:
{"8/P1k5/K7/8/8/8/8/8 w - - 0 1", 6, 92683},
{"8/8/8/8/8/k7/p1K5/8 b - - 0 1", 6, 92683},
// self stalemate:
{"K1k5/8/P7/8/8/8/8/8 w - - 0 1", 6, 2217},
{"8/8/8/8/8/p7/8/k1K5 b - - 0 1", 6, 2217},
// stalemate/checkmate:
{"8/k1P5/8/1K6/8/8/8/8 w - - 0 1", 7, 567584},
{"8/8/8/8/1k6/8/K1p5/8 b - - 0 1", 7, 567584},
// double check:
{"8/8/2k5/5q2/5n2/8/5K2/8 b - - 0 1", 4, 23527},
{"8/5k2/8/5N2/5Q2/2K5/8/8 w - - 0 1", 4, 23527},
// capture-to-square
{"3k4/8/8/2Pp3r/2K5/8/8/8 w - d6 0 1", 2, 112},
{"1RR4K/3P4/8/8/8/8/3p4/4rr1k w - - 0 1", 6, 419523239},
{"1RR4K/3P4/8/8/8/8/3p4/4rr1k b - - 1 1", 6, 395340738},
{"1RR5/7K/3P4/8/8/3p4/7k/4rr2 w - - 0 1", 6, 310492012},
{"1RR5/7K/3P4/8/8/3p4/7k/4rr2 b - - 1 1", 6, 302653359},
}