ÔÚÏÖ´úÈí¼þ¿ª·¢ÖУ¬ÐÔÄÜÒ»Ö±ÊÇ×·Çó¼«ÖµÄÄ¿µÄ£¬ÌØÊâÊÇÔÚϵͳ¼¶±à³ÌÁìÓò£¬µ×²ãµÄÓ²¼þ²Ù×÷±äµÃÓÈΪÖ÷Òª¡£Rust×÷ΪһÃÅÇ¿µ÷Çå¾²ºÍÐÔÄܵÄϵͳ¼¶ÓïÑÔ£¬ÌṩÁËÒ»ÏîǿʢµÄÌØÕ÷¡ª¡ªÄÚÁª»ã±à£¨InlineAssembly£©£¬ÉÁ¿ª·¢Õß¿ÉÒÔÖ±½Ó²åÈë´¦Öóͷ£Æ÷¼¶Ö¸Á¾ÙÐÐ×îµ×²ãµÄÓ²¼þ½»»¥¡£
¼òÆÓÀ´Ëµ£¬ÄÚÁª»ã±àÔÊÐíÄãÔÚRust´úÂëÖÐǶÈë´¦Öóͷ£Æ÷Ö¸Á¼´»ã±à´úÂ룩£¬ÒÔʵÏÖÄ³Ð©ÌØ¶¨²Ù×÷£¬ºÃ±È¸ßÐÔÄܵÄÊýѧÔËËã¡¢ÌØ¶¨Ó²¼þ¿ØÖÆ»òÓÅ»¯µÈ¡£ÕâÖÖÊÖÒÕÔڹŰåµÄC»òC++ÖÐÔçÒÑÆÕ±éʹÓ㬵«ÔÚRustÖУ¬ËüÌåÏÖ³öRust¶ÔÐÔÄܵļ«ÖÂ×·Çó£¬Í¬Ê±Ò²´øÀ´¸ü¸ßµÄ¿ØÖÆÁ¦¡£
ÔÚÐí¶àÐÔÄÜÃô¸ÐµÄ³¡¾°£¬Í¨Ë×µÄRust´úÂë¿ÉÄÜÎÞ·¨Öª×ãÐèÇ󡣺ñȣº
ÐèÒªÖ±½Ó²Ù×÷Ó²¼þ¼Ä´æÆ÷£¬ºÃ±ÈGPU¡¢ÍøÂ翨µÈÓ²¼þ×°±¸¡£¾ÙÐеײãµÄÐÔÄÜÓÅ»¯£¬Ê¹ÓÃÌØ¶¨µÄCPUÖ¸Á£¨ÈçSSE¡¢AVX£©ÌáÉýÊýѧÔËËãËÙÂÊ¡£ÊµÏÖÌØÊâµÄËã·¨»òÐÒ飬ÕâЩ¿ÉÄÜÐèҪʹÓÃÌØ¶¨µÄÖ¸Áî»ò¼Ä´æÆ÷¡£
RustÔÚ2021Äê×óÓÒÒýÈëÁ˹ٷ½Ö§³ÖµÄÄÚÁª»ã±à£¬Í¨¹ýasm!ºêʵÏÖ¡£ÕâÓëCÖеÄasm»ò__asm__Òªº¦×ÖÀàËÆ£¬µ«Óï·¨Ô½·¢Çå¾²ºÍÏÖ´ú¡£
usestd::arch::asm;fnmain(){letmutresult:u32;unsafe{asm!("mov{0},42",out(reg)result);}println!("Ч¹ûÊÇ£º{}",result);}
ÕâÀasm!ºêÔÊÐíÄãдÈë»ã±àÖ¸Á½«Öµ¸³¸ø±äÁ¿»ò¾ÙÐÐÆäËû²Ù×÷¡£Òª×¢ÖØ£¬Õâ¸öºêÖ»ÔÚunsafe¿éÄÚʹÓã¬ÓÉÓÚÉæ¼°¾¿¾¹²ã²Ù×÷ºÍDZÔڵIJ»Çå¾²ÐÐΪ¡£
ËäÈ»ÄÚÁª»ã±àÌṩÁ˼«´óµÄ¿ØÖÆÁ¦£¬µ«Ò²´øÀ´ÁËDZÔÚµÄΣº¦£º
´úÂë¿ÉÒÆÖ²ÐÔ½µµÍ£º²î±ðÓ²¼þ»ò¼Ü¹¹¿ÉÄܲ»Ö§³ÖÏàͬµÄÖ¸Áά»¤ÄѶÈÔöÌí£º»ã±à´úÂëÏà¹ØÓÚRust¸üÄÑÃ÷È·ºÍά»¤¡£¿ÉÄÜÒýÈëδ½ç˵ÐÐΪ£º²»×¼È·µÄʹÓûᵼÖ³ÌÐò±ÀÀ£»òÇå¾²Îó²î¡£
Òò´Ë£¬Ö»ÓÐÔÚÃ÷È·ÐèҪʱ²ÅʹÓÃÄÚÁª»ã±à£¬Ò²±ØÐè¶ÔÓ²¼þ¼Ü¹¹ºÍ»ã±àÓïÑÔÓÐÒ»¶¨Ã÷È·¡£
Rust¹Ù·½ºÍÉçÇø¶¼ÌṩÁ˸»ºñµÄÀý×Ó×ÊÖú¿ª·¢Õßѧϰ¡£ÀýÈ磬ʹÓÃÄÚÁª»ã±àʵÏÖ¿ìËÙµÄÊýÖµÅÌË㣬¼ì²âÓ²¼þÌØÕ÷£¬»òÕß¾ÙÐÐÌØ¶¨µÄÓÅ»¯¡£
Ò»¸ö¼òÆÓµÄʾÀý£¬ÓÃÓÚÅÌËãÁ½¸öÊýµÄºÍ£¨ÏÖʵÉÏ¿ÉÒÔÓÃͨË׵ļӷ¨Ìæ»»£¬µ«¿ÉÒÔ×÷ΪѧϰÊ÷Ä££©£º
usestd::arch::asm;fnmain(){leta:u32=10;letb:u32=20;letmutsum:u32;unsafe{asm!("add{0},{1}",inout(reg)a=>sum,in(reg)b,);}println!("Á½ÊýÖ®ºÍ£º{}",sum);}
Õâ¸öÀý×ÓÕ¹ÏÖÁËÔõÑù½«»ã±àÖ¸ÁîǶÈëµ½RustÖУ¬Í¬Ê±Ê¹ÓüĴæÆ÷¾ÙÐÐÊý¾Ýת´ï£¬¼«´óµØÌá¸ßÁË´úÂëµÄµ×²ã²Ù¿ØÄÜÁ¦¡£
Ëæ×ÅÓ²¼þºÍ±àÒëÆ÷µÄÒ»Ö±Éú³¤£¬ÄÚÁª»ã±àÔÚRustÖеÄְλҲÖð½¥ÌáÉý¡£Î´À´¿ÉÄ᷺ܻÆð¸ü¶àÓÅ»¯¹¤¾ß£¬×Ô¶¯ÌìÉú¼«Æä¸ßЧµÄ»ã±à´úÂ룬»òÕßͨ¹ýÓ²¼þ¼ì²â¶¯Ì¬Ñ¡Ôñ×î¼ÑÖ¸Á¡£
Ëæ×ÅWebAssembly¡¢GPUµÈÐÂÐËÊÖÒÕµÄÉú³¤£¬½«µ×²ãµÄÓ²¼þ²Ù×÷ÈÚÈëµ½Çå¾²¡¢ÁýͳµÄ¸ß²ãÓïÑÔÖУ¬³ÉΪϵͳÓÅ»¯µÄÖ÷ҪƫÏò¡£RustµÄÄÚÁª»ã±à¹¦Ð§£¬ÎÞÒÉÊÇÔÚÕⳡÀå¸ïÖеÄÖ÷Òª×é³É²¿·Ö¡£
¾ÓÉÉÏÃæµÄ»ù´¡ÏÈÈÝ£¬»òÐíÄã¶ÔÄÚÁª»ã±àµÄDZÁ¦ÒÑÔ¾Ô¾ÓûÊÔ£¬µ«ÏÖʵӦÓÃÖÐÈÔÈ»ÃæÁÙһЩÒÉÎÊ£ºÔõÑù²Å»ª¸ßЧ¡¢Çå¾²µØÊ¹ÓÃËü£¿´ÓÏîĿʵ¼ùµ½ÓÅ»¯¼¼ÇÉ£¬ÖÜÈ«ÆÊÎöÔõÑùÔÚRustÀïÍæ×ªÄÚÁª»ã±à¡£
²»ÊÇʲô²Ù×÷¶¼ÊÊÊÊÓÃÄÚÁª»ã±à¡£ÓÅÒìµÄ³ÌÐòÔ±Ã÷È·¡°Ó̵̮äËù¡±£¬³£¼ûµÄÓ¦Óó¡¾°°üÀ¨£º
ÐÔÄÜÒªº¦µÄÊýѧÅÌË㣺ºÃ±È¾ØÕó³Ë·¨¡¢Í¼Ïñ´¦Öóͷ£µÈ£¬¿ÉÒÔʹÓÃSSE¡¢AVXÖ¸ÁʵÏÖÏòÁ¿»¯²Ù×÷¡£Ó²¼þ×°±¸¿ØÖÆ£º²Ù×÷µ×²ãÓ²¼þ¼Ä´æÆ÷¡¢ÊµÏÖ×Ô½ç˵ͨѶÐÒ顣ʵÏÖÌØÊâËã·¨£ººÃ±È¼ÓÃÜ¡¢½âÂëµÈ¶ÔËÙÂÊÒªÇ󼫸ߵÄʹÃü¡£¼ì²âÓ²¼þÌØÕ÷£ºÊ¹ÓÃis_x86_feature_detected!ºêÈ·ÈÏCPUÖ§³ÖÄÄЩÀ©Õ¹Ö¸Áî¡£
·â×°ÖØÓý«ÄÚÁª»ã±à·â×°³ÉСÐͺ¯Êý»òºê£¬½µµÍά»¤ÄѶȡ£ºÃ±È£ºunsafefnadd_vectors(a:u64,b:u64)->u64{letresult;asm!("add{0},{1}",inout(reg)a=>result,in(reg)b);result}
ʹÓÃÓ²¼þ¼ÓËÙÖ¸ÁîÆ¾Ö¤Ä¿µÄ¼Ü¹¹Ñ¡Ôñ¶ÔÓ¦µÄÖ¸Á£¬ºÃ±ÈAVX2¡¢SSE4£¬¿ÉÒÔ¼«´óÌáÉýÐÔÄÜ¡£
È·±£Çå¾²ÐÔÔÚʹÓûã±àʱ£¬ÒªÈ·±£Êý¾Ý׼ȷ¡¢¼Ä´æÆ÷²»±»ÎÛȾ¡£Ê¹ÓÃvolatile±ê¼Ç×èÖ¹Ö¸Áî±»ÖØÅÅÐò£¬°ü¹ÜÖ´ÐÐ˳Ðò¡£
asm!("...",options(nostack,preserves_flags,readonly));µ÷ÊÔÓë²âÊÔÓÉÓÚ»ã±à´úÂëÄÑÒÔµ÷ÊÔ£¬½¨ÒéÖð²½±àд£¬Á¬Ïµ¹¤¾ßÈçGDB»òÓ²¼þ·ÂÕæ£¬È·±£Ã¿¸öÖ¸ÁîµÄ׼ȷÐÔ¡£
ÐÔÄÜÆÊÎö£ºÊ¹ÓÃperf¡¢IntelVTuneµÈ¹¤¾ßÕÒ³öÆ¿¾±£¬È»ºóÓÃÄÚÁª»ã±àÓÅ»¯¶ÔÓ¦µÄÈÈÃÅ¡£×Ô¶¯ÏòÁ¿»¯£ºÁ¬ÏµRustµÄsimd¿â»òÊÖдÄÚÁª»ã±àʵÏÖÏòÁ¿»¯²Ù×÷¡£Ó²¼þ¼ì²â£ºÊ¹ÓÃÖîÈçcore::archÀïµÄÌØÕ÷¼ì²âAPI£¬ÖÇÄÜÇл»Ö¸Á¡£
¼æÈÝÐÔÎÊÌ⣺²î±ðCPUÖ§³Ö²î±ðµÄÖ¸Á¡£¿ÉÒÔÓÃis_x86_feature_detected!Ìáǰ¼ì²â¡£´úÂëÖØÆ¯ºó£ºÄÚÁª»ã±àÄÑÒÔά»¤¡£½¨ÒéÓë´¿Rust´úÂëÁ¬Ïµ£¬Ö»ÔÚÐÔÄÜÆ¿¾±²¿·ÖʹÓ㬼á³ÖÕûÌåÇåÎú¡£
¹Ù·½Ê¾ÀýÃãÀø¿ª·¢ÕßʵÑéͨ¹ýÄÚÁª»ã±àʵÏÖÐÔÄÜÓÅ»¯¡£Õâ²»µ«ÊǶÔÓ²¼þµÄÉî¶ÈÃ÷È·£¬Ò²ÊÇÊÖÒÕÉú³¤µÄÖ÷Òª°ì·¨¡£ºÃ±È£¬×î»ù´¡µÄ¡°¿ìËÙÇóºÍ¡±Ö»ÊÇÈëÃÅ£¬ÕæÕýµÄÌôÕ½ÔÚÓÚʵÏֵײãÓ²¼þ½»»¥£¬ºÃ±ÈÓûã±àʵÏÖHamming¾àÀë¡¢¿ìËÙ¸µÀïÒ¶±ä»»£¨FFT£©µÈ¡£
Ëæ×ÅÓ²¼þÊÖÒÕµÄÒ»Ö±Ñݽø£¬ÄÚÁª»ã±àµÄÓ¦ÓÃÔ¶¾°Ò²Ô½À´Ô½¿íÀ«¡£Î´À´»òÐí»á·ºÆð×Ô¶¯»¯ÌìÉú¸ßЧ»ã±àµÄAI¸¨Öú¹¤¾ß£¬ÕæÕýʵÏÖ¡°Ó²¼þ¼´Èí¼þ¡±µÄÀíÄî¡£¶øRust×÷ΪһÃÅÇå¾²¸ßЧµÄÓïÑÔ£¬½«ÔÚÕⳡÀå¸ïÖÐÊÎÑÝÒªº¦½ÇÉ«¡£