gccãclangãmsvcãªã©ã®ãã€ãã£ãã³ã³ãã€ã©ã䜿çšãããšãéçºè ã¯ãã©ã°ããŸãã¯/ fpïŒstrict-fastïŒãffast-mathã-ffp-contractãªã©ã®ã³ã³ãã€ã«æãã©ã°ã䜿çšããŠfpIEEEæºæ ã¬ãã«ãèšå®ã§ããŸããéçºè ãããã©ãŒãã³ã¹ãåªå ããŠããŒã¿ãã«ç²ŸåºŠãšã®ãã¬ãŒããªãã奜ãã¢ããªã±ãŒã·ã§ã³ã®ç¯å²ïŒMLã³ã³ããªã¥ãŒã·ã§ã³ãDSPãäœç²ŸåºŠã°ã©ãã£ãã¯ã¹/ç©çãšã³ãžã³ãªã©ïŒã
䜿çšããç¹å®ã®èšå®ãšã³ã³ãã€ã©ãŒã«ãã£ãŠã¯ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããå¯èœæ§ããããŸãã ãããã®éçºè åãã®ãã³ã/èšå®ã«ãããã³ã³ãã€ã©ãŒã¯ããå€ãã®Fpæ°åŠã®æé©åãããåªããåœä»€éžæïŒfusing / fmaïŒãå€ã®ç¯å²ã®å¶éãããã³ç·©åãããæ€èšŒãå®å šã«å®è¡ã§ããŸãã
çŸåšãWasmã®éçºè ã«ãã£ãŠæå®ãããå Žåããããã®ãã©ã°ã¯éçºè ããŒã«ãã§ãŒã³ã«ãã£ãŠæ¶è²»ããã䜿çšãããç¹å®ã®ããŒã«ã«å¿ããŠããã€ããå°éããå ŽåããããŸãïŒhttps://github.com/WebAssembly/binaryen/pull/3155ãªã©ïŒã ãããã®èšå®æ å ±ã¯ç Žæ£ãããŸãããã©ã³ã¿ã€ã ã§äœ¿çšãããå Žåã¯äœ¿çšã§ããŸããã
Wasmã©ã³ã¿ã€ã ã¯ããããã®éçºè ãã©ã°/ãã³ãã«ã¢ã¯ã»ã¹ããŠãå®å šãªãšãã«æé©åãšåœä»€éžæã«ã€ããŠç¬èªã®æ±ºå®ãäžãæ段ãæã€ããšã§æ©æµãåããããšãã§ããŸãã ããã¯ãç¹ã«AOT wasmã³ã³ãã€ã©ã§ãè¿œå ã®ã©ã³ã¿ã€ã æé©åãå®è¡ããå Žåã«ç¹ã«åœ¹ç«ã¡ãŸãã ããã¯ãäžžããæå°/æ倧ãªã©ã®FP Wasm SIMD codegenã®æ¢ç¥ã®ããã©ãŒãã³ã¹ã®æžå¿µã®ããã€ãã«å¯ŸåŠããã®ã«ã圹ç«ã¡ãŸãã1ã€ã¯é«ã¬ãã«ã§ããããã«ãããã©ã³ã¿ã€ã ãç¹å®ã®FPæé©åã®ããã«éçºè ããŒã«ã«äŸåããªãããã«ãªãããã€ãã£ãããã©ãŒãã³ã¹ãããå³å¯ã«è¿œè·¡ããããã®Wasmã
ããã©ã«ãã¢ãŒããšããŠIEEEã³ã³ãã©ã€ã¢ã³ã¹ãç·©åããã¯ã©ã¹/ã€ã³ã¿ãŒãã§ã€ã¹/ã¡ãœããã®ç²åºŠã§ç§»æ€æ§ã確ä¿ããããã«ãstrictfpã修食åãå°å ¥ããJVM1.2ã®åäŸããããŸãã Wasmã®ããäžäœäºææ§ã®ããã¢ãããŒããæ€èšããæ©äŒããããŸãã
ã©ã³ã¿ã€ã ãšã³ãžã³ã«ãã£ãŠæ¶è²»ãããWasmãã€ããªã§fpIEEEã³ã³ãã©ã€ã¢ã³ã¹ãã©ã°ããšã³ã³ãŒãããã¡ã«ããºã ãææ¡ããããšæããŸãã ãã€ãã£ãèšèªã®å Žåãšåæ§ã«ããã©ã°èªäœã¯ãªãã·ã§ã³ãšããŠæ±ãããšãã§ãããããã®äœ¿çšã¯ã©ã³ã¿ã€ã ã®éžæã«ãªããŸãã ãã®åœ±é¿ã¯ãããã©ãŒãã³ã¹ã®åäžãç¹å®ã®ãã©ãããã©ãŒã ã§ã®äžè²«ããã»ãã³ãã£ã¯ã¹ãããã³ãã©ãããã©ãŒã ã®ç§»æ€æ§ã®äœäžãšããŠçŸããŸãã ææ¡ãããã¡ã«ããºã ã«ãããWasmãã€ããªå ã®ã³ãŒãã»ã¯ã·ã§ã³ã«ãåœä»€ã®ãããã¯ã®ç²åºŠã§ãããã®èšå®/ãã³ããæ確ã«ããŒã¯ããããšãã§ããŸãã
å ã«é²ãã«ã€ããŠãèšèšã詳现ã«æŽçã§ããŸãã1ã€ã®ãªãã·ã§ã³ã¯ãèšå®ãšã³ãŒãã»ã°ã¡ã³ããªãã»ãããããŒã¯ãããšã³ããªãå«ãæ°ããã«ã¹ã¿ã ã»ã¯ã·ã§ã³ãå°å ¥ããããšã§ããå¥ã®ãªãã·ã§ã³ã¯ãJVMã®ããã«ããããã®éçºè èšå®ã䜿çšããŠã³ãŒãã»ã°ã¡ã³ããããŒã¯ããæ°ããåœä»€ãå°å ¥ããããšã§ãã ãµããŒãããç¹å®ã®ãã©ã°ã«ã€ããŠã¯ãå ã«é²ãã«ã€ããŠè©±ãåããçµã¿èŸŒãããšãã§ããŸãïŒããšãã°ã-fp-finate-math-onlyã-fp-no-signed-zeros ..ïŒã
ãã®ã¡ã«ããºã ã¯ãã¹ã«ã©ãŒ/ãã¯ãã«FMAãããã³FPè¿äŒŒåœä»€ãWasmããã³/ãŸãã¯SIMDä»æ§ã«è¿œå ããããã®è°è«ãè£å®ããŸãã
ãã®åé¡ã¯ããã®ãããã¯ãžã®é¢å¿ã远跡ããCGåæã§ããã«ã€ããŠè°è«ããããšã§ãã
fpæäœã®å³å¯ãã¯ããã°ã©ã ã®ã»ãã³ãã£ã¯ã¹ã«åœ±é¿ãäžãããããããå¯å®¹ãªã»ãã³ãã£ã¯ã¹ãå¯èœã«ããæåã®æ¹æ³ã¯ãã«ã¹ã¿ã ã»ã¯ã·ã§ã³ããããã¯æ§é ã§ã¯ãªããæ°ããåœä»€ãå°å ¥ããããšã ãšæããŸãã NaNäŒæã«ãŒã«ã«ãããæµ®åå°æ°ç¹ã®é決å®æ§ãåŠçããããã«å¿ èŠãªä»æ§ã¡ã«ããºã ã¯ãã§ã«çšæãããŠãããããããå€ãã®çµæãå¯èœã«ããæ°ããæµ®åå°æ°ç¹åœä»€ãå°å ¥ããã®ã¯ç°¡åã ãšæããŸãã
è¿œå ã®ã³ã³ããã¹ããšããŠãJVMã¯ããã®äžéšãšããŠã strictfp
ãããããšãæ€èšããŠããŸãã
ããå¯å®¹ãªã»ãã³ãã£ã¯ã¹ãå¯èœã«ããæè¯ã®æ¹æ³ã¯ãã«ã¹ã¿ã ã»ã¯ã·ã§ã³ããããã¯æ§é ã§ã¯ãªããæ°ããåœä»€ãå°å ¥ããããšã§ãã
æ°ããåœä»€ãå°å
¥ããããšã¯äŸ¿å©ã§ãããæ¡åŒµæ§ãé«ãããããããŒã«ãã§ãŒã³ã®äŸåé¢ä¿ãå®å
šã«åé€ãããããããšã¯ãããŸããã fmaãreciprocalãªã©ã®åªãããã©ãããã©ãŒã ãµããŒããåããåœä»€ã¯ãæ°ããåœä»€ã®è¿œå ã«é©ããŠããŸãã ãã€ãã£ãã³ã³ãã€ã©ãæäŸãããã³ã/ãã©ã°ã«ã¯ããªãã®
-fassociative-math
-ffast-math
-fno-honor-nans
-ffinate-math-only
-fdenormal-fp-math
-fno-strict-float-cast-overflow
-fno-math-errno
-fno-trapping-math
...
ãããã®ã»ãšãã©ã¯ã代æ°å€æãnansã笊å·ä»ããŒãããã©ãããäžžããªã©ã®å¶éã解é€ãããããç©æ¥µçãªfpæé©åãå¯èœã«ããããã®ãã³ãã§ããæ°ããåœä»€ãšããŠãã¹ãŠã®æçšãªãã©ã°ãè¡šçŸããããšã¯çæ³çãªimoã§ã¯ãããŸããã
è¿œå ã®ã³ã³ããã¹ããšããŠãJVMã¯ããã®äžéšãšããŠãstrictfpãåé€ããå³å¯ãªã»ãã³ãã£ã¯ã¹ã®ã¿ããµããŒãããããšãæ€èšããŠããŸãã
ãã®è¿œå ãããã³ã³ããã¹ãã@sunfishcodeã«æè¬ããŸãïŒ ç§ã¯ãã®æ°ããæŽæ°ã«ã€ããŠç¥ããŸããã§ããããããŠåæ©ã¯æ°åŠã©ã€ãã©ãªã®å€åœ¢ãçµ±åããããšã§ããããã«æãããŸãã ããèŠããšãJava strict-fpã¯ããå°ãç¹æ®åãããŠããããã«èŠããgcc / clangã«ãã£ãŠæäŸãããã³ã³ãããŒã«ãã€ã³ãã®ç¯å²ãé©åã«è¡šããŠã¯ããŸããã -ffast-mathãã©ã°ãšé¢é£ãããã©ã°ã¯ãgithubã®ã¯ã€ãã¯æ€çŽ¢ããã®ãã€ãã£ããªããžããªã§éåžžã«äººæ°ãããããã§ãã äžèšã®ãã©ã°ãšé¢é£ããpargmasã®äœ¿çšæ³ã調ã¹ãäºå®ã§ã
gcc / clangã®-ffast-mathã䜿çšããå žåçãªãããžã§ã¯ãã¯ããã€ãã£ãã³ãŒãã«ã³ã³ãã€ã«ãããŠããŸãã ãããã䜿çšããã¢ããªã±ãŒã·ã§ã³éçºè ã¯ãéåžžãèªåã§äœæãããã¹ãŠã®ãã€ãã£ãã³ãŒãããªã¢ã³ãããã¹ãããŸãã ãŸããäžè¬çãªããŒããŠã§ã¢ISAã¯ãã¹ãŠå®å šã«æ±ºå®è«çãªæµ®åå°æ°ç¹ã®åäœãããŠãããããéçºè ããããã®ããªã¢ã³ãããã¹ããããšããŠãŒã¶ãŒã®åäœãå€ãããªãããšãããªã確信ã§ââããŸãã çŸåšãWebAssemblyã®æµ®åå°æ°ç¹ããã®ããã«æ©èœããŸãã ããã¯ãããŒããŠã§ã¢ISAãšåæ§ã«å®å šã«æ±ºå®è«çã§ããããã-ffast-mathãè¿œå ããŠãããããã«å¯ŸããŠæ©èœãããããšããã¹ãã§ãããšãããé·å¹Žã®éçºè ã®åæãå®ãããŠããŸãã
WebAssemblyã¬ãã«ã®-ffast-mathãã©ã°ã¯ãWebAssemblyããã®ç¹ã§ããŒããŠã§ã¢ISAã«äŒŒãŠãããããããã®ä»®å®ãæ¯æããŠããªãããšãæå³ããŸãã éçºè ã¯äœæãããã€ããªããã¹ãããŸããããŠãŒã¶ãŒã«wasmãåºè·ããå ŽåããŠãŒã¶ãŒã¯ããŸããŸãªããŒããŠã§ã¢ãŸãã¯ããŸããŸãªãšã³ãžã³ã§å®è¡ã§ããããšãæåŸ ããå¿ èŠããããŸãã WebAssemblyã¬ãã«ã§é«éæ°åŠã®ãããªãã©ã°ã䜿çšãããšãWebAssemblyã¯ISAã®ããã«åäœããããŠãŒã¶ãŒã¯éçºè ããã¹ããããã®ãšã¯ç°ãªãæµ®åå°æ°ç¹ã®çµæãèŠãããšãã§ããŸãã
ãŸãããããã®ãã©ã°ã䜿çšãããããžã§ã¯ãã¯ãä»æ¥WebAssemblyã«ã³ã³ãã€ã«ãããšãã«èŠéãããšã¯ãããŸããã ããšãã°ã-fassociative-mathã«ãã£ãŠæå¹ã«ãªãæé©åã®å€ãã¯ãWebAssemblyãäœæããåã«LLVMãå®è¡ã§ããã«ãŒãæåã®æé©åã§ãã
ã¯ãããããŒãã®ç²ŸåºŠ/åäœã«åœ±é¿ãäžãã決å®ã¯ãããŒã«ã«ãã£ãŠWasmã¢ãžã¥ãŒã«ã«çµã¿èŸŒãŸããå¿ èŠããããŸãã çŸåšã®åœä»€ã§ã¯è¡šçŸã§ããªãåäœã«å¯ŸããŠãæ°ããåœä»€ãè¿œå ã§ããŸãã
ååã®CGããŒãã£ã³ã°ã§ãã®ãããã¯ã«ã€ããŠè©±ãåããç®æšã®ä»£æ¿æ段ãšããŠæ°ããåœä»€ãè¿œå ããŸããã åŸè ã®æ¹åã§ããã解決ããããšã«äžè¬çãªé¢å¿ãããããã§ãã ããŒã«ãã§ãŒã³ã®æé©åãšæ¬ èœããŠããåœä»€ããªã¢ã³ãã®å°å ¥ã«ãã£ãŠãããã©ãŒãã³ã¹ã®åäžã«å¯Ÿããéçºè ã®æåŸ ãæ¯æãããã°ãç§ã¯ç°è°ãå±ããŸããã ãã®å ŽåãWasmã®æœè±¡åã¬ãã«ãæãªãã©ã³ã¿ã€ã ã«ãããã®ãã©ã°ãäŒæããããšãæ£åœåããå¿ èŠã¯ãããŸããã ãã®ç®æšãéæããããã«å¿ èŠãªã»ãã³ãã£ãã¯ããªã¢ã³ãåœä»€ãç解ããããšã¯è¯ãããšã§ãã SIMDã®ã³ã³ããã¹ãã§èå¥ãããããã€ãã®æ°ããåœä»€ããããŸãããããã¯ãé«éæŒç®ãã©ã°ãå®å šã«è¡šçŸããããã«å¿ èŠãªåœä»€ããŒã«ãšäžèŽããããã«æ¡åŒµããå¿ èŠãããå ŽåããããŸãã ãã®æ¹åãèŠç¶ããŸãã
ãã£ãŒãããã¯ããå¯ãããã ãããããšãããããŸãã
CGãã£ã¹ã«ãã·ã§ã³ã«äœ¿çšãããã³ã³ãã³ãã Wasm ffast-math.pptx
æãåèã«ãªãã³ã¡ã³ã
gcc / clangã®-ffast-mathã䜿çšããå žåçãªãããžã§ã¯ãã¯ããã€ãã£ãã³ãŒãã«ã³ã³ãã€ã«ãããŠããŸãã ãããã䜿çšããã¢ããªã±ãŒã·ã§ã³éçºè ã¯ãéåžžãèªåã§äœæãããã¹ãŠã®ãã€ãã£ãã³ãŒãããªã¢ã³ãããã¹ãããŸãã ãŸããäžè¬çãªããŒããŠã§ã¢ISAã¯ãã¹ãŠå®å šã«æ±ºå®è«çãªæµ®åå°æ°ç¹ã®åäœãããŠãããããéçºè ããããã®ããªã¢ã³ãããã¹ããããšããŠãŒã¶ãŒã®åäœãå€ãããªãããšãããªã確信ã§ââããŸãã çŸåšãWebAssemblyã®æµ®åå°æ°ç¹ããã®ããã«æ©èœããŸãã ããã¯ãããŒããŠã§ã¢ISAãšåæ§ã«å®å šã«æ±ºå®è«çã§ããããã-ffast-mathãè¿œå ããŠãããããã«å¯ŸããŠæ©èœãããããšããã¹ãã§ãããšãããé·å¹Žã®éçºè ã®åæãå®ãããŠããŸãã
WebAssemblyã¬ãã«ã®-ffast-mathãã©ã°ã¯ãWebAssemblyããã®ç¹ã§ããŒããŠã§ã¢ISAã«äŒŒãŠãããããããã®ä»®å®ãæ¯æããŠããªãããšãæå³ããŸãã éçºè ã¯äœæãããã€ããªããã¹ãããŸããããŠãŒã¶ãŒã«wasmãåºè·ããå ŽåããŠãŒã¶ãŒã¯ããŸããŸãªããŒããŠã§ã¢ãŸãã¯ããŸããŸãªãšã³ãžã³ã§å®è¡ã§ããããšãæåŸ ããå¿ èŠããããŸãã WebAssemblyã¬ãã«ã§é«éæ°åŠã®ãããªãã©ã°ã䜿çšãããšãWebAssemblyã¯ISAã®ããã«åäœããããŠãŒã¶ãŒã¯éçºè ããã¹ããããã®ãšã¯ç°ãªãæµ®åå°æ°ç¹ã®çµæãèŠãããšãã§ããŸãã
ãŸãããããã®ãã©ã°ã䜿çšãããããžã§ã¯ãã¯ãä»æ¥WebAssemblyã«ã³ã³ãã€ã«ãããšãã«èŠéãããšã¯ãããŸããã ããšãã°ã-fassociative-mathã«ãã£ãŠæå¹ã«ãªãæé©åã®å€ãã¯ãWebAssemblyãäœæããåã«LLVMãå®è¡ã§ããã«ãŒãæåã®æé©åã§ãã