I think you are complicating things too much. I just use unrelated middlegame positions, all to the same depth so that the search time is of the order of minutes per position, many of them, say 150, simply add the times, getting the rough speedup. It probably is some 3-5% off of what I would get being more careful, but with the parallel speedup the things get so CPU and time consuming with so little improvement in measurement, that I prefer to keep it simple.bob wrote:There are at least two pathological positions in this test set. Caused by something "deep" that gets exposed during the parallel part of the search where a super-linear speedup is quite common. I think my next order of business is going to be to put together a group of non-related positions that exhibit a little bit of everything. IE rock-solid lock on to best move at depth =1 and never changes, some positions where several moves are close and the search keeps bouncing, some with lots of tactics that confuse move ordering, some with deep/narrow trees (i.e. endgames). Etc...Laskos wrote:Geomean of 4 runs of 24 (where each run uses geomean too) should be equal to geomean of all 96 one by one. And there I think is little difference between whether you do 4 runs of the same 24 positions or 96 different positions. May be some difference is there if you have a "pathological" position which behaves badly each run (which average speedup even after 100 runs would be far away from other positions), making 4 runs with the same "pathological" position an unwelcomed amplified noise.bob wrote:
That was sort of my thinking when I asked the question. But to clarify, if I do four runs, is collapsing each run to a geomean speedup and then averaging better than geomean of all 96 results (repeat 4 times, 24 positions, but compute geomean of all 96 individual speedups)?
I always have a suspicion about averages of averages. This would avoid that to some extent. Or would it be even better to just have 96 different positions? I suppose I could burn some CPU time to see what the answers look like to see which appears most reasonable..
New SMP stuff (particularly Kai)
Moderators: hgm, Rebel, chrisw
-
- Posts: 10948
- Joined: Wed Jul 26, 2006 10:21 pm
- Full name: Kai Laskos
Re: New SMP stuff (particularly Kai)
-
- Posts: 6442
- Joined: Tue Jan 09, 2007 12:31 am
- Location: PA USA
- Full name: Louis Zulli
Re: New SMP stuff (particularly Kai)
Is there a particular set of midgame positions that you prefer? If so, perhaps you could post the positions?Laskos wrote: I think you are complicating things too much. I just use unrelated middlegame positions, all to the same depth so that the search time is of the order of minutes per position, many of them, say 150, simply add the times, getting the rough speedup. It probably is some 3-5% off of what I would get being more careful, but with the parallel speedup the things get so CPU and time consuming with so little improvement in measurement, that I prefer to keep it simple.
-
- Posts: 20943
- Joined: Mon Feb 27, 2006 7:30 pm
- Location: Birmingham, AL
Re: New SMP stuff (particularly Kai)
The reason I am interested is I would like to see a "standard method" for measuring speedup. Everybody quotes numbers, but they are usually not close to each other, primarily because the testing methodology is different (different test sets, different time limits, different hash sizes, different almost everything.Laskos wrote:I think you are complicating things too much. I just use unrelated middlegame positions, all to the same depth so that the search time is of the order of minutes per position, many of them, say 150, simply add the times, getting the rough speedup. It probably is some 3-5% off of what I would get being more careful, but with the parallel speedup the things get so CPU and time consuming with so little improvement in measurement, that I prefer to keep it simple.bob wrote:There are at least two pathological positions in this test set. Caused by something "deep" that gets exposed during the parallel part of the search where a super-linear speedup is quite common. I think my next order of business is going to be to put together a group of non-related positions that exhibit a little bit of everything. IE rock-solid lock on to best move at depth =1 and never changes, some positions where several moves are close and the search keeps bouncing, some with lots of tactics that confuse move ordering, some with deep/narrow trees (i.e. endgames). Etc...Laskos wrote:Geomean of 4 runs of 24 (where each run uses geomean too) should be equal to geomean of all 96 one by one. And there I think is little difference between whether you do 4 runs of the same 24 positions or 96 different positions. May be some difference is there if you have a "pathological" position which behaves badly each run (which average speedup even after 100 runs would be far away from other positions), making 4 runs with the same "pathological" position an unwelcomed amplified noise.bob wrote:
That was sort of my thinking when I asked the question. But to clarify, if I do four runs, is collapsing each run to a geomean speedup and then averaging better than geomean of all 96 results (repeat 4 times, 24 positions, but compute geomean of all 96 individual speedups)?
I always have a suspicion about averages of averages. This would avoid that to some extent. Or would it be even better to just have 96 different positions? I suppose I could burn some CPU time to see what the answers look like to see which appears most reasonable..
It would be useful to have a reasonable set of positions that one could use to compare with others. I'd like to see it take a sensible amount of time compared to what I have been doing of late, since the more cores you use, the greater the difference between 1 and N,
The test positions are pretty important. Tactical positions are not very good, since they are often based on a "surprise" that breaks move ordering and invites super-linear behavior on the specific iteration where the move surfaces.
The positions I use were chosen because I was asked a specific question about smp speedup with Cray Blitz in a real game, not on random positions. However, with today's depths, hashing makes that beyond problematic if you pass the hash from one position to another. And not passing that info is also a distortion since real games are a continuous overlapping search problem from the first move to the end.
However, having said all of that, I've become convinced that a representative set of independent positions is likely the best way, from a repeatability point of view. Gets rid of hashing efficiency and the replacement policy that can have a significant effect on things as well.
I'm sort of leaning toward using xboard so that I can play some games (maybe 40 moves in 2 hours) between several good opponents, and saving the PGN, then going through the PGN to extract positions based on log file analysis. Only question is, how many positions? 24 is a bit "thin" but then again, going to >100 makes the test a bit long.
-
- Posts: 10948
- Joined: Wed Jul 26, 2006 10:21 pm
- Full name: Kai Laskos
Re: New SMP stuff (particularly Kai)
I don't have the access to them now, but I can give 150 fairly quiet late opening positions which have not very dissimilar time-to-depth times and behavior. My recipe is: run the first 15 positions in multicore mode to the same fixed depth such as they are searched in a total time of 4-8 minutes, That's the minimum time (say on average 30s per position) to get multicore mode kicking in. Then run all 150 in multicore mode, that would take about an hour. Compute the total time. Then run to the same depth on single core, that would take several hours, depending on the number of cores in the first run. Compute again the total time. Divide the total times to get the effective speedup if there is no widening or narrowing. The error should be no larger than 3-5%.zullil wrote:Is there a particular set of midgame positions that you prefer? If so, perhaps you could post the positions?Laskos wrote: I think you are complicating things too much. I just use unrelated middlegame positions, all to the same depth so that the search time is of the order of minutes per position, many of them, say 150, simply add the times, getting the rough speedup. It probably is some 3-5% off of what I would get being more careful, but with the parallel speedup the things get so CPU and time consuming with so little improvement in measurement, that I prefer to keep it simple.
EPD:
Code: Select all
r1bn1rk1/ppp1qppp/3pp3/3P4/2P1n3/2B2NP1/PP2PPBP/2RQK2R w K -
r2q1rk1/1bppbppp/p4n2/n2Np3/Pp2P3/1B1P1N2/1PP2PPP/R1BQ1RK1 w - -
rnb2rk1/1pq1bppp/p3pn2/3p4/3NPP2/2N1B3/PPP1B1PP/R3QRK1 w - -
2rq1rk1/p3bppp/bpn1pn2/2pp4/3P4/1P2PNP1/PBPN1PBP/R2QR1K1 w - -
rn3rk1/1p2ppbp/1pp3p1/3n4/3P1Bb1/2N1PN2/PP3PPP/2R1KB1R w K -
r1bq1rk1/3nbppp/p1p1pn2/1p4B1/3P4/2NBPN2/PP3PPP/2RQK2R w K -
r3kbnr/1bpq2pp/p2p1p2/1p2p3/3PP2N/1PN5/1PP2PPP/R1BQ1RK1 w kq -
r1b1k2r/pp1nqp1p/2p3p1/3p3n/3P4/2NBP3/PPQ2PPP/2KR2NR w kq -
r2q1rk1/1b2ppbp/ppnp1np1/2p5/P3P3/2PP1NP1/1P1N1PBP/R1BQR1K1 w - -
r2q1rk1/pp2ppbp/2n1bnp1/3p4/4PPP1/1NN1B3/PPP1B2P/R2QK2R w KQ -
rn1qk2r/1b2bppp/p3pn2/2p5/Pp1P4/1B2PN2/1P1NQPPP/R1B2RK1 w kq -
r1bq1rk1/pp3pbp/2p2np1/2n1N3/2P1P3/2N5/PP2BPPP/R1BQR1K1 w - -
r1b2rk1/1pqnbppp/p2p1n2/4p3/P3P3/1NN1B3/1PP1BPPP/R2Q1RK1 w - -
r2q1rk1/pbn1ppbp/1p1p1np1/2pP4/P3PB2/2N2N2/1PPQBPPP/R4RK1 w - -
r2q1rk1/pp3ppp/2n2n2/2bp4/6b1/1PNBPN2/P4PPP/R1BQ1RK1 w - -
r1bq1rk1/1p1p1ppp/p3pn2/8/1bP5/2N3P1/PPQNPPBP/R3K2R w KQ -
r1bqkb1r/1p3p2/p1nppp2/7p/3NPP2/2N5/PPPQ2PP/2KR1B1R w kq -
r1bqr1k1/ppp2pp1/2np1n1p/8/2P1p3/2P1N1P1/PP2PPBP/R1BQ1RK1 w - -
r2qk2r/1p2ppbp/p1np1np1/2p5/4P3/2PP1b1P/PP1N1PP1/R1BQRBK1 w kq -
r1bqk2r/pp2nppp/4p3/2P1P3/1b1p4/2NB1N2/2P2PPP/R1BQK2R w KQkq -
r1bq1rk1/pp1pppbp/2n3p1/1n2P3/3P4/2N2N2/PP3PPP/R1BQR1K1 w - -
r2qr1k1/ppp2ppp/2n5/3npb2/8/2BPPN2/PPQ1BPPP/R3K2R w KQ -
r3kb1r/1bqn1ppp/p2ppn2/1p4B1/3NPP2/2NB1Q2/PPP3PP/2KR3R w kq -
r1b1k2r/pppnq1p1/4p2p/5p2/2PPp3/4P3/PP1N1PPP/R2QKB1R w KQkq -
1r1qkb1r/3b1ppp/p1nppn2/1p4B1/4P3/P1N2N2/1PPQ1PPP/2KR1B1R w k -
r2q1rk1/1p1nbppp/p2pbn2/4p3/4P3/1NN1BP2/PPP1B1PP/R2Q1RK1 w - -
r1b1k2r/1pqp1p1p/p1n1pp2/8/2PNP3/2b5/PP2BPPP/R2Q1RK1 w kq -
r1bq1rk1/pp3ppp/2nbpn2/8/2B5/P1N1PN2/1P3PPP/R1BQ1RK1 w - -
r2qkb1r/1p1b1pp1/p1np1n1p/4p3/4PB2/1NN5/PPPQ1PPP/2KR1B1R w kq -
r1bqk2r/ppp2p2/2n1p1pp/3pP3/3P2Q1/P1nBB3/2P2PPP/R3K1NR w KQkq -
r2q1rk1/1p1bbppp/p1nppn2/8/3NPP2/1BN1B3/PPP3PP/R2Q1RK1 w - -
r2qk2r/ppp2pp1/3bpnbp/3pB3/8/1P1PP2P/P1PNBPP1/R2QK2R w KQkq -
r1b2rk1/ppp1qppp/3pnn2/1B2p1B1/3PP3/2P2N2/P1P2PPP/R2QR1K1 w - -
r2q1rk1/1bp1bpp1/p1np1n1p/1p2p3/3PP3/1BP2N1P/PP3PP1/RNBQR1K1 w - -
rn1q1rk1/p2pbppp/1p2pn2/8/Q1PN4/2N3P1/PP2PPKP/R1B2R2 w - -
rn1qk2r/2p1bppp/1p1pp3/p7/2PP1B2/P2QPN2/1P3PPP/R3K2R w KQkq -
rn1qr1k1/pp4bp/2ppbnp1/5p2/2P5/2NQ1NP1/PP2PPBP/R1B2RK1 w - -
r2q1rk1/1p1bbppp/p1nppn2/8/2PNPP2/2NBB3/PP4PP/R2Q1RK1 w - -
r1b1k2r/pp2bppp/1qn1p3/3pPn2/3P4/5N2/PPN1BPPP/R1BQ1K1R w kq -
r2qk2r/1b2bppp/ppnppn2/8/2PQ4/BPN2NP1/P3PPBP/R4RK1 w kq -
r3k2r/p1ppqpbp/b1p5/3nP1p1/2P5/1P4P1/P3QP1P/RNB1KB1R w KQkq -
r1bq1rk1/1p2ppbp/p2p1np1/2n5/4PP2/2NB1N2/PPP3PP/R1B1QRK1 w - -
rnb2rk1/pp3ppp/8/2bp4/5B2/4PN2/PP3PPP/R3KB1R w KQ -
rn2k2r/1b3ppp/p3pn2/1pb5/8/4PN2/PP2BPPP/R1BN1RK1 w kq -
r2qkb1r/pb1n1ppp/4pn2/2p5/Np1P4/3BPN2/PP3PPP/R1BQ1RK1 w kq -
r1b1k2r/ppppnppp/6q1/8/3PP3/8/PP1NQPPP/R3KB1R w KQkq -
r1bq1rk1/pp1nppb1/2p3p1/3n3p/2BP2N1/2P5/PP3PPP/RNBQR1K1 w - -
rnb2rk1/pp1npp1p/3P2p1/8/2P1PP2/2qB1N2/P5PP/R1BQK2R w KQ -
r2qkb1r/1b1n1pp1/p2ppn1p/1p4B1/3NP3/1BN5/PPP2PPP/R2QR1K1 w kq -
r1bq1rk1/p2nbppp/2p1pn2/8/1p1PN3/3BPN2/PP3PPP/R1BQ1RK1 w - -
rnbqkb1r/ppp1pp2/3p4/6pp/3P3P/2N1P1n1/PPPN1PP1/R2QKB1R w KQkq -
r2qkb1r/1p1n1pp1/p2p1n2/3bp2p/4P3/1N2BP2/PPPQ2PP/R3KB1R w KQkq -
r2qk2r/1p1n1ppp/2p1pn2/p2p4/2PP4/P1bQPN2/1P1B1PPP/R4RK1 w kq -
r2q1rk1/pppnppbp/1n4p1/2Q5/3PP1b1/2N1BN2/PP3PPP/2KR1B1R w - -
r1bqk2r/4bppp/p1pp1n2/1p2p3/4P3/1nNP1N2/PPPB1PPP/R3QRK1 w kq -
r2q1rk1/1p1nbppp/p2ppn2/8/3NP3/1P6/PBP1QPPP/RN3RK1 w - -
r3kbnr/pp3ppp/2n5/q2p3b/8/2N2N1P/PP2BPP1/R1BQK2R w KQkq -
r2q1rk1/1p1bbppp/p1nppn2/8/3NP3/2N1B1P1/PPP1QPBP/R4RK1 w - -
r2qk2r/ppp2ppp/3b1n2/4n2b/2B1P3/2N2N1P/PP3PP1/R1BQ1RK1 w kq -
r1bq1rk1/1p1n1ppp/p3pn2/b1p5/2pP4/P1NBPN2/1P2QPPP/R1BR2K1 w - -
1r2kb1r/1pqb1ppp/p1nppn2/6B1/3NP3/2N2P2/PPPQ2PP/1K1R1B1R w k -
r1b2rk1/1pq1bppp/p1nppn2/8/P2NPP2/2N2B2/1PP3PP/R1BQ1RK1 w - -
r3k2r/pp1q1ppp/2n1p3/2bn4/2p5/N5P1/PP2PPBP/R1BQ1RK1 w kq -
r2q1rk1/pb1p1pbp/1pn1p1p1/2p2n2/2P5/1PNP1NP1/PB1QPPBP/R4RK1 w - -
r1b2rk1/1pqnbppp/p2p1n2/4p3/4P3/1NNQB3/PPP1BPPP/R4RK1 w - -
rnb1k2r/1p3ppp/p3pn2/qN4B1/2B1P3/2P5/P4PPP/R2QK2R w KQkq -
r2q1rk1/pp2ppbp/3pbnp1/8/2P4Q/2N3P1/PP2PPBP/R1B2RK1 w - -
rnb1kb1r/pp3ppp/4p3/q2pP3/3B1P2/2P5/PP4PP/R2QKBNR w KQkq -
r2q1rk1/1pp2pbp/2n3p1/p2npb2/2N5/2PP1NP1/PP3PBP/R1BQ1RK1 w - -
r2qkb1r/5ppp/p1npbn2/1p2p3/2N1P3/2N1B3/PPP2PPP/R2QKB1R w KQkq -
rn3rk1/pb2qppp/1p2pn2/2pp4/1bPP4/1P3NP1/PB2PPBP/RN1Q1RK1 w - -
r2q1rk1/1ppnbppp/p1b1pn2/8/P1QP1B2/5NP1/1P2PPBP/RN3RK1 w - -
r1b1kb1r/pp3ppp/1nnqp3/8/8/1BN2N2/PP3PPP/R1BQ1RK1 w kq -
rnb1k2r/pp1p1ppp/4p3/q7/2P1Q3/1N4P1/PP1bPP1P/R3KB1R w KQkq -
rnbqk2r/4bpp1/p3pn1p/1p1p4/3NP1PP/2N1BP2/PPPQ4/R3KB1R w KQkq -
r2q1rk1/1p1nbppp/p2pbn2/4p3/4P3/1NNQB3/PPP1BPPP/R4RK1 w - -
r2qkb1r/1p3ppp/p1nppnb1/8/2BNP1P1/2N4P/PPP2P2/R1BQR1K1 w kq -
r1b2rk1/ppp1qpbn/2np2pp/4p3/2BPP3/2P2N1P/PP1N1PP1/R1BQR1K1 w - -
r1bqk2r/2p1bppp/p4n2/2p1p3/8/3Q1N2/PPP2PPP/RNB2RK1 w kq -
r2nkb1r/pp1bpppp/8/4P3/8/2P2N2/P4PPP/R1B1KB1R w KQkq -
rnbq1rk1/4bppp/p3pn2/1p4B1/2BP4/2N2N2/PP2QPPP/R4RK1 w - -
r1bqr1k1/pp3ppp/2pb1n2/3pn3/2P5/1P3NP1/P1QNPPBP/R1B2RK1 w - -
r1bq1rk1/3nbppp/p2p1n2/1p2p3/4P3/1NN3P1/PPPB1PBP/R2Q1RK1 w - -
r1b1kb1r/1pq3pp/p2ppp2/2n3B1/4P3/2N2N2/PPP2PPP/R2QR1K1 w kq -
r1bq1rk1/p3ppbp/2p2np1/3p4/4P3/2N1BP2/PPPQ2PP/2KR1B1R w - -
r1b1k2r/pp3ppp/2n1p3/q7/1bBPP3/5N2/P2B1PPP/R2QK2R w KQkq -
rnbqr1k1/pp1p1ppp/5n2/2bP4/8/P1N3P1/1P2NP1P/R1BQKB1R w KQ -
rnb2rk1/ppn2ppp/4p3/q1P5/4P3/P1P1BP2/6PP/R2QKBNR w KQ -
r2qk2r/1b1n1ppp/p2bpn2/1pp5/3P4/1BN1PN2/PP2QPPP/R1BR2K1 w kq -
r3kb1r/ppqn1p1p/2p1pp2/5b2/2BP4/5N2/PPPBQPPP/R3K2R w KQkq -
r1bq1rk1/pp3pbp/4pnp1/3pn3/3P1B2/2N3P1/PP2PPBP/R2Q1RK1 w - -
r4rk1/pp1nppbp/2pq1np1/3p4/2PP4/2NBPQ1P/PP3PP1/R1BR2K1 w - -
r1bqrnk1/pp2bppp/2p2n2/3p2B1/3P4/2NBP2P/PPQ1NPP1/R3K2R w KQ -
r1b1k2r/1pqnbppp/p2ppn2/6B1/4PP2/1NN2Q2/PPP1B1PP/R3K2R w KQkq -
r1bqr1k1/p1p2pbp/2pp1np1/8/4P3/2P5/PP1NBPPP/R1BQ1RK1 w - -
r1bqk2r/p3bppp/2p1pn2/8/1p1P4/3BPN2/PP3PPP/R1BQK2R w KQkq -
rnbr2k1/pp3pbp/2p3p1/3Pp3/4P3/4BP2/PP4PP/R3KBNR w KQ -
r2q1rk1/pbpn1pp1/1p1ppn1p/8/2PP3B/P1Q2P1N/1P2P1PP/R3KB1R w KQ -
2rq1rk1/pb1pppbp/1pn2np1/8/2PNP3/2N1BP2/PP2B1PP/R2Q1RK1 w - -
rnbqk2r/pp3p2/4p1pp/2ppP3/3P2Q1/2nB4/P1P2PPP/R1B1K1NR w KQkq -
r1bqnrk1/1p1nbppp/p1p5/2PpP1B1/8/2N1PN2/PPQ2PPP/2R1KB1R w K -
r2qkb1r/pp1nn3/2p1pp2/5bBp/2BP3P/2N5/PP2NPP1/R2QK2R w KQkq -
r2q1rk1/pbpnbppp/1p1pp3/8/2PP4/2Q2NP1/PP2PPBP/R1BR2K1 w - -
r2q1rk1/pp1bppbp/3p1np1/n2P4/8/2N3P1/PP1NPPBP/R1BQ1RK1 w - -
r3kb1r/pp2nppp/2n1p3/q3Pb2/Q1pN4/N3B3/PP2BPPP/R3K2R w KQkq -
r1bk1b1r/pp3ppp/2n1pn2/1N6/8/2p2N2/PP2BPPP/R1B2RK1 w - -
r3kb1r/1p3p1p/npp2p2/3p1b2/3P4/2N1PN2/PP3PPP/R3KB1R w KQkq -
r1bq1rk1/pp2ppbp/6p1/n1p5/2BPP3/2P1B3/P3NPPP/1R1QK2R w K -
r2q1rk1/pp1nbppb/2p1pn1p/3pN3/4P3/1P1P2P1/PBPN1PBP/R2Q1RK1 w - -
r1bq1rk1/ppp1pp1p/1n4p1/3Pb3/4P3/6P1/PP3PBP/RNBQ1RK1 w - -
rn1q1rk1/2p1bppp/p1b1pn2/1p6/P1QP4/2N2NP1/1P2PPBP/R1B2RK1 w - -
r2qk2r/p2p1pp1/1pn1pn1p/8/1bPP3B/2NB1Q2/PP3PPP/R3K2R w KQkq -
r2q1rk1/pp2bppp/5n2/2np4/8/1N3N2/PPP2PPP/R1BQ1RK1 w - -
r1b2rk1/pppn1pbp/5np1/4p1B1/2P1P3/2N2N2/PP2BPPP/2KR3R w - -
r2qkb1r/pp3ppp/2n2n2/4p3/2Pp4/4PbPP/PP3PB1/RNBQ1RK1 w kq -
rn1qk2r/pbpp1p2/1p2p2p/6p1/2PP4/2P1PNn1/P1Q2PPP/R3KB1R w KQkq -
rnb1k2r/5ppp/p4n2/1pp5/1b1NP3/2N2P2/PP2B1PP/R1B1K2R w KQkq -
r1bq1rk1/pp2bpp1/2np1n1p/4p3/3NPP1B/2N5/PPPQ2PP/2KR1B1R w - -
r3kb1r/ppq2ppp/2n1pnb1/3p4/3P3N/1QN1PP2/PP1B2PP/R3KB1R w KQkq -
r1b2rk1/ppq1bppp/2nppn2/8/2B1PP2/1NN1B3/PPP3PP/R2Q1RK1 w - -
r1bq1k1r/p1n1ppbp/1pp2Np1/2p1P3/8/5N2/PPPP1PPP/R1BQR1K1 w - -
rn1r2k1/pp1bqppp/2p1pn2/3p4/2PP4/4QNP1/PP2PPBP/RNR3K1 w - -
r2k3r/pbpnbppp/1p2p3/1N1n2B1/3P4/P4N2/1P2PPPP/R3KB1R w KQ -
r2q1rk1/pb3ppp/np2pn2/b1pp4/2PP4/P1NBP1N1/1P1B1PPP/1R1QK2R w K -
r1b1qrk1/1ppn1pbp/n2p2p1/p2Pp1B1/2P1P3/2N4P/PP1NBPP1/R2QK2R w KQ -
r1bq1rk1/pp4bp/n1pp1pp1/3Pp3/2P1P1nB/2N2N2/PP2BPPP/R2QK2R w KQ -
r1bq1rk1/pp3ppp/4pn2/2n5/2B5/2P1PN2/P4PPP/R1BQ1RK1 w - -
r3kbnr/pp3ppp/2pp4/1B2P1q1/4P1b1/2Pp4/PP4PP/RNBQ1RK1 w kq -
r2q1rk1/1ppbbppp/p1np4/4p3/B2PP2n/2P2N2/PP3PPP/R1BQRNK1 w - -
r1bqkb1r/p2n1p1p/4pp2/2p5/1p1P4/3BPN2/PP3PPP/R1BQK2R w KQkq -
r2qkb1r/1b1n1ppp/p3pn2/1p6/P1pP4/4PN2/1PB1QPPP/RNB2RK1 w kq -
r1b1k2r/pp1p1ppp/1q3n2/4p3/2Pb4/2N3P1/PP3PBP/R1BQ1RK1 w kq -
rnb2rk1/1pq1bppp/2p5/p3p3/4P1n1/2N3P1/PPPBNPBP/R2Q1RK1 w - -
r2qk2r/1bp2pp1/pbnp1n1p/1p2p3/3PP3/1BP1BN2/PP3PPP/RN1QR1K1 w kq -
rnbq1rk1/pp1p1ppp/3b1n2/3P4/N7/P7/1P2NPPP/R1BQKB1R w KQ -
rnbq1rk1/pp2ppbp/6p1/2p1P1N1/P2Pp3/4B2P/1PP2PP1/R2QKB1R w KQ -
rn1q1rk1/ppp1ppbp/1n4p1/8/3PP3/1QN1Bb2/PP3PPP/3RKB1R w K -
r1bq1rk1/pp3ppp/4pn2/n2P4/3N4/1QP3P1/P3PPBP/R1B1K2R w KQ -
r1bq1rk1/2p1bppp/pnnp4/1p2p3/3PP3/1BP2N1P/PP3PP1/RNBQR1K1 w - -
r1b1k2r/1p1n1ppp/1qn1p3/p2pP3/Pb1P1P2/1N3N2/1P4PP/R1BQKB1R w KQkq -
r1b2rk1/ppq1ppbp/5np1/n1p3B1/2B1P3/2P2N2/PP1NQPPP/R4RK1 w - -
r1b1kb1r/pp1n1ppp/4p3/3pP3/3q4/3B4/PP1N1PPP/R1BQ1RK1 w kq -
r2q1rk1/pb1nppbp/3p1np1/2p5/5B2/2P1PN1P/PP1NBPP1/R2Q1RK1 w - -
rn2k2r/1b3ppp/p3pn2/1pb5/8/1P2PN2/P3BPPP/RNBR2K1 w kq -
rnb1k2r/5ppp/p4n2/1pp1P3/1bBN4/2N2P2/PP4PP/R1B1K2R w KQkq -
rn1q1rk1/pb2ppbp/1p4p1/2p5/3PP3/2P1BN2/P3BPPP/R2Q1RK1 w - -
r1bq1k1r/pp3ppp/2n2n2/3ppN2/1b2P3/2N5/PPPB1PPP/R2QKB1R w KQ -
r2q1rk1/p1pnbppp/bp3n2/3p4/3P4/1PN2NP1/P2BPPBP/R2Q1RK1 w - -
r3kb1r/1bqn1ppp/p3pn2/1pp5/3P4/P1N1PN2/BP2QPPP/R1B2RK1 w kq -
r1bqkb1r/5ppp/p2ppn2/1p6/P1nNP1P1/2N1BP2/1PPQ3P/R3KB1R w KQkq