ãã®èšäºã§ã¯ããã¹ããŒãèªèããã°ã©ã ã®åéºã«ã€ããŠåŒãç¶ã説æããŸãããã¹ããŒãã¯ãšã«ãã©ã¹ã«éãããŸãïŒ
ããã§ã¯ãElbrusã¢ãŒããã¯ãã£ã«ã€ããŠäœãç¥ã£ãŠããŸããïŒ
Elbrusã¯ãé«ãå®å šæ§ãšä¿¡é Œæ§ãç¹åŸŽãšãããé«æ§èœã§ãšãã«ã®ãŒå¹çã®é«ãããã»ããµã¢ãŒããã¯ãã£ã§ãã Elbrusã¢ãŒããã¯ãã£ã®ææ°ã®ããã»ããµã¯ããµãŒããŒããã¹ã¯ãããã³ã³ãã¥ãŒã¿ãŒãããã«ã¯çµã¿èŸŒã¿ã³ã³ãã¥ãŒã¿ãŒãšããŠã䜿çšã§ããŸãã æ å ±ã»ãã¥ãªãã£ã䜿çšæž©åºŠç¯å²ã補åã®ã©ã€ããµã€ã¯ã«ã«å¯Ÿããå¢å€§ããèŠä»¶ãæºããããšãã§ããŸãã MCSTã®åºçç©[1ã2]ã瀺ãããã«ãElbrusã¢ãŒããã¯ãã£ããã»ããµã¯ãä¿¡å·åŠçãæ°åŠã¢ããªã³ã°ãç§åŠèšç®ãããã³èšç®èœåã®èŠä»¶ãå¢å ããä»ã®ã¿ã¹ã¯ã®åé¡ã解決ããããã«èšèšãããŠããŸãã
Smart Enginesã§ã¯ããšã«ãã«ã¹ã®ããã©ãŒãã³ã¹ããé床ãå€§å¹ ã«äœäžãããããšãªããã¹ããŒãèªèãå®çŸããã®ã«ååã§ããããšã確èªããããšããŸããã
æŠèŠïŒElbrusã¢ãŒããã¯ãã£ã®æ©èœ
Elbrusã¢ãŒããã¯ãã£ã¯ãåºç¯ãªã³ãã³ãã¯ãŒãïŒVery Long Instruction WordãVLIWïŒã®åçã䜿çšããã¢ãŒããã¯ãã£ã®ã«ããŽãªã«å±ããŸãã VLIWã¢ãŒããã¯ãã£ãŒãæèŒããããã»ããµãŒã§ã¯ãã³ã³ãã€ã©ãŒã¯äžé£ã®ã³ãã³ãïŒã¯ã€ãã³ãã³ãã¯ãŒãïŒã®ã°ã«ãŒãã®ã·ãŒã±ã³ã¹ãçæããŸããã°ã«ãŒãå ã®ããŒã éã®äŸåé¢ä¿ã¯ãªããç°ãªãã°ã«ãŒãã®ããŒã éã®äŸåé¢ä¿ã¯æå°éã«æããããŸãã ãããã®ã³ãã³ãã°ã«ãŒãã¯äžŠåã§å®è¡ãããæäœã¬ãã«ã§é«ã¬ãã«ã®äžŠååŠçãæäŸããŸãã
ã³ãã³ãã¬ãã«ã§ã®äžŠååã¯ãæé©åã³ã³ãã€ã©ã«ãã£ãŠå®å šã«æäŸãããŸããããã«ãããããšãã°x86ã¢ãŒããã¯ãã£ã®å Žåã®ããã«ã䞊ååã¿ã¹ã¯ã解決ãããªããããã³ãã³ãã®å®è¡è£ 眮ãå€§å¹ ã«ç°¡çŽ åãããŸãã ã·ã¹ãã ã®æ¶è²»é»åãåæžãããŸãããããã®ã¿ã¹ã¯ã¯ãã¹ãŠã³ã³ãã€ã©ã«å²ãåœãŠããããããããã»ããµã¯ãªãã©ã³ãéã®äŸåé¢ä¿ãåæããããæäœã䞊ã¹æ¿ãããããå¿ èŠããªããªããŸãã ã³ã³ãã€ã©ãŒã¯ãããŒããŠã§ã¢ãã€ããªã³ãŒãã¢ãã©ã€ã¶ãŒãããã¯ããã«å€§ããªèšç®ããã³æéãªãœãŒã¹ãæã£ãŠããããããã培åºçãªåæãå®è¡ããããç¬ç«ããæäœãèŠã€ãããã®çµæãããå¹ççã«å®è¡ãããå¹ åºãã³ãã³ãã¯ãŒãã圢æã§ããŸãã
æäœã®äžŠååŠçã®äœ¿çšã«å ããŠãElbrusã¢ãŒããã¯ãã£ã¯ãèšç®åŠçã«åºæã®ãã®ä»ã®ã¿ã€ãã®äžŠååŠçã®å®è£ ãå®è£ ããŸãããã¯ãã«äžŠååŠçãå ±æã¡ã¢ãªã®å¶åŸ¡ãããŒã®äžŠååŠçããã«ããã·ã³ã³ã³ãã¬ãã¯ã¹ã®ã¿ã¹ã¯ã®äžŠååŠçã§ãã
ããã«ãElbrusã¢ãŒããã¯ãã£ã¯ãIntel x86ã¢ãŒããã¯ãã£ãšãã€ããªäºæã§ãããåçãªãã€ããªå€æã«åºã¥ããŠå®è£ ãããŠããŸãã
Elbrusã¢ãŒããã¯ãã£ã®ãã1ã€ã®éèŠãªæ©èœã¯ãå®è¡æã«ããã°ã©ã ãšããŒã¿ãä¿è·ããããã®ããŒããŠã§ã¢ãµããŒãã§ãã ããã°ã©ã ã¯ãããŒããŠã§ã¢ã¬ãã«ã§å®è£ ãããåäžã®ä»®æ³ç©ºéã§å®è¡ãããŸããããã«ãããæªæã®ããã³ãŒããå®è¡ãããå¯èœæ§ãæå°éã«æããããä»ã®ã¢ãŒããã¯ãã£ã§ã¯æ€åºãå°é£ãªãšã©ãŒãæ€åºã§ããŸãã
ãããã£ãŠãElbrusããã»ããµã®ã¢ãŒããã¯ãã£ã®äž»ãªæ©èœ[3ã4]ïŒ
- 䞊åãšãã«ã®ãŒå¹çã®è¯ãã³ã¢ã¢ãŒããã¯ãã£ã
- ã³ã³ãã€ã©ã䜿çšããã³ãã³ããããŒã®èªå䞊ååã
- ãããã¯ãã¢ãŒããå©çšã§ãããããäœæããããœãããŠã§ã¢ã®ä¿¡é Œæ§ãšã»ãã¥ãªãã£ãåäžããŸãã
- äžè¬çãªãã€ã¯ãããã»ããµã¢ãŒããã¯ãã£ãšã®äºææ§ã
ãšã«ãã©ã¹ãšã®ç¥ãåã
䜿çšããç¹å®ã®ãã·ã³ã¯Elbrus 4.4ã§ã4ã€ã®4ã³ã¢Elbrus 4Cããã»ããµãš3ã€ã®ã¡ã¢ãªã³ã³ãããŒã©ã3ã€ã®ããã»ããµééä¿¡ãã£ãã«ã1ã€ã®I / Oãã£ãã«ã8 MB L2ãã£ãã·ã¥ïŒã³ã¢ããã2 MBïŒãçµã¿åãããŸããã ã Elbrus 4Cã®åäœã¯ããã¯åšæ³¢æ°ã¯800 MHzãæè¡åºæºã¯65 nmãå¹³åæ¶è²»é»åã¯45ã¯ããã§ãã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã -Linuxã«åºã¥ããŠäœæãããOSãElbrusãã uname -a
瀺ãããã®ã¯æ¬¡ã®ãšããã§ãã
Elbrusã®æé©åã³ã³ãã€ã©ã¯lccãšåŒã°ããŸãã 2015幎8æ27æ¥ä»ãã®gcc 4.4.0ãšäºææ§ã®ããLccããŒãžã§ã³1.20.09ããµãŒããŒã«ã€ã³ã¹ããŒã«ãããŸããã lccã¯æšæºã®gccãã©ã°ãšé£æºããããã€ãã®è¿œå ãã©ã°ãå®çŸ©ããŸãã æšæºãã©ã°ããã-ffastãš-ffast-mathã«æ³šæãæããŸããã ãããã®ãªãã·ã§ã³ã«ã¯ãå®éã®æŒç®ã«ããå€æãå«ãŸããŠãããããããã©ã«ãã§ãªãã«ãªã£ãŠããŸããããã«ãããå®éã®æäœããã³æ©èœã«ã€ããŠIEEEãŸãã¯ISOèŠæ Œã«å³å¯ã«åŸãå¿ èŠãããããã°ã©ã ã®èª€ã£ãçµæãçããå¯èœæ§ããããŸãã ããã«ããããã«ã¯æœåšçã«å±éºãªæé©åãå«ãŸããŠããããŸãã«ãã€ã³ã¿ãŒãèªç±ã«æäœããããã°ã©ã ã®äžæ£ãªåäœã«ã€ãªããå¯èœæ§ããããŸãã äž¡æ¹ã®ãã©ã°ã«ã¯ãããã«-fstdlibã-falignedã-fno-math-errnoã-fno-signed-zerosã-ffinite-math-onlyã-fprefetchã-floop-apb-conditional-loadsã-fstrict-aliasingãå«ãŸããŸãã ãããã®äœ¿çšã¯ãããã°ã©ã ã®ããã©ãŒãã³ã¹ã«å€§ãã圱é¿ããŸãã
ããã«ãlccã§ã¯æé©åã埮調æŽã§ããŸããããšãã°ãé¢æ°çœ®æãã©ã¡ãŒã¿ãŒãèšå®ããããã®äžé£ã®ãã©ã°ããããŸãã
è¡š1.ãã©ã°lccãé¢æ°ã®çœ®æã®ãã©ã¡ãŒã¿ãŒãå¶åŸ¡ã§ããŸãã
Lccãã©ã° | äºå® |
---|---|
-finline-level = <f> | 眮æ匷床ã®å¢å ä¿æ°ãèšå®ããŸã[0.1-20.0] |
-finline-scale = <f> | äž»ãªãªãœãŒã¹å¶éã®å¢å ä¿æ°ãèšå®ããŸã[0.1-5.0] |
-finline-growfactor = <f> | 眮æåŸã®ããã·ãŒãžã£ã®ãµã€ãºã®æ倧å¢å ãèšå®ããŸã[1.0-30.0] |
-finline-prog-growfactor = <f> | 眮æåŸã®ããã°ã©ã ãµã€ãºã®æ倧å¢å éãèšå®ããŸã[1.0-30.0] |
-finline-size = <n> | ã€ã³ã©ã€ã³ããã·ãŒãžã£ã®æ倧ãµã€ãºãæå®ããŸãã |
-finline-to-size = <n> | 眮æãå®è¡ã§ããããã·ãŒãžã£ã®æ倧ãµã€ãºãæå®ããŸãã |
-finline-part-size = <n> | éšå眮æã®ããã·ãŒãžã£ã®æšå®é åã®æ倧ãµã€ãºãèšå®ããŸãã |
-finline-uncond-size = <n> | ç¡æ¡ä»¶ã«çœ®æãããããã·ãŒãžã£ã®æ倧ãµã€ãºãèšå®ããŸãã |
-flib-inline-uncond-size = <n> | ç¡æ¡ä»¶ã«çœ®æãããã©ã€ãã©ãªããã·ãŒãžã£ã®æ倧ãµã€ãºãèšå®ããŸãã |
-finline-probable-calls = <f> | åŒã³åºãã«ãŠã³ã¿ãŒãïŒargument * max_call_countïŒããå°ããããã·ãŒãžã£ãŒã®çœ®æãé²æ¢ããŸãã
ããã§ãmax_call_countã¯ãã¿ã¹ã¯å šäœã®åŒã³åºãæäœã®æ倧ã«ãŠã³ã¿ãŒã§ãã |
-fforce-inline | ã€ã³ã©ã€ã³æå®åã䜿çšããç¡æ¡ä»¶ã®é¢æ°çœ®æãå«ãŸããŸãã |
-finline-vararg | å¯å€æ°ã®åŒæ°ã䜿çšããé¢æ°çœ®æãå«ãŸããŸãã |
-finline-only-native | æ瀺çãªã€ã³ã©ã€ã³ä¿®é£Ÿåãæã€é¢æ°ã®ã¿ã眮æããŸã |
ããã·ãŒãžã£ãŒéã®æé©åããã€ã³ã¿ãŒåæãããŒã¿ããŒãžã³ã°ãªã©ãèšå®ããããšãã§ããŸãã
Elbrusã®ãããã¡ã€ãªã³ã°ã§ã¯ãå€ãã®äººã䜿ãæ £ããperfã䜿çšã§ããŸãããããŸãç¥ãããŠããªãdprofã䜿çšã§ããŸãã ããã«ãdprofã®æ¡åŒµæ©èœã䜿çšããŠããããã¡ã€ã«ãvalgrindäºæã®åœ¢åŒã«å€æã§ããŸãã
ãã®ãããç§ãã¡ã®ç®æšã¯ããã¹ããŒãèªèããã°ã©ã ã®ã³ã³ãœãŒã«ããŒãžã§ã³ãç«ã¡äžããããšã§ããã å®å
šã«C / C ++ã§èšè¿°ãããŠãããC ++ 11ã䜿çšããããšããããŸãã C ++ 11ã®ãµããŒããèšèŒãããŠããªããšããäºå®ã«ãããããããå®éã«ã¯lccã¯éåžžã«éžæçã§ã¯ãããŸãããããç解ããŠããŸãã C ++ 11ã®å®å
šãªãµããŒãã¯ãlccã®æ°ããããŒãžã§ã³ã§èšç»ãããŠããŸãã
å³å¯ã«ã¯ãµããŒããããŠããŸããïŒ
- std :: default_random_engineã æ®å¿µãªãããããã§ã¯ãµãŒãããŒãã£ã®æ¬äŒŒä¹±æ°ãžã§ãã¬ãŒã¿ãŒã®äœ¿çšã®ã¿ãæšå¥šã§ããŸãã
- nullptr_tã nullptrãæ¬åœã«å¿ èŠãªå Žåã¯ã代ããã«ç¹å¥ã«å²ãåœãŠããããªããžã§ã¯ãã®å€ã䜿çšããå¿ èŠããããŸãã
- std :: beginããã³std :: endã STLãªããžã§ã¯ãã®å ŽåãbeginïŒïŒããã³endïŒïŒã¡ãœããã䜿çšã§ããŸãããC / C ++ãªããžã§ã¯ãã®å Žåãã¢ãã¬ã¹ãæåã§æ€çŽ¢ããå¿ èŠããããŸãã
- std ::ã¯ãã::å®å®ããæèšã 代ããã«std :: chrono :: high_resolution_clockã䜿çšããŸãããããã¡ãããstd :: chrono :: steady_clockããªããããåäœæéã®æž¬å®ã«ãšã©ãŒãçºçããå¯èœæ§ããããŸãã
- std :: string :: pop_backïŒïŒã¡ãœããããããŸããã ãã ãã代ããã«ãstd :: string :: eraseïŒsizeïŒïŒ-1ã1ïŒãå®å šã«äœ¿çšã§ããŸãã
- std :: to_stringã¯ãdoubleåã®åŒæ°ã«å¯ŸããŠå®çŸ©ãããŠããŸããã ãã®åé¡ã¯ãããšãã°ããµããŒããããŠããlong doubleã«å€æããããšã§è§£æ±ºãããŸãã
- æšæºã®STLã³ã³ããã¯ãã³ããŒã®ä»£ããã«ç§»åæäœã䜿çšããŠä¿åãªããžã§ã¯ããšããŠstd :: unique_ptrã®ä»æ§ãæäŸããŸãããã€ãŸããstd :: map <intãstd :: uniqie_ptr>ã¯äœæã§ããŸããã
ããã«ãstd :: unique_ptrãstd :: shared_ptrã¯ããèªäœã§ãµããŒããããŠããŸãã
ããã«ãlccã¯gccæ¡åŒµå__uint128_tãšãBOMä»ãã®UTF-8ãšã³ã³ãŒãããããœãŒã¹ãã¡ã€ã«ãæ··ä¹±ãããŸãã
ãµããŒããããŠããªãã³ãŒããæžãçŽããåŸããããžã§ã¯ããæ£åžžã«ã³ã³ãã€ã«ããããšãã§ããŸããã ãã ãããã¹ããŒãèªèããã°ã©ã ãåçŽã«å®è¡ããããšã¯ã§ããŸããã§ãããéå§ããããšãããšãã«ããã¹ãšã©ãŒãçºçããŸããã ICSTã®å°é家ãšçžè«ããçµæãåé¡ã¯ã䜿çšããŠããEigenã©ã€ãã©ãªå ã§çºçããäžåè¡¡ãªã¡ã¢ãªã¢ã¯ã»ã¹ã§ããããšãããããŸããã
Eigenã¯ãC ++ [5]ã§èšè¿°ãããæé©åãããããããŒã®ã¿ã®ç·åœ¢ä»£æ°ã©ã€ãã©ãªã§ãã è¡åããã³ãã¯ãã«ã®ããŸããŸãªæäœã«äœ¿çšã§ããx86 SSEãARM NEONãPowerPC AltiVecãããã³IBM S390xã®æé©åãå«ãŸããŠããŸãã
Eigenéçºè ã¯ãã©ã€ãã©ãªãElbrusã§äœ¿çšãããããšãæåŸ ããŠããªãã£ãããããµããŒããããŠããã¢ãŒããã¯ãã£ã®ãªã¹ãã«ã©ã€ãã©ãªãå«ãããã¢ã©ã€ã¡ã³ããããã¡ã¢ãªã¢ã¯ã»ã¹ã¢ãŒããç¡å¹ã«ããŸããã MCSTã®ååã¯ããã®åé¡ã®ä¿®æ£ãè¿ éã«æ¯æŽããä¿®æ£æ¹æ³ã瀺ããŸããã
ãã®è¿œå ã®çµæãå¿ èŠãªEigenæ©èœãç²åŸãããŸããã ããã¯ãEigenãšElbrusã®éäºææ§ã§ãããå«ãŸããæé©åã«ãã£ãŠã®ã¿æããã«ãªãããšã«æ³šæããŠãã ããã
ããããç§ãã¡ã®äžå¹žã¯ããã§çµãããŸããã§ããã ãšã©ãŒBusãšã©ãŒã¯æ¶ããŠããŸããããã©ã€ãã©ãªã®ã³ãŒãã®å®è¡äžã«çºçããŸããã å°ã調æ»ããçµæãèªèäžã«è¿œå ã®ç»åã³ã³ããã®åæåäžã«éæŽåã¡ã¢ãªã¢ã¯ã»ã¹ãå®æçã«çºçããããšãããããŸããã
ã¹ããŒããäžããããã«ã8ãããç»åã®è¡ã«åºå®å€ãå
¥åãããšã4ãã€ãã®åæ°ã§ããè¡ã®äžéšãããã32ãããå€ïŒå
ã®8ããããã³ããŒããŠäœæãããïŒãå
¥åãããæ®ãã®è¡ã¯ãã§ã«1ãã€ãã§å
¥åãããŠããŸããã ãã ãã8ãããç»åãå²ãåœãŠãå Žåãã¡ã¢ãªå
ã®ã¢ã©ã€ã¡ã³ãã¯1ãã€ãã®ã¿ã«ä¿èšŒããããã®ã¢ãã¬ã¹ã«32ãããå€ãæžã蟌ãããšããŠãããšãã«ãšã©ãŒãçºçããŸããã
ãã®åé¡ã解決ããããã«ãå¿
èŠãªãã€ãæ°ã®åæ°ã§ããæãè¿ãã¢ãã¬ã¹ã®èšç®ïŒèšè¿°ãããŠããå Žåã¯4ïŒã®èšç®ãè¡åŠçã®å
é ã«è¿œå ãããã®ã¢ãã¬ã¹ã1ãã€ãã§åãããã®ã¢ãã¬ã¹ããæ¢ã«4ãã€ããåããŠããŸãã
ãã®ãšã©ãŒãä¿®æ£ããåŸãç§ãã¡ã®ããã°ã©ã ã¯èµ·åããã ãã§ãªããæ£ããåäœã瀺ããŸããïŒ
ãã§ã«å°ããªåå©ã§ããããå ã«é²ã¿ãŸããã 次ã®ã¹ãããã§ã¯ãã·ã¹ãã ã®æé©åã«çŽæ¥é²ã¿ãŸããã ç§ãã¡ã®ããã°ã©ã ã¯2ã€ã®ã¢ãŒãã§åäœããŸãïŒåçãŸãã¯ã¹ãã£ã³ãããç»åã®ãã¹ããŒãã®ä»»æã«é 眮ãããåºããã®èªèïŒä»»æã®ã¢ãŒãïŒãããã³ãããªã®ãã¹ããŒãã®èªèïŒã¢ãã€ã«ã¢ãŒãïŒã 2çªç®ã®ã±ãŒã¹ã§ã¯ããã¹ããŒãããã¬ãŒã ã®å€§éšåãå ãããã¬ãŒã ããšã«ãã®äœçœ®ããããã«å€åãã1ã€ã®ãã¬ãŒã ã®åŠçã«ã¯ããã¥ã¡ã³ãæ€çŽ¢ã¢ã«ãŽãªãºã ãå€§å¹ ã«ç°¡ç¥åãããŠãããšæ³å®ãããŸãã
ã©ãã§ãã¢ãŒãã§1ã€ã®ãã¹ãç»åãèªèããããã«1ã€ã®ã¹ããªãŒã ã«ç§»åããŠãçŽ100ç§éElbrusã§åäœããŸããïŒïŒïŒã
æåã«ãElbrus 4.4ã®16ã³ã¢ãã¹ãŠã䜿çšããããšããŸããã 16ã¹ã¬ãããã¹ãŠãå¹æçã«äœ¿çšããããšã¯ãããã°ã©ã ã®çŽ3åã®1ã§ã®ã¿å¯èœã§ããã æ®ãã®èšç®ã¯2ã€ã®ã¹ã¬ããã«äžŠååãããŸããã ãã®çµæãèªèæéã¯7.5ç§ã«ççž®ãããŸããã ã€ã³ã¹ãã¬ãŒã·ã§ã³ãåããŠããããã¡ã€ã©ãŒãèŠãŸããã é©ããããšã«ã次ã®ãããªãã®ãèŠãŸããã
ã¡ã€ã³ããã°ã©ã ã«ãŒãå ã«çŽ æŽãããå ŽæãããããšãããããŸããã
std::vector<Object> candidates; for (int16_t x = x_min; x < x_max; x += x_step) for (int16_t y = y_min; y < y_max; y += y_step) candidates.emplace_back(x, y, 0.0f);
ãã®ã³ãŒããç¹°ãè¿ãå®è¡ããçµæããã¯ãã«ã®ãµã€ãºãå€æŽãããªãŒããŒãããã³ã¹ãã¯å€§å¹ ã«å¢å ããèªèæéã®16ïŒ ã«éããŸãã ä»ã®ã¢ãŒããã¯ãã£ã§ã¯ããã®å Žæã¯ç®ç«ã¡ãŸããã§ããããElbrusã§ã¯ã¡ã¢ãªã®å²ãåœãŠãäºæ³å€ã«é ãããšãå€æããŸããã ãã®åä»ãªèŠèœãšããä¿®æ£ããåŸãåäœæéã¯ã»ãŒ1ç§ççž®ãããŸããã
次ã«ãåã¹ã¬ããïŒVLIWã®ã¡ã€ã³ãããããïŒå ã®åæå®è¡æ§ãåäžãããŸããã ãããè¡ãããã«ãæçãã¹-MCSTã®å°é家ã«ãã£ãŠæ¢ã«æé©åãããEMLã©ã€ãã©ãªã䜿çšããŸããã
é«æ§èœEMLã©ã€ãã©ãª
Elbrusã¢ãŒããã¯ãã£ã®ãã€ã¯ãããã»ããµçšã«ãEMLã©ã€ãã©ãªãéçºãããŸãããããã¯ãä¿¡å·ãç»åããããªãããã³æ°åŠé¢æ°ãšæŒç®ã®é«æ§èœåŠçã®ããã®ããŸããŸãªé¢æ°ã»ããããŠãŒã¶ãŒã«æäŸããã©ã€ãã©ãªã§ã[4ã6]ã
EMLã«ã¯ã次ã®æ©èœã°ã«ãŒããå«ãŸããŠããŸãã
- ãã¯ãã«-ããŒã¿ãã¯ãã«ïŒé åïŒãæäœããããã®é¢æ°ã
- 代æ°-ç·åœ¢ä»£æ°ã®é¢æ°ã
- ä¿¡å·-ä¿¡å·åŠçæ©èœã
- ç»å-ç»ååŠçæ©èœ;
- ãããª-ãããªåŠçæ©èœã
- ããªã¥ãŒã -äžæ¬¡å æ§é ã®å€æé¢æ°;
- ã°ã©ãã£ãã¯ã¹-å³åœ¢ãæç»ããããã®é¢æ°ã
EMLã©ã€ãã©ãªã¯ãC / C ++ã§æžãããããã°ã©ã ã§äœ¿çšããããšãç®çãšããŠããŸãã
äœã¬ãã«ã®ç»ååŠçé¢æ°ã¯ãEMLã§çŽæ¥ãµããŒãããããããã¯ãã«ïŒãã®å Žåã¯ç»åæååïŒãä»ããEMLã®åºæ¬çãªç®è¡é¢æ°ã§è¡šçŸã§ããŸãã
ããšãã°ã32ãããå®æ°ã®2ã€ã®é åã®èŠçŽ ããšã®å ç®ïŒ
for (int i = 0; i < len; ++i) dst[i] = src1[i] + src2[i];
EMLé¢æ°ã䜿çšããŠå®è¡ã§ããŸãã
eml_Status eml_Vector_Add_32F(const eml_32f *pSrc1, const eml_32f *pSrc2, eml_32f *pDst, eml_32s len)
ã©ãã§
-
pSrc1
第1ãªãã©ã³ãã®ãã¯ãã«ãžã®ãã€ã³ã¿ãŒ -
pSrc2
第2ãªãã©ã³ãã®ãã¯ãã«ãžã®ãã€ã³ã¿ãŒ -
pDst
çµæãã¯ãã«ãžã®ãã€ã³ã¿ãŒ -
len
ãã¯ãã«ã®èŠçŽ æ°
圌女ã¯æ»ããŸã
-
EML_OK
é¢æ°ãæ£åžžã«æ©èœããå Žå -
EML_INVALIDPARAMETER
ã¯ããã€ã³ã¿ãŒã®1ã€ãNULLã§ãããããã¯ãã«ã®é·ãã0以äžã§ããå Žåã
åèšã§ãeml_Statusåæã¯4ã€ã®å€ãåãããšãã§ããŸãã
-
EML_OK
ãšã©ãŒãªã -
EML_INVALIDPARAMETER
åŒæ°ãŸãã¯ç¯å²å€ -
EML_NOMEMORY
æäœçšã®ç©ºãã¡ã¢ãªããããŸãã -
EML_RUNTIMEERROR
ããŒã¿ãå®è¡äžã®ãšã©ãŒ
äž»ãªããŒã¿åãå®çŸ©ãããŠããŸãïŒ
typedef char eml_8s; typedef unsigned char eml_8u; typedef short eml_16s; typedef unsigned short eml_16u; typedef int eml_32s; typedef unsigned int eml_32u; typedef float eml_32f; typedef double eml_64f;
32ãããå®æ°ã®èŠçŽ ããšã®ä¹ç®ã®é¢æ°ãåæ§ã«é 眮ãããŸãã
eml_Status eml_Vector_Mul_32F(const eml_32f *pSrc1, const eml_32f *pSrc2, eml_32f *pDst, eml_32s len)
ãã ããæŽæ°ã®å Žåããã®ãããªæŒç®ãå®è¡ããèŠçŽ ããšã®å ç®ããã³ã·ããä¹ç®é¢æ°ã®ã¿ãå®çŸ©ãããŸãã
// Addition for (int i = 0; i < len; ++i) dst[i] = SATURATE((src1[i] + src2[i]) << shift); // Multiplication for (int i = 0; i < len; ++i) dst[i] = SATURATE((src1[i] * src2[i]) << shift);
ãããŠå®éã«ã¯EMLé¢æ°ïŒ
// int16_t addition eml_Status eml_Vector_AddShift_16S(const eml_16s *pSrc1, const eml_16s *pSrc2, eml_16s *pDst, eml_32s len, eml_32s shift) // int32_t addition eml_Status eml_Vector_AddShift_32S(const eml_32s *pSrc1, const eml_32s *pSrc2, eml_32s *pDst, eml_32s len, eml_32s shift) // uint8_t addition eml_Status eml_Vector_AddShift_8U(const eml_8u *pSrc1, const eml_8u *pSrc2, eml_8u *pDst, eml_32s len, eml_32s shift) // int16_t multiplication eml_Status eml_Vector_MulShift_16S(const eml_16s *pSrc1, const eml_16s *pSrc2, eml_16s *pDst, eml_32s len, eml_32s shift) // int32_t multiplication eml_Status eml_Vector_MulShift_32S(const eml_32s *pSrc1, const eml_32s *pSrc2, eml_32s *pDst, eml_32s len, eml_32s shift) // uint8_t multiplication eml_Status eml_Vector_MulShift_8U(const eml_8u *pSrc1, const eml_8u *pSrc2, eml_8u *pDst, eml_32s len, eml_32s shift)
ãã®ãããªé¢æ°ã¯ãããšãã°æŽæ°æŒç®ã«åœ¹ç«ã¡ãŸãã
EMLã¯ç»åã®æ§é ãå®çŸ©ããŸãïŒ
typedef struct { void * data; /**< */ eml_image_type type; /**< */ eml_32s width; /**< , x */ eml_32s height; /**< , y */ eml_32s stride; /**< */ eml_32s channels; /**< () */ eml_32s flags; /**< */ void * state; /**< */ eml_32s bitoffset;/**< */ eml_format format; /**< */ eml_8u addition[32 - 2 * sizeof (void *)]; /**< 64 */ } eml_image;
ç»åã§ãµããŒããããŠããeml_image_typeããŒã¿åïŒ
- EML_BIT-1ãããã®ç¬Šå·ãªãæŽæ°ããŒã¿
- EML_UCHAR-8ããã笊å·ãªãæŽæ°ããŒã¿
- EML_SHORT-16ããã笊å·ä»ãæŽæ°ããŒã¿
- EML_INT-32ããã笊å·ä»ãæŽæ°ããŒã¿
- EML_FLOAT-32ãããæµ®åå°æ°ç¹ããŒã¿
- EML_DOUBLE-64ãããã®æµ®åå°æ°ç¹ããŒã¿
- EML_USHORT-16ããã笊å·ãªãæŽæ°ããŒã¿
EMLã¯ãç»ååŠçã«å¿ èŠãªä»ã®æ©èœããµããŒãããŠããŸãã ããšãã°ãåé¢å¯èœãªãã£ã«ã¿ãŒã®å¹æçãªå®è£ ã«å¿ èŠãªè»¢çœ®é¢æ°ã¯æ¬¡ã®ãšããã§ãã
eml_Status eml_Image_FlipMain(const eml_image *pSrc, eml_image *pDst)
ãã®é¢æ°ã¯ãå ã®ç»åã®äžå¿ãçµæã®ç»åã®äžå¿ã«éãã転眮ãå®è¡ããŸãã 圌女ã®äœåã¯æ¬¡ã®åŒã§èª¬æã§ããŸãã
dst[width_dst/2 + (y - height_src/2), height_dst/2 + (x - width_src/2)] = src[x, y], x = [0, width-1], y = [0, height-1]
ç»åã¯åãããŒã¿åïŒ EML_UCHAR, EML_SHORT, EML_FLOAT EML_DOUBLE
ïŒã§ãããåããã£ãã«æ°ïŒ1ã3ããŸãã¯4ïŒã§ããå¿
èŠããããŸãã
å®éšãšçµæ
è¡š2ã¯ãããŸããŸãªããŒã¿åã®å ç®ãšä¹ç®ã®å®è¡æéã瀺ããŠããŸãã ãã®å®éšã§ã¯ãé·ã10 5 50ã®2ã€ã®é åã®å ç®/ä¹ç®ã®1000åã®å埩ã®å®è¡æéã枬å®ããåŸãããå€ããäžå€®å€ãåããŸããã ãã®è¡šã¯ã1åã®å埩ã®å¹³åå®è¡æéã瀺ããŠããŸãã EMLã䜿çšãããšãå®éã®32ãããæ°ãš8ããã笊å·ãªãæŽæ°ã®èšç®ãå€§å¹ ã«é«éåã§ããããšãããããŸãã ãããã®ããŒã¿åã¯æé©åãããç»ååŠçãã¹ã§é »ç¹ã«äœ¿çšããããããããã¯éèŠã§ãã
è¡š2.é·ã10 5ã®é åã®Elbrus 4.4ã«ããå ç®ãšä¹ç®ã®å®è¡æéã
è¿œå | ||
---|---|---|
ããŒã¿å | uint8_t | æµ®ã |
EMLãªããÎŒs | 16.7 | 148.8 |
EMLãÎŒs | 8.0 | 83.6 |
ä¹ç® | ||
---|---|---|
ããŒã¿å | uint8_t | æµ®ã |
EMLãªããÎŒs | 31.4 | 108.9 |
EMLãÎŒs | 27.6 | 73.5 |
次ã«ãEMLãç»åã§ã©ã®ããã«æ©èœãããã確èªãã転眮ã調ã¹ãŸãããããã¯ãç»ååŠçã§ããªãäžè¬çãªæäœã§ããããã§ãã ããŸããŸãªã¿ã€ãã®æ£æ¹åœ¢ç»åã®è»¢çœ®æéã®ãµã€ãºäŸåæ§ïŒ
EMLãuint8_tããã³floatåã®åªããå éã瀺ããŠããããšãããããŸãã
ãã¹ããŒãèªèããã°ã©ã ïŒãã¹ãã€ã¡ãŒãžããšããŠã§ã¢ã¢ãŒãïŒãé«éåããçµæãè¡š3ã«ç€ºããŸãããããã¯ããšã«ãã«ã¹ãšã®å ±åäœæ¥ã®æåã®3ãæã§åŸããããã®ã§ããããã¡ãããã·ã¹ãã ã®æé©åã«åãçµãäºå®ã§ãã
è¡š3. Elbrus 4.4ã®ãã¹ããŒãèªèããã°ã©ã ã®æé©åããã»ã¹ã
ããŒãžã§ã³ | åŽåæéãs |
---|---|
1ã¹ã¬ãã | ã100 |
16ã¹ã¬ãããO3 | 6.2 |
16ã¹ã¬ãããO4 | 5.4 |
16ã¹ããªãŒã ãO4ããã©ã³ã¹ããŒãºïŒEMLïŒ | 5.0 |
16ã¹ããªãŒã ãO4ã転眮ãè¡åæŒç®ïŒEMLïŒ | 4.5 |
16ã¹ããªãŒã ãO4ã転眮ãè¡åæŒç®ãç®è¡æŒç®ïŒEMLïŒ | 3.4 |
æé©åãããããŒãžã§ã³ã®åäœæéãæšå®ããããã«ãåã¢ãŒãã®1000å ¥åç»åãããã®åäœæéãåæããŸããã è¡š4ã«ããšããŠã§ã¢ã¢ãŒããšã¢ãã€ã«ã¢ãŒãã§ã®1ãã¬ãŒã ã®æå°ãæ倧ãããã³å¹³åèªèæéã瀺ããŸãã
è¡š4. Elbrus 4.4ã§ã®ãã¹ããŒãèªèã®å¶æ¥æéã
ã¢ãŒã | æå°æéãs | æ倧æéãs | å¹³åæéãs |
---|---|---|---|
ã©ãã§ã | 0.9 | 8.5 | 2.2 |
ã¢ãã€ã« | 0.2 | 1.5 | 0.6 |
ã€ã³ãã«ãARMãšããã©ãŒãã³ã¹ãæ¯èŒããŸããã§ããããããã®ããã»ããµãŒåãã«ã©ã€ãã©ãªãæé©åããã®ã«æ°å¹ŽããããŸãããããã3ãæã®æäœã§ä»ããæ¯èŒãè¡ãã®ã¯æ£ãããããŸããã
ãããã«
ãã®èšäºã§ã¯ãElbrusã®ãããªçããã¢ãŒããã¯ãã£ã«ããã°ã©ã ã移æ€ããçµéšãå ±æããããšããŸããã ãããã¯ç¢ºãã«ç§ãã¡ã«ã¯èµ·ããããªãããšã§ãïŒãç§ãã¡ã¯ããã€ãã®ã¿ã€ãã®ããã°ã©ã ãšã©ãŒãè°è«ããŠèããŸãããã誰ãæããªééãããå®å šã§ã¯ãããŸããã Elbrusãã©ãããã©ãŒã ã䜿çšããããšã§ãã³ãŒãå ã®å°ãªããšã2ã€ã®åé¡ã®ããå ŽæãèŠã€ããããšãã§ãããããã¡ãŒã«ãŒã®çŽæãæºãããããšèŠãªãããšãã§ããŸãã
ãããæ°ãæã§ãæ£ããèªèäœæ¥ãéæã§ããã ãã§ãªããElbrusã®ã·ã¹ãã ãå€§å¹ ã«é«éåããããšãã§ããŸããã Elbrus 4.4ãšx86ã®ãã¹ããŒãèªèããã°ã©ã ã®ããã©ãŒãã³ã¹ã¯æ¡éãã«ç°ãªããéåžžã«è¯ãçµæã§ãã ãããŠãç§ãã¡ã¯ããã§åæ¢ããã€ããã¯ãããŸããã ããã§ãå€§å¹ ã«æ¹åã§ãããšèããŠããŸãã
ããã¯ãã¹ãŠããšã«ãã©ã¹ãžã®æ ã®æåã®ã¹ããããéåžžã«æåãããšã¿ãªããããšãæå³ããŸãïŒ
ããŒããŠã§ã¢ãã©ãããã©ãŒã ãæäŸããŠãããMCST瀟ãšãã®åŸæ¥å¡ãããã³ã¢ãŒããã¯ãã£ãšæé©åã«é¢ããã¢ããã€ã¹ã«æè¬ããŸãã
䜿çšãããœãŒã¹
[1] A.K. ãã ãI.Nã Bychkov et alãä»æ¥ã®å»ºç¯ã©ã€ã³ããšã«ãã©ã¹ãïŒãã€ã¯ãããã»ããµãã³ã³ãã¥ãŒã¿ãŒã·ã¹ãã ããœãããŠã§ã¢//çŸä»£ã®æ
å ±æè¡ãšITæè²ã ã¬ããŒãã®åéãpã 21â29ã
[2] A.K. ãã ã ãã·ã¢ã®æ±çšãã€ã¯ãããã»ããµãšé«æ§èœã³ã³ãã¥ãŒãã£ã³ã°ã·ã¹ãã ïŒçµæãšå°æ¥ã®å±æã ç¡ç·é»åæ©åšã·ãªãŒãºEVTã®è³ªåãTã3ãpã 2012幎5æ13æ¥ã
[3] A.K. ãã ãšI.N. ããã³ãã ããœã³ã³ããµãŒããŒãã¹ãŒããŒã³ã³ãã¥ãŒã¿ãŒåãã®ãã·ã¢ã®ãšã«ãã«ã¹æè¡ã
[4] V.S. Volin et alãElbrusãã¡ããªãŒã®ãã€ã¯ãããã»ããµãšã³ã³ãã¥ãŒãã£ã³ã°ã·ã¹ãã ã åŠç¿ã¬ã€ãã ããŒã¿ãŒã2013幎ã
[5] Eigenãç·åœ¢ä»£æ°çšã®C ++ãã³ãã¬ãŒãã©ã€ãã©ãªïŒè¡åããã¯ãã«ãæ°å€ãœã«ããŒãããã³é¢é£ã¢ã«ãŽãªãºã ã httpïŒ//eigen.tuxfamily.org
[6] P.A. ã€ã·ã³ãV.Eã Loginovãããã³P.P. ãŽã¡ã·ãªãšãã Elbrusã¢ãŒããã¯ãã£åãã®é«æ§èœæ°åŠããã³ãã«ãã¡ãã£ã¢ã©ã€ãã©ãªã䜿çšããã³ã³ãã¥ãŒãã£ã³ã°ãé«éåããŸãã