New SMP stuff (particularly Kai)

Discussion of chess software programming and technical issues.

Moderators: hgm, Rebel, chrisw

User avatar
Laskos
Posts: 10948
Joined: Wed Jul 26, 2006 10:21 pm
Full name: Kai Laskos

Re: New SMP stuff (particularly Kai)

Post by Laskos »

bob wrote:
Laskos wrote:
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..
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.
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...
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.
zullil
Posts: 6442
Joined: Tue Jan 09, 2007 12:31 am
Location: PA USA
Full name: Louis Zulli

Re: New SMP stuff (particularly Kai)

Post by zullil »

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.
Is there a particular set of midgame positions that you prefer? If so, perhaps you could post the positions?
bob
Posts: 20943
Joined: Mon Feb 27, 2006 7:30 pm
Location: Birmingham, AL

Re: New SMP stuff (particularly Kai)

Post by bob »

Laskos wrote:
bob wrote:
Laskos wrote:
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..
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.
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...
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.
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.

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.
User avatar
Laskos
Posts: 10948
Joined: Wed Jul 26, 2006 10:21 pm
Full name: Kai Laskos

Re: New SMP stuff (particularly Kai)

Post by Laskos »

zullil wrote:
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.
Is there a particular set of midgame positions that you prefer? If so, perhaps you could post the positions?
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%.

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