/asmFish

The latest version of asmFish by Mohammed Li (04.11.2016)

Primary LanguageAssembly

******** introduction ********
Welcome to the project of converting stockfish into x86-64!
The executables can be found in the Windows folder.
The source files can be found in the asmFish folder.
  - run fasm on asmFishW_base[_popcnt,_bmi2].asm to produce executables for windows
  - run fasm on asmFish_base[_popcnt,_bmi2].asm to produce executables for linux
For more information on this project see the asmFish/asmReadMe.txt.
Run make.bat to automatically assemble the windows/linux sources for the three capabilities
  - base: should run on any 64bit x86 cpu
  - popcnt: generate popcnt instruction
  - bmi2: use instructions introduced in haswell
Besides the three cpu capabilities, this project now comes in two flavours
  - asmFish: trim off the cruft in official stockfish and make a lean and mean chess engine
  - pedantFish: match bench signature of official stockfish to catch search/eval bugs more easily
More flavors are planned for the future, including mateFish and hybridFish.
  
If you observe a crash/misbehaviour in asmFish, please raise an issue here and give me the following information:
  - name of the executable that crashed/misbehaved
  - exception code and exception offset in the case of a crash
  - a log of the commands that were sent to asmFish by your gui before the crash
Simply stating that asmFish crashed in your gui is useless information by itself.
asmFish is known to have problems in the fritz15 gui, while it plays much better in the
fritz11 gui. Any help with this issue would be appreciated.


******** FAQ ********
Q: Why not just start with the compiler output and speed up the critical functions?
   or write critical functions in asm and include them in cpp code?
A: With this approach the critical functions would still need to conform to the standards
   set in place by the ABI. All of the critical functions in asmFish do not conform to these
   standards. Plus, asmFish would be dependent on a compiler in this case, which introduces
   many unnecessary compilcations. Both asmFish and its assembler are around 100KB; lets keep
   it simple. Note that compiler output was used in the case of Ronald de Man's syzygy
   probing code, as this is not speed critical but cumbersome to write by hand.

Q: Is asmFish the same as official stockfish?
A: It is 99.9% official stockfish as there are some inconsequential functional differences in 
   official that were deemed too silly to put into asmFish. Piece lists are the prime offender
   here. You can get 100% official stockfish in deterministic searches by setting
   PEDANTIC equ 1 compile option. The changes can be viewed at
   https://github.com/tthsqe12/asm/search?q=PEDANTIC


******** updates ********
2016-11-04: "stockfish 8"
  - summary of extra features in all versions by default
    - NodeAffinity:
      - "all"  pin threads to all nodes your machine in a uniform way
      - "none"  disable pinning threads to nodes
      - "0 1 2 3" only use nodes 0, 1, 2 and 3
      - "2" only use node 2
      - "0.1 2.3" use nodes 0, 1, 2 and 3
          but node 1 shares per-node memory with node 0
              node 3 shares per-node memory with node 2
      - "0.1.2.3" use nodes 0, 1, 2 and 3
          but nodes 1, 2 and 3 share per-node memory with node 0
      - if you want to see the detected cores in your machine
          run "setoption name NodeAffinity value all"
    - TTFile, TTSave, TTLoad  
      - these simply save and load the transposition table to and from a file
        - format is not compatible with the packing in official version
    - LargePages
      - tries to allocate main hash with large pages
        - hash (and thread) commands are processed after receiving "isready"
  - summary of extra features only in base version by default
    - OwnBook , BookFile    (USE_BOOK equ 1)
      - should work as expected for books in polyglot format
    - UCI_LimitStrength, UCI_Elo    (USE_WEAKNESS equ 1)
      - should aslo work as expected, although strength has not been finely tuned

2016-10-15: "Allow inCheck pruning"
  - official has undergone speed patches; smaller gap relative to ultimaiq builds:
        speedup % from bench 128 4 n on windows+haswell:
          n      16    17    18    19   
          bmi2   13.5  13.3  13.9  13.6 
          popcnt 14.9  14.6  15.1  15.4
      
2016-10-04: "Allow inCheck pruning"
  - Def.asm now contains easy switches for turning off some output
      USE_CURRMOVE creates lots of spam in the output
      USE_HASHFULL displays hashfull in info string
      USE_SELDEPTH displays the max ply of the search
      USE_SPAMFILTER prevents printing info before a certain time
  - recommended settings if you are running a tournament in arena
      USE_CURRMOVE   equ 0   
      USE_HASHFULL   equ 0  
      USE_SELDEPTH   equ 0   
      USE_SPAMFILTER equ 1  
      SPAMFILTER_DELAY equ 100

2016-09-14: "Use Movepick SEE value in search"
  - last update until stockfish 8
    - sf code is simply too volitile these days and I need a break
    - code is not optimized and is even behind latest see-aware pins
    - please see cfish project of syzygy1 from now on for faster compiles of stockfish
  - there is however a new NodeAffinity option which can have the following values
    - "all"  pin threads to all nodes your machine in a uniform way
    - "none"  disable pinning threads to nodes
    - "0 1 2 3" only use nodes 0, 1, 2 and 3
    - "2" only use node 2
    - "0.1 2.3" use nodes 0, 1, 2 and 3
        but node 1 shares per-node memory with node 0
            node 3 shares per-node memory with node 2
    - "0.1.2.3" use nodes 0, 1, 2 and 3
        but nodes 1, 2 and 3 share per-node memory with node 0
    - if you want to see the detected cores in your machine
        run "setoption name NodeAffinity value all"
    

2016-08-23: "Refutation penalty on captures"
  - some speed gain over last relative to ultimaiq builds
  	speedup % from bench 128 1 n:
          n      16    17    18    19    20    21    
          bmi2   16.8  17.1  17.0  17.2  16.9  17.3  
          popcnt 16.5  17.1  16.5  16.5  16.6  16.6
  - added support for large pages
    - gui's can send the 'LargePages', 'Hash', and 'Threads' options in whatever random order
      they like. Since the engine should take care with these options, the processing of
      these options has been delayed until the 'isready' command is received. They are also
      processed after the 'go' command so that cmd line interation is not too cumbersome
      - if you have working LP, the interation could go like this
	 < asmFishW_2016-08-24_bmi2
	 > setoption name Threads value 4
	 > setoption name LargePages value true
	 > setoption name Hash value 256
	 > isready
	 < info string hash set to 256 MiB page size 2048 KiB
	 < info string node 0 cores 4 group 0 mask 0x000000000000000f
	 < info string node 0 has threads 0 1 2 3
	 < readyok
      - if you don't have working LP, the same interation is
	 < asmFishW_2016-08-24_bmi2
	 > setoption name Threads value 4
	 > setoption name LargePages value true
	 > setoption name Hash value 256
	 > isready
	 < info string hash set to 256 MiB
	 < info string node 0 cores 4 group 0 mask 0x000000000000000f
	 < info string node 0 has threads 0 1 2 3
	 < readyok
    - the engine still starts 1 search thread and allocates 16MiB of non-LP hash at startup
    - The 'LargePages' option does nothing on Linux, which may change in the future

2016-08-20: "Simplify IID"
  - fixed bug in tt for pedantic version
  - fixed bug in KBPsK scale
  - added hash usage
  - testing pedantic against ultimaiq builds
      speedup % from bench 128 1 n:
	n      16    17    18	 19    20    21    
	bmi2   16.4  16.9  16.7  16.7  17.0  16.8  
	popcnt 16.3  16.1  15.5  15.9  16.0  16.1
      speedup % from bench 128 4 n:
	n      17    18    19	 20    21    22    
	bmi2   15.0  15.9  17.1  16.9  15.7  17.5  
	popcnt 15.4  15.9  16.2  14.7  16.2  15.7

2016-08-18: "Remove a stale assignment"
  - searching for bug in pedantic version
    - bench speedup % over abrok.eu builds with hash=128 and depth=15,...,20
    depth  |  15  |  16  |  17	|  18  |  19  |  20  |
    bmi2   | 23.6 | 24.3 | 24.3 | 24.5 | bench no longer matches
    popcnt | 25.3 | 25.3 | 25.4 | 25.8 | at depth 19
    
2016-08-17: "Use predicted depth for history pruning"
  - fixed some silly bugs in Linux version. futexes are trickey

2016-08-12: "Simplify space formula"
  - removed colon from info strings
  - added PEDANTIC compile option, which makes asmFish match official stockfish in deterministic searches.
    
2016-08-08: "Use Color-From-To history stats to help sort moves"
  - the 07-25 version changed the default value of SlowMover from 80 to 89
    which probably accounts for some of the larger-than-expect Elo gain on http://spcc.beepworld.de/

2016-07-25: "Allow null pruning at depth 1"
  - several structures have been modified to accomodate the linux port
  - on start, asmfish now displays node information on numa systems

2016-07-18: "Gradually relax the NMP staticEval check"
  - fixed broken ponder in 07-17
  - added gui spam with current move info when not using time management for gui's that do that
  - added parsing of 'searchmoves' token, which should fix 'nextbest move' if your gui does that

2016-07-17: "Gradually relax the NMP staticEval check"
  - linux version is in the works
  - fixed bug in KRPPKRP endgames: case was mis-evaluated
  - fixed bug in easy move
  - remove dependancy on msvcrt.dll
    - resulting malloc/free in TablebaseCore.asm is a hack and will be updated in future
  - +1% implementation speed from better register useage and code arrangement in Evaluate function
  - added current move info in infinite search

2016-07-04: "Use staticEval in null prune condition"
  - fixed bug in 2016-07-02 where castling data was not copied: pointed out by Lyudmil Antonov
  - specified 1000000 byte stack reserve size in the exe
    - previous default of 64K was rounded up to 1M on >=win7 but was only rounded up to 64K on winXP
    - each recusive call to search requires 2800 bytes, so 64K is only enough for a few plies
    - threads are created with 100000 byte stack commited size which is enough for ~30 plies
  - added command line parsing
    - after the exe on the command line, put uci commands separated by ';' character
      - this doesn't work well with multiple sygyzy paths; not sure what other character is acceptable
    - behaviour is not one-shot, so put quit at the end if you want to quit
    - the following all work in Build Tester 1.4.6.0
      - bench; quit
      - bench depth 16 hash 64 threads 2; quit
      - perft 7; quit
      - position startpos moves e2e4; perft 7; quit
    - be aware that commands other than perft and bench do not wait for threads to finish
  - it seems that movegen/movedo lost a little bit of speed in single-threaded perft from numa awareness

2016-07-02:
  - add numa awareness
    - each numa node gets its own cmh table
    - see function ThreadIdxToNode in Thread.asm for thread to node allocation
    - code should also work on older windows systems with out the numa functions
    - this code is currently untested on numa systems
  - fixed bug in wdl tablebase filtering: pointed out by ma laoshi
  - added debug compile 
  - added hard exits when a critical OS function fails
  - created threads get 0.5 MB of commited stack space to combat a strange bug in XP

2016-06-25:
  - attempt to make asmFish functionally identical to c++ masterFish without piecelists
    - castling is now encoded as kingXrook
    - double pawn moves now do not have a special encoding, which affects IsPseudoLegal function
    - if piece lists were always sorted from low to high in master, then we have asmFish
    - there are three other places with VERY minor functional changes, only affecting evaluation
  - syzygy path now has no length limit
  - fix crash when thinking about a position that is mate
  - fix numerous bugs in tablebase probing code
  - fix bug in Move_Do: condition for faster update of checkersBB is working now
  - fix bugs in KNPKB and KRPKR endgames: some cases were mis-evaluated
  - fix bug in pliesFromNull: this was previously allocated only one byte of storage, which is not enough
  - fix bug in draw by 50 moves rule
  - fix bug in see: castling moves now return 0
  - prefetch main hash entry in Move_DoNull
    - according to my testing on 16, 64, and 256 MB hash sizes, prefetching has little speed effect
    - of course, pawn and material entries are still NOT prefetched
  - drop support for xboard protocol
  - tested (+6,-2,=42) against June 21 chess.ultimaiq.net/stockfish.html master
    - conditions: (tc=1min+1sec,hash=128mb,tb=5men,ponder=on,threads=1) in Arena 3.5.1

2016-06-16:
  - first stable release