{"id":117433,"date":"2026-10-24T20:08:25","date_gmt":"2026-10-24T12:08:25","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/117433.html"},"modified":"2026-10-24T20:08:25","modified_gmt":"2026-10-24T12:08:25","slug":"kestrel_vllm-18-%c2%b7-%e6%8a%95%e6%9c%ba%e8%a7%a3%e7%a0%81%e4%bd%8d%e7%ba%a7%e5%af%b9%e6%8b%8d%e6%94%b6%e5%8f%a3%ef%bc%9abatch-%e4%b8%8e-m1-%e4%b8%80%e8%87%b4%ef%bc%8c%e6%b3%a8%e6%84%8f%e5%8a%9b","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/117433.html","title":{"rendered":"Kestrel_VLLM - 18 \u00b7 \u6295\u673a\u89e3\u7801\u4f4d\u7ea7\u5bf9\u62cd\u6536\u53e3\uff1abatch \u4e0e M=1 \u4e00\u81f4\uff0c\u6ce8\u610f\u529b\u8def\u5f84\u4e0e CPU \u9010\u5b57\u8282\u5bf9\u9f50"},"content":{"rendered":"<h2>18 \u00b7 \u6295\u673a\u89e3\u7801\u4f4d\u7ea7\u5bf9\u62cd\u6536\u53e3&#xff1a;batch \u4e0e M&#061;1 \u4e00\u81f4&#xff0c;\u6ce8\u610f\u529b\u8def\u5f84\u4e0e CPU \u9010\u5b57\u8282\u5bf9\u9f50<\/h2>\n<p>\u4e00\u53e5\u8bdd&#xff1a;\u628a\u300cM&gt;1 batch verify \u4e0e M&#061;1 decode\u300d\u7684\u5bf9\u62cd\u4ece top-1 \u4e0b\u6c89\u5230\u5b8c\u6574 logits \u9010\u5b57\u8282&#xff0c;\u7ea0\u6b63\u4e00\u5904 64-token \u957f\u5e8f\u5217\u7684\u8bef\u8bfb&#xff0c;\u5e76\u628a CPU\u2194GPU \u7684\u5206\u6b67\u4e00\u8def\u6d88\u5230 layer 0 \u7684 MoE FFN \u4e3a\u6b62\u2014\u2014\u5c42 0 \u6574\u6761\u6ce8\u610f\u529b\u8def\u5f84&#xff08;RMSNorm \u2192 QKV GEMM \u2192 QK-norm \u2192 RoPE \u2192 KV \u91cf\u5316 \u2192 attention \u2192 O \u6295\u5f71&#043;\u6b8b\u5dee&#xff09;\u5df2\u4e0e CPU \u9010\u4f4d\u5168\u7b49\u3002 \u524d\u7f6e&#xff1a;\u5efa\u8bae\u5148\u8bfb \u7b2c 16 \u7bc7&#xff08;batch verify \u7684 top-1 \u4f4d\u7ea7\u4e00\u81f4&#xff09;\u3002 \u73af\u5883&#xff1a;x86-64 &#043; NVIDIA RTX 5090&#xff08;CUDA \u540e\u7aef&#xff09;\u00b7 Qwen3-30B-A3B q4local \u00b7 \u5f00\u5173 VLLM_CUDA_ATTN_BITEXACT&#061;1 \/ VLLM_CUDA_L2EXACT&#061;1&#xff08;\u4f4d\u7ea7\u6863&#xff0c;opt-in&#xff09;\u3002<\/p>\n<h3>\u4e00\u3001\u95ee\u9898\u4e0e\u7ed3\u8bba<\/h3>\n<li>batch verify \u4e0e M&#061;1 \u4f4d\u7ea7\u4e00\u81f4\u6210\u7acb&#xff1a;ISODIFF \u63a2\u9488&#xff08;\u5b8c\u6574 logits \u6309 uint32 \u9010\u5b57\u8282\u6bd4&#xff09;\u5168\u5217 ndiff&#061;0&#xff0c;\u8986\u76d6 pos 33\u201338\u3002<\/li>\n<li>\u300ctoken 58 \u7ffb\u8f6c\u300d\u662f\u8bef\u8bfb&#xff1a;\u7eaf CPU \u53c2\u8003 token58&#061;101128&#xff0c;\u4e0e GPU \u8f93\u51fa\u4e00\u81f4&#xff1b;\u6b64\u524d\u5f53\u4f5c\u300c\u53c2\u8003\u300d\u7684 81167 \u5176\u5b9e\u662f token21\u3002<\/li>\n<li>\u552f\u4e00\u771f\u5b9e\u5206\u6b67\u5728 t&#061;27&#xff08;GPU&#061;1773 vs CPU&#061;3837&#xff09;&#xff0c;\u975e spec \u5f15\u5165\u2014\u2014\u7eaf GPU greedy \u540c\u6837 1773&#xff1b;\u9694\u79bb\u5bf9\u7167\u5b9a\u4f4d\u5230 CUDA attention\u3002<\/li>\n<li>\u8be5\u5206\u6b67\u5df2\u5f7b\u5e95\u6d88\u9664&#xff1a;\u628a attention \u7684\u7b97\u5b50\u987a\u5e8f\u5bf9\u9f50 CPU &#043; \u4f4d\u7ea7\u590d\u523b UCRT \u7684 expf \u540e&#xff0c;CPU\u2194CUDA \u9010 token \u4f4d\u7ea7\u4e00\u81f4&#xff08;64\/64&#xff09;\u3002\u4f4d\u7ea7\u8def\u5f84 opt-in&#xff08;VLLM_CUDA_ATTN_BITEXACT&#061;1&#xff09;&#xff0c;\u4ee3\u4ef7 2.25\u00d7\u3002<\/li>\n<li>L2 \u5b8c\u6574\u6a21\u578b harness&#xff08;\u9010\u5c42 hidden &#043; \u5b8c\u6574 logits &#043; KV \u884c\u54c8\u5e0c&#xff09;\u5df2\u53ef\u7528&#xff1a;CPU \u4e0e CUDA \u4e24\u4fa7\u540c\u4e00\u6279 key \u7684 FNV-1a 64 \u54c8\u5e0c&#xff08;VLLM_L2_DUMP&#xff09;&#xff0c;2120 key \u4e00\u6b21\u8dd1\u5b8c&#xff0c;diff \u5373\u5f97\u9996\u4e2a\u5dee\u5f02\u70b9\u3002<\/li>\n<li>\u5168 GPU decode \u7684\u5c42 0 \u6ce8\u610f\u529b\u8def\u5f84\u5df2\u9010\u4f4d\u5168\u7b49&#xff1a;\u5728 VLLM_CUDA_L2EXACT&#061;1 \u6863\u4e0b&#xff0c;_nrm \/ _kraw \/ _knorm \/ _k \/ _ks \/ _v \/ _vs \/ _qrope \/ _attn \/ _ores \u5341\u4e2a\u63a2\u9488\u5168\u90e8\u4e0e\u7eaf CPU \u53c2\u8003\u9010\u5b57\u8282\u4e00\u81f4&#xff08;\u542b RoPE \u7684 cosf\/sinf \u4e0e attention \u7684 expf&#xff0c;\u5747\u5df2\u4f4d\u7ea7\u590d\u523b UCRT&#xff09;\u3002\u552f\u4e00\u5269\u9879\u662f layer 0 \u7684 MoE FFN \u8f93\u51fa _x&#xff08;\u89c1\u7b2c\u4e94\u8282&#xff0c;\u5df2\u5728 \u7b2c 22 \u7bc7 \u6536\u53e3&#xff09;\u3002<\/li>\n<p>\u72b6\u6001&#xff1a;\u6ce8\u610f\u529b\u8def\u5f84 \u2705 \u4f4d\u7ea7\u5168\u7b49&#xff08;opt-in \u6863&#xff09;&#xff1b;MoE FFN \u5728\u672c\u7bc7\u4ecd \u274c \u672a\u5bf9\u9f50&#xff08;\u5df2\u767b\u8bb0&#xff0c;\u4e0b\u4e00\u7bc7\u6536\u53e3&#xff09;\u3002<\/p>\n<h3>\u4e8c\u3001\u80cc\u666f&#xff1a;\u4e3a\u4ec0\u4e48 top-1 \u5bf9\u62cd\u4e0d\u591f<\/h3>\n<p>\u7b2c 16 \u7bc7 \u53ea\u5bf9\u62cd\u4e86 top-1&#xff08;[SPECTOP1]\/[ISOTOP1]&#xff09;\u3002top-1 \u76f8\u540c\u4e0d\u6784\u6210\u4f4d\u7ea7\u8bc1\u660e&#xff1a;\u4ed3\u5e93\u65b9\u6cd5\u8bba\u7684\u300c\u4f4d\u7ea7\u95e8\u7981\u300d\u539f\u5219\u8bf4\u5f97\u76f4\u767d\u2014\u2014\u4e24\u4e2a logits \u53ef\u80fd\u5728 top-1 \u4e4b\u5916\u6709 ULP \u5dee&#xff0c;\u53ea\u5728\u8fb9\u754c token \u5904\u7ffb top-1\u3002\u4e8e\u662f\u672c\u7bc7\u52a0 [ISODIFF] \u63a2\u9488&#xff1a;batch \u5217 j \u7684\u5b8c\u6574 logits \u4e0e\u300c\u540c token \u987a\u5e8f M&#061;1 decode\u300d\u9010 uint32 \u5b57\u8282\u6bd4&#xff0c;\u62a5\u7b2c\u4e00\u4e2a\u975e\u96f6 ULP \u5dee\u7684\u4f4d\u7f6e\u3002<\/p>\n<p>[SPECTOP1] pos&#061;33 col&#061;0 top1&#061;99692   [ISOTOP1] col&#061;0 99692   [ISODIFF] col&#061;0 ndiff&#061;0<br \/>\n[SPECTOP1] pos&#061;33 col&#061;1 top1&#061;99371   [ISOTOP1] col&#061;1 99371   [ISODIFF] col&#061;1 ndiff&#061;0<br \/>\n&#8230;&#xff08;pos 33\u201338&#xff0c;col 0\u20134 \u5168 ndiff&#061;0&#xff09;<\/p>\n<p>\u2192 batch \u5217\u4e0e\u987a\u5e8f M&#061;1 \u7684\u5b8c\u6574 logits \u9010\u5b57\u8282\u76f8\u540c&#xff0c;\u4f4d\u7ea7\u4e00\u81f4\u6210\u7acb\u3002<\/p>\n<h3>\u4e09\u3001\u6838\u5fc3\u673a\u5236<\/h3>\n<h4>3.1 \u8bef\u8bfb\u7ea0\u6b63&#xff1a;token 58 \u4e0d\u662f\u7ffb\u8f6c<\/h4>\n<p>\u5b9e\u6d4b&#xff1a;<\/p>\n<table>\n<tr>\u4f4d\u7f6e\u7eaf CPU \u53c2\u8003&#xff08;cpuref64&#xff09;GPU&#xff08;spec&#xff09;\u5224\u5b9a<\/tr>\n<tbody>\n<tr>\n<td>token21<\/td>\n<td>81167<\/td>\n<td>81167<\/td>\n<td>\u2713<\/td>\n<\/tr>\n<tr>\n<td>token58<\/td>\n<td>101128<\/td>\n<td>101128<\/td>\n<td>\u2713<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u300c\u53c2\u8003 81167\u300d\u662f token21 \u7684\u503c\u3002token58 \u4e24\u8fb9\u4e00\u81f4&#xff0c;\u4e0d\u5b58\u5728\u7ffb\u8f6c\u3002<\/p>\n<h4>3.2 \u552f\u4e00\u771f\u5b9e\u5206\u6b67&#xff1a;t&#061;27&#xff0c;\u6e90\u5728 CUDA attention<\/h4>\n<p>\u5b9e\u6d4b&#xff1a;<\/p>\n<table>\n<tr>\u4f4d\u7f6e\u7eaf CPU \u53c2\u8003GPU&#xff08;spec \/ \u7eaf greedy&#xff09;<\/tr>\n<tbody>\n<tr>\n<td>t&#061;26<\/td>\n<td>33071<\/td>\n<td>33071<\/td>\n<\/tr>\n<tr>\n<td>t&#061;27<\/td>\n<td>3837<\/td>\n<td>1773<\/td>\n<\/tr>\n<tr>\n<td>t&#061;28<\/td>\n<td>87267<\/td>\n<td>87267<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u9694\u79bb\u5bf9\u7167&#xff08;MoE\/lm_head \u5168\u7559 CPU&#xff0c;\u5b9e\u6d4b&#xff09;&#xff1a;<\/p>\n<table>\n<tr>\u914d\u7f6et&#061;27\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td>\u7eaf CPU<\/td>\n<td>3837<\/td>\n<td>\u57fa\u7ebf<\/td>\n<\/tr>\n<tr>\n<td>VLLM_CUDA_ATTN&#061;1&#xff08;\u4ec5 attention \u4e0a GPU&#xff09;<\/td>\n<td>1773<\/td>\n<td>\u590d\u73b0\u5206\u6b67<\/td>\n<\/tr>\n<tr>\n<td>VLLM_CUDA_INFER&#061;1&#xff08;\u4ec5 GEMM \u4e0a GPU&#xff09;<\/td>\n<td>\u2014&#xff08;t&#061;24 \u5df2\u5148\u53d1\u6563&#xff09;<\/td>\n<td>\u53e6\u4e00\u6761\u8def\u5f84<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u2192 \u5206\u6b67\u6e90\u662f CUDA attention&#xff0c;\u4e0d\u662f MoE GEMM&#xff0c;\u4e5f\u4e0d\u662f batch verify\u3002<\/p>\n<p>\u5bf9\u62cd\u53e3\u5f84\u4e0a\u7684\u5224\u5b9a&#xff1a;<\/p>\n<ul>\n<li>batch verify vs M&#061;1&#xff08;\u540c\u4e3a CUDA&#xff09;&#xff1a;ndiff&#061;0&#xff0c;\u4f4d\u7ea7\u4e00\u81f4\u2014\u2014\u6295\u673a\u6b63\u786e\u6027\u7ea2\u7ebf\u4e0d\u7834\u3002<\/li>\n<li>CPU\u2194GPU&#xff1a;\u672c\u7bc7\u4e4b\u524d\u662f greedy \u7ea7&#xff08;\u8de8\u786c\u4ef6 ULP \u5dee&#xff09;\u3002\u672c\u7bc7\u628a\u5b83\u63d0\u5347\u5230\u4f4d\u7ea7&#xff08;opt-in&#xff09;\u3002<\/li>\n<\/ul>\n<h4>3.3 \u6d88\u9664 t&#061;27&#xff1a;\u9006\u5411 UCRT \u7684 expf<\/h4>\n<p>\u7b2c\u4e00\u6b65&#xff1a;\u7b97\u5b50\u987a\u5e8f\u5bf9\u9f50&#xff08;\u4e0d\u591f&#xff09;\u3002 \u65e2\u6709 k_attn_decode_f32q \u662f\u4e24\u904d softmax&#xff08;\u5168\u5c40 max \u2192 exp \u2192 \u5e76\u884c\u5f52\u7ea6\u6c42\u548c&#xff09;&#xff0c;\u5f52\u7ea6\u6811\u6c42\u548c\u5e8f\u4e0e CPU \u7684 online softmax \u4e0d\u540c\u3002\u65b0\u589e k_attn_decode_online&#xff0c;\u9010\u5b57\u590d\u523b CPU \u7684 flash_attn_single_q_q8_neon&#xff1a;int8 query \u91cf\u5316 &#043; int32 QK \u70b9\u79ef &#043; \u9010 token online softmax &#043; \u987a\u5e8f PV&#xff0c;\u6bcf head \u4e00 block\u3001thread 0 \u4e32\u884c\u626b\u6574\u6761 KV\u3002<\/p>\n<p>\u7528 device expf \u65f6\u53cd\u800c\u66f4\u5dee&#xff08;\u5b9e\u6d4b&#xff0c;t&#061;24 \u5c31\u7ffb&#xff09;&#xff1a;<\/p>\n<table>\n<tr>\u914d\u7f6e\u9996\u6b21\u7ffb top-1token<\/tr>\n<tbody>\n<tr>\n<td>\u4e24\u904d softmax&#xff08;\u9ed8\u8ba4 fast&#xff09;<\/td>\n<td>t&#061;27<\/td>\n<td>1773&#xff08;CPU 3837&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>online \u955c\u50cf &#043; device expf<\/td>\n<td>t&#061;24<\/td>\n<td>106708&#xff08;CPU 9370&#xff09;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u63a2\u9488&#xff1a;\u91cf\u5316 expf \u5dee\u5f02&#xff08;\u5199\u5bf9\u62cd\u63a2\u9488&#xff0c;400002 \u7ec4 [-100,0] \u542b\u968f\u673a\/\u5bc6\u96c6\u8fd1 0&#xff0c;\u5b9e\u6d4b&#xff09;&#xff1a;<\/p>\n<table>\n<tr>\u5bf9\u6bd4\u5dee\u5f02\u7387<\/tr>\n<tbody>\n<tr>\n<td>CUDA device expf vs UCRT expf&#xff08;\u5f15\u64ce\u7ecf api-ms-win-crt-math \u8d70 UCRT&#xff09;<\/td>\n<td>28.3%&#xff08;max 2 ULP&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>CUDA device exp()(double) vs UCRT exp()(double)<\/td>\n<td>0 \/ 400002&#xff08;\u9010\u4f4d\u4e00\u81f4&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>(float)exp(double) vs \u6b63\u786e\u820d\u5165(float)<\/td>\n<td>100%<\/td>\n<\/tr>\n<tr>\n<td>UCRT expf vs \u6b63\u786e\u820d\u5165(float)<\/td>\n<td>99.993%&#xff08;28 \u4f8b\u4f4e 1 ULP&#xff09;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7ed3\u8bba&#xff1a;CUDA \u7684 expf \u4e0e UCRT \u5dee\u5f88\u591a&#xff1b;(float)exp(double)&#xff08;&#061; \u6b63\u786e\u820d\u5165&#xff09;\u80fd\u628a\u5dee\u5f02\u4ece 28.3% \u538b\u5230 0.007%&#xff08;\u6362\u6210\u5b83\u540e 64 token \u4e00\u81f4\u6570\u4ece 26 \u63d0\u5230 56&#xff0c;\u5206\u6b67\u4ece t&#061;24 \u63a8\u5230 t&#061;57&#xff09;\u3002\u4f46 UCRT \u7684 expf \u672c\u8eab\u4e0d\u662f\u6b63\u786e\u820d\u5165&#xff08;28 \u4f8b\u5dee 1 ULP&#xff09;&#xff0c;\u4e14\u300c\u5230\u820d\u5165\u8fb9\u754c\u7684\u8ddd\u79bb\u300d\u5728 bad\/ok \u4e4b\u95f4\u4e0d\u53ef\u5206\u79bb\u2014\u2014\u5b83\u4e0d\u662f\u300cdouble \u7ed3\u679c\u52a0\u566a\u58f0\u300d&#xff0c;\u800c\u662f\u72ec\u7acb\u7684 float \u4f8b\u7a0b\u3002<\/p>\n<p>\u7b2c\u4e8c\u6b65&#xff1a;\u53cd\u6c47\u7f16 ucrtbase.dll&#xff0c;\u4f4d\u7ea7\u590d\u523b\u3002 \u7528 objdump &#043; dumpbin \u5b9a\u4f4d ucrtbase.dll \u7684 expf&#xff08;RVA 0xA84F0&#xff0c;SSE2 \u8def\u5f84&#xff09;&#xff0c;\u8bfb\u51fa\u7b97\u6cd5\u4e0e\u5e38\u91cf&#xff1a;<\/p>\n<p>t &#061; x*K; n &#061; rint(t); j &#061; n&amp;63; m &#061; n&gt;&gt;6;<br \/>\nr &#061; fma(-n, C2, x);  z &#061; r*r;<br \/>\np &#061; fma(fma(r,C0,C1), z, r);<br \/>\nres &#061; 2^m * fma(T[j], p, T[j]);  return (float)res;<br \/>\nK &#061; 64\/ln2, C2 &#061; ln2\/64, C0 &#061; 1\/6, C1 &#061; 1\/2, T[j] &#061; 2^(j\/64)&#xff08;64 \u9879\u8868&#xff09;<\/p>\n<p>\u5373\u300c3 \u9879\u6cf0\u52d2 &#043; 64 \u9879\u8868\u300d&#xff0c;\u5185\u5c42\u5168 double &#043; \u663e\u5f0f FMA\u2014\u2014\u6240\u4ee5\u5b83\u7684\u76f8\u5bf9\u8bef\u5dee ~r\u2074\/24 \u2248 3.6e-11&#xff0c;\u8fd9\u4e5f\u89e3\u91ca\u4e86\u5b83\u4e3a\u4f55\u300c\u51e0\u4e4e\u6b63\u786e\u820d\u5165\u4f46\u5dee 28 \u4f8b\u300d\u3002\u590d\u523b\u8981\u70b9&#xff08;device&#xff09;&#xff1a;__double2int_rn&#xff08;\u5bf9\u5e94 vcvtpd2dq&#xff09;\u3001__fma_rn&#xff08;\u5bf9\u5e94 vfmadd213sd\/vfnmadd231sd&#xff1b;-fmad&#061;false \u53ea\u7981\u81ea\u52a8\u878d\u5408&#xff0c;\u663e\u5f0f FMA \u4e0d\u53d7\u5f71\u54cd&#xff09;\u3001__longlong_as_double \u9020 2^m&#xff0c;64 \u9879\u8868\u6309\u4f4d\u578b\u5185\u5d4c\u3002\u7279\u6b8a\u503c\u4ec5\u5728 x&lt;-104\/x&gt;88.72 \u9000\u5316\u3002<\/p>\n<p>\u4ed3\u5e93\u91cc\u843d\u5730\u540e\u7684 device \u590d\u523b&#xff08;src\/npu\/cuda\/vllm_cuda_kernels.cu&#xff0c;64 \u9879 EXPF_T \u8868\u7565&#xff09;&#xff1a;<\/p>\n<p><span class=\"token comment\">\/* \u6587\u4ef6\u540d&#xff1a;src\/npu\/cuda\/vllm_cuda_kernels.cu *\/<\/span><br \/>\n<span class=\"token comment\">\/* UCRT expf \u7684\u4f4d\u7ea7\u590d\u523b\u3002\u9006\u5411\u81ea C:\\\\Windows\\\\System32\\\\ucrtbase.dll \u7684 expf<br \/>\n * &#xff08;RVA 0xA84F0&#xff0c;SSE2 \u8def\u5f84&#xff09;\u3002host \u590d\u523b\u5bf9 400002 \u7ec4 [-100,0] \u6837\u672c\u4e0e UCRT<br \/>\n * expf \u9010\u4f4d\u4e00\u81f4&#xff08;0 \u5dee\u5f02&#xff09;\u3002 *\/<\/span><br \/>\n__device__ __forceinline__ <span class=\"token keyword\">float<\/span> <span class=\"token function\">expf_ucrt<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">float<\/span> xf<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>xf <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">88.7228394f<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">float<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">exp<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span><span class=\"token punctuation\">)<\/span>xf<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/* \u4e0a\u6ea2 -&gt; &#043;inf *\/<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>xf <span class=\"token operator\">&lt;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">104.0f<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">;<\/span>                         <span class=\"token comment\">\/* \u6df1\u5ea6\u4e0b\u6ea2 *\/<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> K  <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">9.23324826168936567683e&#043;01<\/span><span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/* 64\/ln2 *\/<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> C2 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.08304246962491450973e-02<\/span><span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/* ln2\/64 *\/<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> C0 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.66666666666666657415e-01<\/span><span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/* 1\/6 *\/<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> C1 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">5.00000000000000000000e-01<\/span><span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/* 1\/2 *\/<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> x  <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span><span class=\"token punctuation\">)<\/span>xf<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span>    n  <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">__double2int_rn<\/span><span class=\"token punctuation\">(<\/span>x <span class=\"token operator\">*<\/span> K<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>            <span class=\"token comment\">\/* \u5bf9\u5e94 vcvtpd2dq&#xff08;\u5c31\u8fd1\u5076\u6570&#xff09; *\/<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> dn <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span><span class=\"token punctuation\">)<\/span>n<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> r  <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">__fma_rn<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span>dn<span class=\"token punctuation\">,<\/span> C2<span class=\"token punctuation\">,<\/span> x<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>              <span class=\"token comment\">\/* \u5bf9\u5e94 vfnmadd231sd *\/<\/span><br \/>\n    <span class=\"token keyword\">int<\/span>    j  <span class=\"token operator\">&#061;<\/span> n <span class=\"token operator\">&amp;<\/span> <span class=\"token number\">63<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span>    m  <span class=\"token operator\">&#061;<\/span> n <span class=\"token operator\">&gt;&gt;<\/span> <span class=\"token number\">6<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> z  <span class=\"token operator\">&#061;<\/span> r <span class=\"token operator\">*<\/span> r<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> t1 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">__fma_rn<\/span><span class=\"token punctuation\">(<\/span>r<span class=\"token punctuation\">,<\/span> C0<span class=\"token punctuation\">,<\/span> C1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> p  <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">__fma_rn<\/span><span class=\"token punctuation\">(<\/span>t1<span class=\"token punctuation\">,<\/span> z<span class=\"token punctuation\">,<\/span> r<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> Tj <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">__longlong_as_double<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span><span class=\"token punctuation\">)<\/span>EXPF_T<span class=\"token punctuation\">[<\/span>j<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> q  <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">__fma_rn<\/span><span class=\"token punctuation\">(<\/span>Tj<span class=\"token punctuation\">,<\/span> p<span class=\"token punctuation\">,<\/span> Tj<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> two_m <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">__longlong_as_double<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span>m <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">0x3ff<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token number\">52<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">float<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span>two_m <span class=\"token operator\">*<\/span> q<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u7ed3\u679c&#xff08;\u5b9e\u6d4b&#xff09;&#xff1a;<\/p>\n<table>\n<tr>\u914d\u7f6e\u4e0e CPU \u9010 token \u4e00\u81f4\u552f\u4e00\u5206\u6b67<\/tr>\n<tbody>\n<tr>\n<td>\u9ed8\u8ba4 fast&#xff08;\u4e24\u904d softmax&#xff09;<\/td>\n<td>63\/64<\/td>\n<td>t&#061;27<\/td>\n<\/tr>\n<tr>\n<td>VLLM_CUDA_ATTN_BITEXACT&#061;1&#xff08;online &#043; expf_ucrt&#xff09;<\/td>\n<td>64\/64<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u89e3\u7801\u6587\u672c\u4e5f\u4e0e CPU \u5b8c\u5168\u76f8\u540c\u3002\u4ee3\u4ef7&#xff1a;ctx&#061;1024 \u4e0b 89 \u2192 200 ms\/tok&#xff08;2.25\u00d7&#xff0c;double exp &#043; \u6bcf head \u4e32\u884c\u626b\u63cf&#xff09;\u3002\u6309\u4ed3\u5e93\u65b9\u6cd5\u8bba\u7684\u9ed8\u8ba4\u5316\u95e8\u7981&#xff08;\u9700\u300c\u4f4d\u7ea7\u7b49\u4ef7 \u4e14 \u6027\u80fd\u9886\u5148\u300d&#xff09;&#xff0c;\u4f4d\u7ea7\u8def\u5f84\u6027\u80fd\u4e0d\u9886\u5148&#xff0c;\u6545\u4e0d\u9ed8\u8ba4\u5316&#xff0c;\u4fdd\u7559\u4e3a opt-in&#xff1a;\u9ed8\u8ba4\u4ecd\u8d70\u539f\u4e24\u904d softmax&#xff08;greedy \u7ea7&#xff0c;\u4e0e\u6539\u52a8\u524d\u9010 token \u4e00\u81f4&#xff09;\u3002<\/p>\n<h4>3.4 L2 \u5b8c\u6574\u6a21\u578b\u5bf9\u62cd harness<\/h4>\n<p>\u524d\u9762\u51e0\u8282\u628a attention \u505a\u5230\u4f4d\u7ea7&#xff0c;\u4f46\u90a3\u4e0d\u662f L2\u3002\u6309\u4ed3\u5e93\u65b9\u6cd5\u8bba\u7684 L2 \u53e3\u5f84&#xff0c;L2 &#061; \u9010\u5c42 hidden &#043; \u5b8c\u6574 logits &#043; KV \u884c\u54c8\u5e0c\u5168\u7b49\u3002<\/p>\n<p>harness&#xff08;\u4e24\u4fa7\u540c key\u3001\u540c\u5e38\u6570&#xff09;&#xff1a;VLLM_L2_DUMP&#061;&lt;path&gt;&#xff08;\u9ed8\u8ba4\u5173&#xff09;&#xff1a;\u5bf9\u7f13\u51b2\u6c42 FNV-1a 64&#xff0c;\u6309 &lt;tag&gt; &lt;hash16&gt; \u8ffd\u52a0\u5199&#xff1b;CPU \u4e0e CUDA \u4e24\u4fa7\u4f7f\u7528\u540c\u4e00\u6279 key&#xff0c;diff \u6587\u672c\u5373\u5f97\u300c\u7b2c\u4e00\u4e2a\u5dee\u5f02\u843d\u5728\u54ea\u5c42\u54ea\u6b65\u300d\u3002CPU \u4fa7\u5728 st_qwen_model_forward \u76f4\u63a5\u7b97&#xff1b;GPU \u4fa7\u5728 vc_decode_body \u7528\u5355\u7ebf\u7a0b FNV \u5185\u6838\u5199\u5230\u8bbe\u5907\u6682\u5b58\u3001token \u672b\u4e00\u6b21\u6027 D2H&#xff08;\u907f\u514d\u9010\u5c42\u540c\u6b65&#xff09;\u3002<\/p>\n<p>\u4e24\u4fa7\u540c\u5e38\u6570\u7684\u54c8\u5e0c\u5b9e\u73b0&#xff08;src\/model\/vllm_safetensors.c \u4e0e src\/npu\/cuda\/vllm_cuda_kernels.cu&#xff09;&#xff1a;<\/p>\n<p><span class=\"token comment\">\/* \u6587\u4ef6\u540d&#xff1a;src\/model\/vllm_safetensors.c *\/<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token class-name\">uint64_t<\/span> <span class=\"token function\">l2_hash64<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span>p<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">size_t<\/span> len<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token class-name\">uint8_t<\/span> <span class=\"token operator\">*<\/span>b <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> <span class=\"token class-name\">uint8_t<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>p<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">uint64_t<\/span> h <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1469598103934665603ull<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">size_t<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> len<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> h <span class=\"token operator\">^&#061;<\/span> b<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> h <span class=\"token operator\">*&#061;<\/span> <span class=\"token number\">1099511628211ull<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> h<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">st_l2_dump<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>tag<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span>p<span class=\"token punctuation\">,<\/span> <span class=\"token class-name\">size_t<\/span> bytes<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>path <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">getenv<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;VLLM_L2_DUMP&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>path <span class=\"token operator\">||<\/span> <span class=\"token operator\">!<\/span>path<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">||<\/span> <span class=\"token operator\">!<\/span>p <span class=\"token operator\">||<\/span> <span class=\"token operator\">!<\/span>bytes<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    FILE <span class=\"token operator\">*<\/span>f <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">fopen<\/span><span class=\"token punctuation\">(<\/span>path<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;a&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>f<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">fprintf<\/span><span class=\"token punctuation\">(<\/span>f<span class=\"token punctuation\">,<\/span> <span class=\"token string\">&#034;%s %016llx\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> tag<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">l2_hash64<\/span><span class=\"token punctuation\">(<\/span>p<span class=\"token punctuation\">,<\/span> bytes<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">fclose<\/span><span class=\"token punctuation\">(<\/span>f<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/* \u6587\u4ef6\u540d&#xff1a;src\/npu\/cuda\/vllm_cuda_kernels.cu&#xff0c;\u8bbe\u5907\u4fa7\u540c\u5e38\u6570 FNV-1a 64 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">L2_FNV_OFF<\/span> <span class=\"token expression\"><span class=\"token number\">1469598103934665603ull<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">L2_FNV_PRM<\/span> <span class=\"token expression\"><span class=\"token number\">1099511628211ull<\/span><\/span><\/span><br \/>\n__global__ <span class=\"token keyword\">void<\/span> <span class=\"token function\">k_l2_hash<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> <span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>__restrict p<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> nbytes<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span> <span class=\"token operator\">*<\/span>__restrict out<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>threadIdx<span class=\"token punctuation\">.<\/span>x <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span> <span class=\"token operator\">||<\/span> blockIdx<span class=\"token punctuation\">.<\/span>x <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span> h <span class=\"token operator\">&#061;<\/span> L2_FNV_OFF<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> nbytes<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> h <span class=\"token operator\">^&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span><span class=\"token punctuation\">)<\/span>p<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> h <span class=\"token operator\">*&#061;<\/span> L2_FNV_PRM<span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token operator\">*<\/span>out <span class=\"token operator\">&#061;<\/span> h<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u6bcf\u4e2a decode token \u7684 key \u96c6\u5408&#xff08;48 \u5c42 \u2192 \u6bcf token 530 key&#xff09;&#xff1a;<\/p>\n<table>\n<tr>key\u542b\u4e49<\/tr>\n<tbody>\n<tr>\n<td>t&lt;pos&gt;_l&lt;L&gt;_nrm<\/td>\n<td>attn RMSNorm \u8f93\u51fa&#xff08;QKV GEMM \u8f93\u5165&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>t&lt;pos&gt;_l&lt;L&gt;_kraw \/ _knorm<\/td>\n<td>K \u6bb5\u6295\u5f71\u8f93\u51fa \/ K \u7ecf QK-norm&#xff08;RoPE \u524d&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>t&lt;pos&gt;_l&lt;L&gt;_qrope<\/td>\n<td>Q \u7ecf RoPE&#xff08;attention \u7684 Q \u8f93\u5165&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>t&lt;pos&gt;_l&lt;L&gt;_k \/ _v<\/td>\n<td>\u672c token \u5199\u5165\u7684 int8 K \/ V \u884c<\/td>\n<\/tr>\n<tr>\n<td>t&lt;pos&gt;_l&lt;L&gt;_ks \/ _vs<\/td>\n<td>per-head K \/ V scale<\/td>\n<\/tr>\n<tr>\n<td>t&lt;pos&gt;_l&lt;L&gt;_attn<\/td>\n<td>attention \u8f93\u51fa&#xff08;O \u6295\u5f71\u524d&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>t&lt;pos&gt;_l&lt;L&gt;_ores<\/td>\n<td>O \u6295\u5f71 &#043; \u6b8b\u5dee\u540e&#xff08;FFN \u524d&#xff09;\u7684 hidden<\/td>\n<\/tr>\n<tr>\n<td>t&lt;pos&gt;_l&lt;L&gt;_x<\/td>\n<td>\u8be5\u5c42 residual \u540e\u7684 hidden&#xff08;FFN \u4e4b\u540e&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>t&lt;pos&gt;_final_normed<\/td>\n<td>\u6700\u7ec8 RMSNorm \u8f93\u51fa&#xff08;lm_head \u8f93\u5165&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>t&lt;pos&gt;_logits<\/td>\n<td>\u5b8c\u6574 logits&#xff08;vocab \u4e2a float&#xff09;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>3.5 \u524d\u63d0&#xff1a;\u5bf9\u62cd\u914d\u7f6e\u672c\u8eab\u5fc5\u987b\u5e72\u51c0&#xff08;VLLM_CUDA_FORCE_CPU&#061;1&#xff09;<\/h4>\n<p>\u8fd9\u662f\u672c\u8f6e\u8e29\u8fc7\u7684\u6700\u5927\u7684\u5751\u3002 \u5168 GPU decode \u9700\u8981 VLLM_CUDA_INFER&#061;1&#xff08;\u628a\u6743\u91cd\u9884\u8f7d\u9a7b\u7559&#xff09;&#xff0c;\u4f46\u8be5\u5f00\u5173\u540c\u65f6\u4e5f\u4f1a\u8ba9 prefill \u7684 GEMM \u8d70 GPU offload\u2014\u2014\u4e8e\u662f prefill \u5199\u5165 KV cache \u7684 K\/V \u884c\u4e0e scale \u5c31\u5df2\u7ecf\u548c\u7eaf CPU \u53c2\u8003\u5dee ~1 ULP\u3002\u6b64\u65f6\u65e0\u8bba decode \u4fa7\u591a\u5e72\u51c0&#xff0c;L2 \u90fd\u5fc5\u7136\u4e0d\u7b49&#xff0c;\u4e14\u9996\u4e2a\u5dee\u5f02\u4f1a\u4f2a\u88c5\u6210 t32_l0_ks&#xff08;\u770b\u8d77\u6765\u50cf RoPE\/attention \u7684\u95ee\u9898&#xff09;&#xff0c;\u628a\u5b9a\u4f4d\u5e26\u504f\u3002<\/p>\n<p>\u6b63\u89e3&#xff1a;\u52a0 VLLM_CUDA_FORCE_CPU&#061;1\u2014\u2014\u8bbe\u5907\u4ecd\u521d\u59cb\u5316\u3001\u6743\u91cd\u4ecd\u9884\u8f7d&#xff0c;\u4f46\u6240\u6709 host \u4fa7 offload \u56de\u9000 CPU&#xff08;prefill \u56e0\u6b64\u7eaf CPU&#xff09;&#xff1b;\u800c decode \u8d70\u7684\u662f\u8bbe\u5907\u5185\u7684 vc_decode_body&#xff0c;\u4e0d\u53d7\u8be5\u5f00\u5173\u5f71\u54cd&#xff0c;\u4ecd\u5168 GPU\u3002\u4f4d\u7ea7\u5bf9\u62cd\u7684\u6b63\u786e\u547d\u4ee4&#xff1a;<\/p>\n<p># \u53c2\u8003&#xff1a;\u7eaf CPU<br \/>\nVLLM_L2_DUMP&#061;ref.txt  vllm_kestrel_x64 &#8211;model &lt;m&gt; &#8211;stream-test &#8211;stream-n 4<br \/>\n# \u88ab\u6d4b&#xff1a;\u5168 GPU decode &#043; \u4f4d\u7ea7\u6863&#xff08;prefill \u7559 CPU&#xff09;<br \/>\nVLLM_L2_DUMP&#061;gpu.txt VLLM_CUDA_DECODE&#061;1 VLLM_CUDA_INFER&#061;1 \\\\<br \/>\nVLLM_CUDA_FORCE_CPU&#061;1 VLLM_CUDA_L2EXACT&#061;1 \\\\<br \/>\nvllm_kestrel_x64 &#8211;cuda &#8211;model &lt;m&gt; &#8211;stream-test &#8211;stream-n 4<\/p>\n<h4>3.6 \u9010\u9879\u6d88\u5dee&#xff08;VLLM_CUDA_L2EXACT&#061;1 \u6863&#xff09;<\/h4>\n<p>\u6309 harness \u9489\u51fa\u7684\u987a\u5e8f\u4e00\u4e2a\u4e2a\u6539&#xff0c;\u6bcf\u6539\u4e00\u6b21\u590d\u8dd1\u3001\u770b\u9996\u4e2a\u5dee\u5f02\u662f\u5426\u540e\u79fb&#xff1a;<\/p>\n<table>\n<tr>#\u73af\u8282\u539f\u5dee\u5f02\u5904\u7f6e<\/tr>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>attn RMSNorm \/ QK-norm<\/td>\n<td>GPU \u7528 rsqrtf&#xff08;\u5dee 34.9%&#xff09;&#043; \u6811\u5f62\u5f52\u7ea6<\/td>\n<td>\u65b0\u589e k_rms_norm_cpu\/k_qk_norm_cpu&#xff1a;1.0f\/sqrtf&#xff08;\u4e0e UCRT 0\/400001 \u9010\u4f4d\u4e00\u81f4&#xff09;&#043; \u9010\u5b57\u590d\u523b CPU \u7684 8 \u5143\u7d20\u5206\u5757 hsum8 \u6811 \/ \u9010\u5143\u7d20\u5347\u5e8f\u5f52\u7ea6<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>QKV \u6295\u5f71 GEMM<\/td>\n<td>_kraw \u8d77\u5c31\u4e0d\u540c<\/td>\n<td>CPU q4_dense4_x86 \u5728\u6bcf\u4e2a 32 \u5757\u5185\u6309 (e, e&#043;16) \u914d\u5bf9\u7d2f\u52a0&#xff08;s &#043;&#061; w[e]\u00b7x[e] &#043; w[e&#043;16]\u00b7x[e&#043;16]&#xff09;&#xff0c;GPU \u662f\u4e25\u683c 0\u202631\u3002\u7ed9 k_gw_gemm_f32act \u52a0 pairwise \u5f52\u7ea6&#xff0c;\u5e76\u5f3a\u5236 nsplit&#061;1&#xff08;z \u5206\u533a\u7684\u5757\u548c\u5f52\u7ea6\u4f1a\u91cd\u6392\u76f8\u52a0\u5e8f&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>RoPE \u7684 cosf\/sinf<\/td>\n<td>_qrope \u5dee<\/td>\n<td>\u53cd\u6c47\u7f16 ucrtbase.dll \u4f4d\u7ea7\u590d\u523b&#xff08;\u89c1 3.6.1&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>decode attention<\/td>\n<td>_attn \u5dee<\/td>\n<td>\u63a5\u4e0a\u5df2\u6709\u7684 k_attn_decode_online&#xff08;online softmax &#043; \u987a\u5e8f PV &#043; expf_ucrt&#xff09;&#xff0c;\u5e76\u4fee\u6b63\u53ef\u89c1 token \u6570\u53e3\u5f84&#xff08;dyn[1]&#043;1&#xff0c;CPU \u4fa7\u4e3a\u81ea\u589e\u540e\u7684 cache_len[l]&#xff09;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4ed3\u5e93\u91cc\u8fd9\u4e24\u4e2a\u300c\u540c\u5e8f\u300d\u5185\u6838&#xff08;src\/npu\/cuda\/vllm_cuda_kernels.cu&#xff09;&#xff1a;<\/p>\n<p><span class=\"token comment\">\/* \u6587\u4ef6\u540d&#xff1a;src\/npu\/cuda\/vllm_cuda_kernels.cu&#xff0c;k_rms_norm_cpu \/ k_qk_norm_cpu *\/<\/span><br \/>\n__global__ <span class=\"token keyword\">void<\/span> <span class=\"token function\">k_rms_norm_cpu<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">float<\/span> <span class=\"token operator\">*<\/span>__restrict out<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">float<\/span> <span class=\"token operator\">*<\/span>__restrict x<span class=\"token punctuation\">,<\/span><br \/>\n                               <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">float<\/span> <span class=\"token operator\">*<\/span>__restrict w<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> d<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">float<\/span> eps<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    __shared__ <span class=\"token keyword\">float<\/span> rd<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> threadIdx<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>i <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> ss <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">int<\/span> d8 <span class=\"token operator\">&#061;<\/span> d <span class=\"token operator\">&amp;<\/span> <span class=\"token operator\">~<\/span><span class=\"token number\">7<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> b <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> b <span class=\"token operator\">&lt;<\/span> d8<span class=\"token punctuation\">;<\/span> b <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token number\">8<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>           <span class=\"token comment\">\/* CPU \u7684 8 \u5143\u7d20\u5206\u5757 hsum8 \u6811 *\/<\/span><br \/>\n            <span class=\"token keyword\">float<\/span> lo<span class=\"token punctuation\">[<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> hi<span class=\"token punctuation\">[<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> k <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> k <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">;<\/span> k<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> lo<span class=\"token punctuation\">[<\/span>k<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> x<span class=\"token punctuation\">[<\/span>b<span class=\"token operator\">&#043;<\/span>k<span class=\"token punctuation\">]<\/span><span class=\"token operator\">*<\/span>x<span class=\"token punctuation\">[<\/span>b<span class=\"token operator\">&#043;<\/span>k<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> hi<span class=\"token punctuation\">[<\/span>k<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> x<span class=\"token punctuation\">[<\/span>b<span class=\"token operator\">&#043;<\/span><span class=\"token number\">4<\/span><span class=\"token operator\">&#043;<\/span>k<span class=\"token punctuation\">]<\/span><span class=\"token operator\">*<\/span>x<span class=\"token punctuation\">[<\/span>b<span class=\"token operator\">&#043;<\/span><span class=\"token number\">4<\/span><span class=\"token operator\">&#043;<\/span>k<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> k <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> k <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">;<\/span> k<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> lo<span class=\"token punctuation\">[<\/span>k<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;&#061;<\/span> hi<span class=\"token punctuation\">[<\/span>k<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">float<\/span> s01 <span class=\"token operator\">&#061;<\/span> lo<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> lo<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span> s23 <span class=\"token operator\">&#061;<\/span> lo<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> lo<span class=\"token punctuation\">[<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            ss <span class=\"token operator\">&#043;&#061;<\/span> s01 <span class=\"token operator\">&#043;<\/span> s23<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> j <span class=\"token operator\">&#061;<\/span> d8<span class=\"token punctuation\">;<\/span> j <span class=\"token operator\">&lt;<\/span> d<span class=\"token punctuation\">;<\/span> j<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> ss <span class=\"token operator\">&#043;&#061;<\/span> x<span class=\"token punctuation\">[<\/span>j<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">*<\/span> x<span class=\"token punctuation\">[<\/span>j<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        rd<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.0f<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token function\">sqrtf<\/span><span class=\"token punctuation\">(<\/span>ss <span class=\"token operator\">\/<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">float<\/span><span class=\"token punctuation\">)<\/span>d <span class=\"token operator\">&#043;<\/span> eps<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* \u4e0e UCRT \u9010\u4f4d\u4e00\u81f4&#xff1b;GPU rsqrtf \u5dee 34.9% *\/<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token function\">__syncthreads<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">float<\/span> rms <span class=\"token operator\">&#061;<\/span> rd<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> j <span class=\"token operator\">&#061;<\/span> i<span class=\"token punctuation\">;<\/span> j <span class=\"token operator\">&lt;<\/span> d<span class=\"token punctuation\">;<\/span> j <span class=\"token operator\">&#043;&#061;<\/span> DC_BLK<span class=\"token punctuation\">)<\/span> out<span class=\"token punctuation\">[<\/span>j<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> x<span class=\"token punctuation\">[<\/span>j<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">*<\/span> rms <span class=\"token operator\">*<\/span> w<span class=\"token punctuation\">[<\/span>j<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n__global__ <span class=\"token keyword\">void<\/span> <span class=\"token function\">k_qk_norm_cpu<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">float<\/span> <span class=\"token operator\">*<\/span>__restrict x<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">float<\/span> <span class=\"token operator\">*<\/span>__restrict w<span class=\"token punctuation\">,<\/span><br \/>\n                              <span class=\"token keyword\">int<\/span> hd<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> nheads<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">int<\/span> h <span class=\"token operator\">&#061;<\/span> blockIdx<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>h <span class=\"token operator\">&gt;&#061;<\/span> nheads<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">float<\/span> <span class=\"token operator\">*<\/span>xh <span class=\"token operator\">&#061;<\/span> x <span class=\"token operator\">&#043;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token class-name\">size_t<\/span><span class=\"token punctuation\">)<\/span>h <span class=\"token operator\">*<\/span> hd<span class=\"token punctuation\">;<\/span><br \/>\n    __shared__ <span class=\"token keyword\">float<\/span> rd<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> threadIdx<span class=\"token punctuation\">.<\/span>x<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>i <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">float<\/span> ss <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0f<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> j <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> j <span class=\"token operator\">&lt;<\/span> hd<span class=\"token punctuation\">;<\/span> j<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">)<\/span> ss <span class=\"token operator\">&#043;&#061;<\/span> xh<span class=\"token punctuation\">[<\/span>j<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">*<\/span> xh<span class=\"token punctuation\">[<\/span>j<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/* \u9010\u5143\u7d20\u5347\u5e8f ss &#043;&#061; x[i]^2 *\/<\/span><br \/>\n        rd<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.0f<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token function\">sqrtf<\/span><span class=\"token punctuation\">(<\/span>ss <span class=\"token operator\">\/<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">float<\/span><span class=\"token punctuation\">)<\/span>hd <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1e-6f<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token function\">__syncthreads<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">float<\/span> rms <span class=\"token operator\">&#061;<\/span> rd<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> j <span class=\"token operator\">&#061;<\/span> i<span class=\"token punctuation\">;<\/span> j <span class=\"token operator\">&lt;<\/span> hd<span class=\"token punctuation\">;<\/span> j <span class=\"token operator\">&#043;&#061;<\/span> DC_BLK<span class=\"token punctuation\">)<\/span> xh<span class=\"token punctuation\">[<\/span>j<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> xh<span class=\"token punctuation\">[<\/span>j<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">*<\/span> rms <span class=\"token operator\">*<\/span> w<span class=\"token punctuation\">[<\/span>j<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u7ed3\u679c&#xff1a;\u5c42 0 \u5185\u6bcf\u52a0\u4e00\u4e2a\u63a2\u9488\u5c31\u628a\u8303\u56f4\u7f29\u5c0f\u4e00\u6b21\u2014\u2014_nrm ok \u540e\u4ece _kraw \u7ee7\u7eed&#xff0c;_kraw ok \u540e\u518d\u770b _qrope&#xff0c;_qrope ok \u540e\u518d\u770b _attn&#xff0c;\u6700\u540e\u53ea\u5269 _x\u3002<\/p>\n<h5>3.6.1 UCRT cosf\/sinf \u7684\u53cd\u6c47\u7f16\u590d\u523b<\/h5>\n<p>\u4e0e 3.3 \u7684 expf \u540c\u4e00\u5957\u65b9\u6cd5\u3002GetProcAddress(ucrtbase) \u5b9a RVA&#xff1a;cosf &#061; 0xa7d20\u3001sinf &#061; 0xac110&#xff08;expf &#061; 0xa84f0&#xff0c;\u4e0e 3.3 \u4e00\u81f4&#xff0c;\u9a8c\u8bc1\u65b9\u6cd5\u81ea\u6d3d&#xff09;\u3002\u8bfb\u51fa\u7684\u7b97\u6cd5&#xff1a;<\/p>\n<p>| x | &lt;&#061; pi\/4 : \u76f4\u63a5\u53cc\u7cbe\u5ea6\u591a\u9879\u5f0f<br \/>\n    |x| &lt; 2^-13 : cosf -&gt; 1.0f &#xff1b;sinf -&gt; x&#xff08;\u6052\u7b49&#xff09;<br \/>\n    |x| &lt; 2^-7  : cosf -&gt; (float)fma(-(x*0.5), x, 1.0) &#xff1b;<br \/>\n                  sinf -&gt; (float)fma(-(x*x*x), 1\/6, x)<br \/>\n    \u5426\u5219        : z&#061;x*x&#xff1b;cos \u591a\u9879\u5f0f p &#061; A3 &#043; z(A5 &#043; z(A7 &#043; z*A9))&#xff0c;\u7ed3\u679c fma(p, z*z, 1 &#8211; 0.5*z)<br \/>\n                  sin \u591a\u9879\u5f0f p &#061; B3 &#043; z(B5 &#043; z(B7 &#043; z*B9))&#xff0c;\u7ed3\u679c fma(p, x*z, x)<br \/>\n| x | &gt; pi\/4 : Cody-Waite \u5f52\u7ea6<br \/>\n    n &#061; (int)trunc( fma(|x|, 2\/pi, 0.5) ) ;  r &#061; fma(-n, PIO2_HI, |x|) &#8211; n*PIO2_LO<br \/>\n    cosf: n \u5947 -&gt; sin \u591a\u9879\u5f0f(\u53c2\u6570 r)&#xff0c;\u5076 -&gt; cos \u591a\u9879\u5f0f&#xff1b;\u7b26\u53f7\u4f4d ^&#061; ((n&amp;3)&#043;1)&gt;&gt;1<br \/>\n    sinf: n \u5947 -&gt; cos \u591a\u9879\u5f0f(\u53c2\u6570 r)&#xff0c;\u5076 -&gt; sin \u591a\u9879\u5f0f&#xff1b;\u7b26\u53f7\u4f4d ^&#061; (n&amp;3&gt;&#061;2) ^ sign(x)<br \/>\n    \u6700\u7ec8\u4e00\u6b21 (float) \u820d\u5165<\/p>\n<p>\u5e38\u91cf&#xff08;.rdata \u6309\u4f4d\u578b\u8bfb\u51fa&#xff09;&#xff1a;2\/pi &#061; 0x3fe45f306dc9c883\u3001PIO2_HI &#061; 0x3ff921fb54400000\u3001PIO2_LO &#061; 0x3dd0b4611a626331\u3001A3..A9 &#061; 1\/24, -1\/720, 1\/40320, -1\/3628800\u3001B3..B9 &#061; -1\/6, 1\/120, -1\/5040, 1\/362880\u3002<\/p>\n<p>\u590d\u523b\u8981\u70b9&#xff1a;\u591a\u9879\u5f0f\u7cfb\u6570\u5fc5\u987b\u6309\u300c213 \u5f62\u5f0f\u300d\u5199\u2014\u2014vfmadd213sd xmm1, xmm3, mem \u662f xmm1 &#061; xmm3*xmm1 &#043; mem&#xff0c;\u4e0d\u662f xmm3*mem &#043; xmm1&#xff1b;\u5199\u53cd\u4f1a\u8ba9\u6574\u4e2a\u591a\u9879\u5f0f\u91cf\u7ea7\u9519&#xff08;\u672c\u6b21\u7b2c\u4e00\u7248\u5c31\u628a cosf \u505a\u6210 98% \u4e0d\u4e00\u81f4&#xff0c;\u5b9a\u4f4d\u5230\u8fd9\u6761\u5373\u4fee\u597d&#xff09;\u3002|x| \u2265 0x4f490fdb&#xff08;cosf&#xff09;\/ 0x4b800456&#xff08;sinf&#xff09;\u8d70 Payne-Hanek \u6162\u8def&#xff0c;RoPE \u4e0d\u53ef\u8fbe&#xff08;angle \u2264 max_seq&#xff09;&#xff0c;\u9000\u5316\u4e3a device \u5e93\u51fd\u6570\u3002<\/p>\n<p>\u4ed3\u5e93\u91cc\u843d\u5730\u540e\u7684 device \u590d\u523b&#xff08;src\/npu\/cuda\/vllm_cuda_kernels.cu&#xff0c;sinf_ucrt \u540c\u6cd5&#xff09;&#xff1a;<\/p>\n<p><span class=\"token comment\">\/* \u6587\u4ef6\u540d&#xff1a;src\/npu\/cuda\/vllm_cuda_kernels.cu&#xff0c;cosf_ucrt() *\/<\/span><br \/>\n<span class=\"token comment\">\/* host \u4fa7\u5bf9\u7167\u771f\u5b9e UCRT \u5bf9\u62cd 600002 \u7ec4\u6837\u672c \u2192 cosf\/sinf \u5404 0 \u5dee\u5f02\u3002 *\/<\/span><br \/>\n<span class=\"token keyword\">static<\/span> __device__ __forceinline__ <span class=\"token keyword\">double<\/span> <span class=\"token function\">vc_ucd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span> b<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token function\">__longlong_as_double<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">long<\/span> <span class=\"token keyword\">long<\/span><span class=\"token punctuation\">)<\/span>b<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n__device__ __forceinline__ <span class=\"token keyword\">float<\/span> <span class=\"token function\">cosf_ucrt<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">float<\/span> xf<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> INV_PIO2 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">vc_ucd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0x3fe45f306dc9c883ull<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> PIO2_HI  <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">vc_ucd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0x3ff921fb54400000ull<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> PIO2_LO  <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">vc_ucd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0x3dd0b4611a626331ull<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> A3 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">vc_ucd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0x3fa5555555555555ull<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/* 1\/24 *\/<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> A5 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">vc_ucd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0xbf56c16c16c16c16ull<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> A7 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">vc_ucd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0x3efa01a01a01a019ull<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> A9 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">vc_ucd<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0xbe927e4fb7789f5cull<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">unsigned<\/span> au <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">__float_as_uint<\/span><span class=\"token punctuation\">(<\/span>xf<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&amp;<\/span> <span class=\"token number\">0x7fffffffu<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>au <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token number\">0x7f800000u<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token function\">cosf<\/span><span class=\"token punctuation\">(<\/span>xf<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> xd <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span><span class=\"token punctuation\">)<\/span>xf<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>au <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">0x3f490fdbu<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>                       <span class=\"token comment\">\/* |x| &lt;&#061; pi\/4 *\/<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>au <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0x39000000u<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token number\">1.0f<\/span><span class=\"token punctuation\">;<\/span>         <span class=\"token comment\">\/* |x| &lt; 2^-13 *\/<\/span><br \/>\n        <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> z <span class=\"token operator\">&#061;<\/span> xd <span class=\"token operator\">*<\/span> xd<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">double<\/span> p <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">__fma_rn<\/span><span class=\"token punctuation\">(<\/span>z<span class=\"token punctuation\">,<\/span> A9<span class=\"token punctuation\">,<\/span> A7<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        p <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">__fma_rn<\/span><span class=\"token punctuation\">(<\/span>z<span class=\"token punctuation\">,<\/span> p<span class=\"token punctuation\">,<\/span> A5<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        p <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">__fma_rn<\/span><span class=\"token punctuation\">(<\/span>z<span class=\"token punctuation\">,<\/span> p<span class=\"token punctuation\">,<\/span> A3<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">float<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">__fma_rn<\/span><span class=\"token punctuation\">(<\/span>p<span class=\"token punctuation\">,<\/span> z <span class=\"token operator\">*<\/span> z<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1.0<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">0.5<\/span> <span class=\"token operator\">*<\/span> z<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u9a8c\u8bc1&#xff08;\u5b9e\u6d4b&#xff09;&#xff1a;host \u590d\u523b\u5bf9 UCRT \u5bf9\u62cd 600002 \u7ec4\u6837\u672c&#xff08;[-10000,10000] \u5747\u5300 &#043; [-35,35] \u5bc6\u96c6 &#043; \u968f\u673a&#xff09;\u2192 cosf\/sinf \u5404 0 \u5dee\u5f02&#xff1b;\u968f\u540e\u79fb\u690d\u4e3a device cosf_ucrt\/sinf_ucrt\u3002RoPE \u5185\u6838\u91cc\u6309\u6863\u4f4d\u9009\u62e9&#xff08;src\/npu\/cuda\/vllm_cuda_kernels.cu&#xff09;&#xff1a;<\/p>\n<p><span class=\"token comment\">\/* \u6587\u4ef6\u540d&#xff1a;src\/npu\/cuda\/vllm_cuda_kernels.cu&#xff0c;k_rope(&#8230;, bitexact) *\/<\/span><br \/>\n<span class=\"token keyword\">const<\/span> <span class=\"token keyword\">float<\/span> ca <span class=\"token operator\">&#061;<\/span> bitexact <span class=\"token operator\">?<\/span> <span class=\"token function\">cosf_ucrt<\/span><span class=\"token punctuation\">(<\/span>angle<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">:<\/span> <span class=\"token function\">cosf<\/span><span class=\"token punctuation\">(<\/span>angle<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">const<\/span> <span class=\"token keyword\">float<\/span> sa <span class=\"token operator\">&#061;<\/span> bitexact <span class=\"token operator\">?<\/span> <span class=\"token function\">sinf_ucrt<\/span><span class=\"token punctuation\">(<\/span>angle<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">:<\/span> <span class=\"token function\">sinf<\/span><span class=\"token punctuation\">(<\/span>angle<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h3>\u56db\u3001\u5b9e\u6d4b\u6570\u636e<\/h3>\n<p>\u5b9e\u6d4b&#xff08;&#8211;stream-n 4&#xff0c;48 \u5c42 \u2192 \u6bcf token 530 key&#xff0c;4 token \u5171 2120&#xff09;&#xff1a;<\/p>\n<table>\n<tr>\u5bf9\u6bd4\u4e0d\u4e00\u81f4 key\u9996\u4e2a\u5dee\u5f02<\/tr>\n<tbody>\n<tr>\n<td>\u7eaf CPU vs VLLM_CUDA_ATTN&#061;1 VLLM_CUDA_ATTN_BITEXACT&#061;1&#xff08;CPU &#043; \u4f4d\u7ea7 attention&#xff09;<\/td>\n<td>0 \/ 1936<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>\u7eaf CPU vs \u5168 GPU decode&#xff0c;\u672a\u52a0 FORCE_CPU<\/td>\n<td>1917 \/ 1936<\/td>\n<td>t32_l0_ks&#xff08;\u4f2a\u5dee\u5f02&#xff0c;\u89c1 3.5&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>\u7eaf CPU vs \u5168 GPU decode&#xff08;DECODE&#043;INFER&#043;FORCE_CPU&#043;L2EXACT&#xff09;<\/td>\n<td>2054 \/ 2120<\/td>\n<td>t32_l0_x&#xff08;MoE FFN \u8f93\u51fa&#xff09;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5c42 0 \u9010\u5b57\u6bb5&#xff08;\u6570\u636e\u6d41\u5e8f&#xff09;&#xff1a;<\/p>\n<p>ok  _nrm  ok  _kraw  ok  _knorm  ok  _k  ok  _ks  ok  _v  ok  _vs<br \/>\nok  _qrope  ok  _attn  ok  _ores<br \/>\nDIFF _x        &lt;&#8211; \u552f\u4e00\u6b8b\u9879&#xff1a;MoE FFN \u8f93\u51fa<\/p>\n<p>\u7ed3\u8bba&#xff1a;\u5168 GPU decode \u5728 opt-in \u6863&#xff08;VLLM_CUDA_L2EXACT&#061;1&#xff09;\u4e0b&#xff0c;\u5c42 0 \u7684\u6574\u6761\u6ce8\u610f\u529b\u8def\u5f84&#xff08;RMSNorm \u2192 QKV GEMM \u2192 QK-norm \u2192 RoPE \u2192 KV \u91cf\u5316 \u2192 attention \u2192 O \u6295\u5f71&#043;\u6b8b\u5dee&#xff09;\u5df2\u4e0e\u7eaf CPU \u9010\u5b57\u8282\u4e00\u81f4&#xff1b;\u6cbf\u6570\u636e\u6d41\u7ee7\u7eed\u63a8\u8fdb&#xff0c;\u7b2c\u4e00\u4e2a\u5dee\u5f02\u70b9\u5c31\u662f MoE FFN\u3002<\/p>\n<h3>\u4e94\u3001\u8fb9\u754c\u4e0e\u5df2\u77e5\u9650\u5236<\/h3>\n<p>\u5df2\u5b8c\u6210&#xff08;\u4f4d\u7ea7&#xff0c;opt-in&#xff09;<\/p>\n<table>\n<tr>\u9879\u5f00\u5173\u4f4d\u7f6e<\/tr>\n<tbody>\n<tr>\n<td>UCRT expf \u4f4d\u7ea7\u590d\u523b<\/td>\n<td>VLLM_CUDA_ATTN_BITEXACT \/ L2EXACT<\/td>\n<td>expf_ucrt&#xff08;.cu&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>UCRT cosf\/sinf \u4f4d\u7ea7\u590d\u523b<\/td>\n<td>VLLM_CUDA_L2EXACT<\/td>\n<td>cosf_ucrt\/sinf_ucrt&#xff08;.cu&#xff09;<\/td>\n<\/tr>\n<tr>\n<td>attn RMSNorm \/ QK-norm \u540c\u5e8f<\/td>\n<td>VLLM_CUDA_L2EXACT<\/td>\n<td>k_rms_norm_cpu\/k_qk_norm_cpu<\/td>\n<\/tr>\n<tr>\n<td>QKV\/O\/GU\/DOWN\/LMHEAD GEMM \u5757\u5185\u5f52\u7ea6\u5e8f &#043; nsplit&#061;1<\/td>\n<td>VLLM_CUDA_L2EXACT<\/td>\n<td>k_gw_gemm_f32act(pairwise)<\/td>\n<\/tr>\n<tr>\n<td>K \u6bb5\u6295\u5f71 \/ Q \u6bb5 RoPE \u5bf9\u9f50<\/td>\n<td>VLLM_CUDA_L2EXACT<\/td>\n<td>k_rope(&#8230;, bitexact)<\/td>\n<\/tr>\n<tr>\n<td>decode attention \u955c\u50cf<\/td>\n<td>VLLM_CUDA_L2EXACT&#xff08;\u6216 ATTN_BITEXACT&#xff09;<\/td>\n<td>k_attn_decode_online<\/td>\n<\/tr>\n<tr>\n<td>L2 harness&#xff08;530 key\/token&#xff09;<\/td>\n<td>VLLM_L2_DUMP<\/td>\n<td>\u4e24\u4fa7 k_l2_hash\/st_l2_dump<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u672a\u5b8c\u6210 \/ \u5df2\u77e5\u5899<\/p>\n<table>\n<tr>\u9879\u73b0\u72b6\u7ed3\u8bba<\/tr>\n<tbody>\n<tr>\n<td>MoE FFN&#xff08;router \/ gate_up \/ down \/ topk&#xff09;<\/td>\n<td>_x \u8d77\u5206\u6b67<\/td>\n<td>\u672c\u8f6e\u552f\u4e00\u6b8b\u9879\u3002\u4e09\u7ef4\u5929\u7136\u4e00\u81f4&#xff08;\u6fc0\u6d3b s16 \/ 32-block scale\u3001\u5757\u5185 int32 \u7cbe\u786e\u70b9\u79ef\u3001\u6743\u91cd 4\u00d74 72B tile \u5e03\u5c40&#xff09;&#xff1b;\u56db\u5904\u7ed3\u6784\u6027\u4e0d\u540c&#xff1a;\u2460router GEMM \u662f 64 \u8def\u6811\u5f52\u7ea6 vs CPU 2048 \u6b65\u4e32\u884c\u94fe&#xff08;\u4f5c\u8005\u6ce8\u91ca\u81ea\u8ba4 relaxed bit-exactness&#xff09;&#xff1b;\u2461scale \u7ed3\u5408\u5f8b (dot*s_w)*s_a vs (s_w*s_a)*dot&#xff1b;\u2462down \u628a p \u6298\u53e0\u8fdb\u5757\u9879 vs \u672b\u5c3e\u4e58\u4e00\u6b21&#xff1b;\u2463silu \u7528 device expf \u800c\u975e\u73b0\u6210 expf_ucrt\u3002\u8981\u5bf9\u9f50\u9700\u6539\u5199 4 \u4e2a\u5185\u6838\u5e76\u653e\u5f03\u5176\u73b0\u6709\u5e76\u884c\u5ea6&#xff0c;\u6545\u4ec5\u4f5c opt-in \u6863\u5019\u9009&#xff0c;\u672c\u8f6e\u672a\u505a&#xff08;\u5df2\u5728 \u7b2c 22 \u7bc7 \u6536\u53e3&#xff09;\u3002<\/td>\n<\/tr>\n<tr>\n<td>\u5168 GPU decode \u7684\u9010\u5c42\u4f4d\u7ea7\u5168\u7b49&#xff08;L2 \u6574\u4f53&#xff09;<\/td>\n<td>\u672a\u8fbe\u6210<\/td>\n<td>\u88ab MoE \u963b\u65ad&#xff1b;\u5c42 0 \u6ce8\u610f\u529b\u8def\u5f84\u5df2\u901a<\/td>\n<\/tr>\n<tr>\n<td>prefill\/batch \u8def\u5f84\u4f4d\u7ea7<\/td>\n<td>\u672a\u505a<\/td>\n<td>\u672c\u8f6e\u53ea\u8986\u76d6 M&#061;1 decode<\/td>\n<\/tr>\n<tr>\n<td>\u7f3a FORCE_CPU \u7684\u751f\u4ea7\u914d\u7f6e<\/td>\n<td>VLLM_CUDA_DECODE&#061;1 VLLM_CUDA_INFER&#061;1<\/td>\n<td>\u4ecd\u662f greedy \u7ea7&#xff1b;\u4f4d\u7ea7\u6863\u987b\u663e\u5f0f\u5f00 L2EXACT&#xff08;&#043;FORCE_CPU \u4fdd prefill \u5e72\u51c0&#xff09;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>CPU \u5bf9\u7167&#xff08;\u8fc1\u79fb\u524d\u57fa\u7ebf&#xff09;<\/h3>\n<ul>\n<li>CPU \u53c2\u8003&#xff1a;kestrel-llm\/src\/model\/vllm_safetensors.c:f32x8_hsum \/ hsum_neon4 \u2014\u2014 CPU \u5f52\u7ea6\u5e8f&#xff08;8 \u5143\u7d20\u6811 \/ 4 \u5143\u7d20\u6811&#xff09;&#xff1b;\u8d85\u8d8a\u51fd\u6570\u76f4\u63a5\u7528 UCRT \u5e93 expf\/cosf\/sinf\u3002<\/li>\n<li>\u8fc1\u79fb\u8981\u70b9&#xff1a;\u8de8\u786c\u4ef6\u4f4d\u7ea7\u7684\u62e6\u8def\u864e\u662f\u8d85\u8d8a\u51fd\u6570\u2014\u2014\u53cd\u6c47\u7f16 ucrtbase.dll \u4f4d\u7ea7\u590d\u523b expf_ucrt \/ cosf_ucrt \/ sinf_ucrt&#xff1b;RMSNorm\/QK-norm \u6539\u4e32\u884c\u540c\u5e8f&#xff08;k_rms_norm_cpu \/ k_qk_norm_cpu&#xff09;&#xff1b;QKV GEMM \u52a0 pairwise&#043;nsplit&#061;1&#xff1b;attention \u6539 online softmax \u955c\u50cf\u3002<\/li>\n<li>\u771f\u673a\u9a8c\u8bc1&#xff1a;\u672a\u72ec\u7acb\u590d\u73b0&#xff1a;\u9700 30B &#043; VLLM_L2_DUMP&#xff08;530 key\/token&#xff0c;2120 key \u4e00\u6b21\u8dd1\u5b8c&#xff09;\u4e0e\u4f4d\u7ea7\u6863 A\/B\u3002<\/li>\n<\/ul>\n<h3>\u516d\u3001\u5c0f\u7ed3<\/h3>\n<li>\u5bf9\u62cd\u53c2\u8003\u8981\u9501\u6b7b token \u4f4d\u7f6e&#xff1b;top-1 \u5bf9\u62cd\u4f1a\u6f0f ULP\u3002 \u8de8\u4f4d\u7f6e\u6bd4\u8f83\u4f1a\u628a\u4e00\u4e2a token \u7684\u7ffb\u8f6c\u8bef\u5224\u6210\u53e6\u4e00\u4e2a token \u7684\u7ffb\u8f6c&#xff1b;\u8981\u8bc1\u4f4d\u7ea7&#xff0c;\u5fc5\u987b\u4e0b\u6c89\u5230\u5b8c\u6574 logits \u9010\u5b57\u8282&#xff08;\u6216\u9010\u5c42 hidden\/KV \u54c8\u5e0c&#xff09;\u3002<\/li>\n<li>CPU\u2194GPU \u4e0e batch\u2194M&#061;1 \u662f\u4e24\u4e2a\u6b63\u4ea4\u53e3\u5f84\u3002 \u524d\u8005\u53ef\u7ecf\u300c\u51fd\u6570\u7ea7\u5bf9\u9f50\u300d\u505a\u5230\u4f4d\u7ea7&#xff0c;\u540e\u8005\u662f\u6295\u673a\u7ea2\u7ebf\u3002<\/li>\n<li>\u8de8\u786c\u4ef6\u4f4d\u7ea7\u7684\u771f\u6b63\u62e6\u8def\u864e\u662f transcendental \u51fd\u6570\u3002 \u7b97\u5b50\u987a\u5e8f\u5bf9\u9f50\u4e0d\u591f\u2014\u2014expf\/logf\/rsqrt\/cosf\/sinf \u7684\u5b9e\u73b0\u5728\u4e0d\u540c\u8fd0\u884c\u5e93\u95f4\u4e0d\u540c\u3002\u672c\u6b21\u82e5\u6b62\u6b65\u4e8e\u300c\u6362 (float)exp(double)\u300d\u5c31\u53ea\u80fd\u5230 56\/64&#xff1b;\u53ea\u6709\u628a UCRT \u7684 expf \u4f4d\u7ea7\u590d\u523b&#xff08;\u542b\u5176\u81ea\u8eab 0.007% \u7684\u975e\u6b63\u786e\u820d\u5165\u884c\u4e3a&#xff09;\u624d\u5230 64\/64\u3002\u540c\u7406 1.0f\/sqrtf \u4e0e UCRT \u9010\u4f4d\u4e00\u81f4&#xff08;rsqrtf \u5dee 34.9%&#xff09;\u3001device cosf\/sinf \u5dee ~20%\u3002\u9006\u5411\u8fd0\u884c\u5e93\u51fd\u6570\u662f\u53ef\u884c\u8def\u5f84&#xff1a;dumpbin \/exports \u5b9a RVA \u2192 objdump -d \u8bfb\u7b97\u6cd5 \u2192 \u8fd0\u884c\u65f6\u8bfb\u5e38\u91cf\u8868 \u2192 \u590d\u523b \u2192 \u7528\u5927\u6837\u672c\u63a2\u9488\u8bc1 0 \u5dee\u5f02&#xff1b;\u6bd4\u300c\u76f2\u62df\u5408\u591a\u9879\u5f0f\u300d\u53ef\u9760\u5f97\u591a\u3002\u5199 FMA \u65f6\u8981\u5206\u6e05 132\/213\/231 \u5f62\u5f0f\u2014\u2014\u628a vfmadd213sd \u5199\u6210 xmm3*mem &#043; xmm1 \u4f1a\u8ba9\u591a\u9879\u5f0f\u6574\u4f53\u9519\u4f4d&#xff08;\u672c\u6b21 cosf \u9996\u7248 98% \u4e0d\u4e00\u81f4\u5c31\u662f\u8fd9\u4e2a&#xff09;\u3002<\/li>\n<li>L2 harness \u8981\u6309 key \u54c8\u5e0c\u3001\u53ef\u4e8c\u5206\u3002 \u7eaf token \u5e8f\u5217\u53ea\u80fd\u5224\u300c\u662f\u5426\u300d&#xff0c;\u9010\u5c42&#043;KV&#043;scale \u7684\u54c8\u5e0c key \u624d\u80fd\u628a\u9996\u4e2a\u5dee\u5f02\u9489\u5230\u5177\u4f53\u5c42\u4e0e\u5177\u4f53\u91cf\u2014\u2014\u672c\u6b21\u4e00\u8def\u9489\u5230 t32_l0_kraw \u2192 _qrope \u2192 _attn \u2192 _x&#xff0c;\u6ca1\u6709\u4e00\u6b65\u9760\u731c\u3002<\/li>\n<li>\u5bf9\u62cd\u914d\u7f6e\u672c\u8eab\u8981\u5e72\u51c0&#xff1b;\u6784\u5efa\u811a\u672c\u7684\u7ba1\u9053\u4f1a\u9a97\u4eba\u3002 \u7ed9\u88ab\u6d4b\u8def\u5f84\u52a0\u300c\u9884\u8f7d\u6743\u91cd\u300d\u8fd9\u7c7b\u5f00\u5173\u65f6&#xff0c;\u5f88\u5bb9\u6613\u8fde\u5e26\u6539\u52a8\u53c2\u8003\u4fa7\u7684\u4e0a\u6e38&#xff08;\u672c\u6b21 VLLM_CUDA_INFER&#061;1 \u8ba9 prefill \u4e5f\u4e0a\u4e86 GPU&#xff0c;\u4f7f KV \u884c\u6574\u4f53\u504f\u79bb&#xff0c;\u4f2a\u88c5\u6210 layer 0 \u7684 scale \u95ee\u9898&#xff09;\u3002\u5bf9\u62cd\u524d\u5148\u786e\u8ba4\u300c\u53c2\u8003\u4fa7\u4e0e\u88ab\u6d4b\u4fa7\u7684\u552f\u4e00\u5dee\u522b\u5c31\u662f\u88ab\u6d4b\u7684\u90a3\u4e00\u6bb5\u300d\u3002\u53e6\u5916&#xff0c;\u628a powershell -File build.ps1 | Select-String &#8230; \u548c\u591a\u6761\u540e\u7eed\u8bed\u53e5\u5199\u5728\u540c\u4e00\u6bb5\u547d\u4ee4\u91cc\u65f6&#xff0c;\u51fa\u73b0\u8fc7 exe \u6ca1\u88ab\u91cd\u94fe\u3001\u5374\u4ecd\u663e\u793a rc&#061;0 \u7684\u60c5\u51b5&#xff0c;\u5bfc\u81f4\u62ff\u7740\u65e7\u4e8c\u8fdb\u5236\u8bfb\u7ed3\u8bba\u2014\u2014\u6784\u5efa\u5fc5\u987b\u91cd\u5b9a\u5411\u5230\u65e5\u5fd7\u6587\u4ef6\u5e76\u5355\u72ec\u6821\u9a8c\u4ea7\u7269\u65f6\u95f4\u6233\u3002<\/li>\n<hr \/>\n<p>\u76f8\u5173\u7bc7\u76ee&#xff1a;\u7b2c 16 \u7bc7\u3001\u7b2c 17 \u7bc7\u3001\u7b2c 22 \u7bc7 \u6e90\u7801\u4e0e\u914d\u5957\u8d44\u6e90&#xff1a;\u672c\u4ed3\u5e93 https:\/\/gitee.com\/pei-xiaoguang\/kestrel-llm-cuda.git&#xff1b; CPU \u63a8\u7406\u6e90\u7801 https:\/\/gitee.com\/pei-xiaoguang\/kestrel-llm<\/p>\n","protected":false},"excerpt":{"rendered":"<p>18 \u00b7 \u6295\u673a\u89e3\u7801\u4f4d\u7ea7\u5bf9\u62cd\u6536\u53e3&#xff1a;batch \u4e0e M1 \u4e00\u81f4&#xff0c;\u6ce8\u610f\u529b\u8def\u5f84\u4e0e CPU \u9010\u5b57\u8282\u5bf9\u9f50 \u4e00\u53e5\u8bdd&#xff1a;\u628a\u300cM&gt;1 batch verify \u4e0e M1 decode\u300d\u7684\u5bf9\u62cd\u4ece top-1 \u4e0b\u6c89\u5230\u5b8c\u6574 logits \u9010\u5b57\u8282&#xff0c;\u7ea0\u6b63\u4e00\u5904 64-token \u957f\u5e8f\u5217\u7684\u8bef\u8bfb&#xff0c;\u5e76\u628a CPU\u2194GPU \u7684\u5206\u6b67\u4e00\u8def\u6d88\u5230 layer 0 \u7684 MoE FFN \u4e3a\u6b62\u2014\u2014\u5c42 0 \u6574\u6761\u6ce8\u610f\u529b\u8def\u5f84&#xff08;RMSNorm \u2192 QKV <\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[13178,868,841,2681,50,427],"topic":[],"class_list":["post-117433","post","type-post","status-publish","format-standard","hentry","category-server","tag-1024---","tag-868","tag-transformer","tag-vllm","tag-50","tag-427"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Kestrel_VLLM - 18 \u00b7 \u6295\u673a\u89e3\u7801\u4f4d\u7ea7\u5bf9\u62cd\u6536\u53e3\uff1abatch \u4e0e M=1 \u4e00\u81f4\uff0c\u6ce8\u610f\u529b\u8def\u5f84\u4e0e CPU \u9010\u5b57\u8282\u5bf9\u9f50 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/117433.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kestrel_VLLM - 18 \u00b7 \u6295\u673a\u89e3\u7801\u4f4d\u7ea7\u5bf9\u62cd\u6536\u53e3\uff1abatch \u4e0e M=1 \u4e00\u81f4\uff0c\u6ce8\u610f\u529b\u8def\u5f84\u4e0e CPU \u9010\u5b57\u8282\u5bf9\u9f50 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"18 \u00b7 \u6295\u673a\u89e3\u7801\u4f4d\u7ea7\u5bf9\u62cd\u6536\u53e3&#xff1a;batch \u4e0e M1 \u4e00\u81f4&#xff0c;\u6ce8\u610f\u529b\u8def\u5f84\u4e0e CPU \u9010\u5b57\u8282\u5bf9\u9f50 \u4e00\u53e5\u8bdd&#xff1a;\u628a\u300cM&gt;1 batch verify \u4e0e M1 decode\u300d\u7684\u5bf9\u62cd\u4ece top-1 \u4e0b\u6c89\u5230\u5b8c\u6574 logits \u9010\u5b57\u8282&#xff0c;\u7ea0\u6b63\u4e00\u5904 64-token \u957f\u5e8f\u5217\u7684\u8bef\u8bfb&#xff0c;\u5e76\u628a CPU\u2194GPU \u7684\u5206\u6b67\u4e00\u8def\u6d88\u5230 layer 0 \u7684 MoE FFN \u4e3a\u6b62\u2014\u2014\u5c42 0 \u6574\u6761\u6ce8\u610f\u529b\u8def\u5f84&#xff08;RMSNorm \u2192 QKV\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/117433.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-24T12:08:25+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/117433.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/117433.html\",\"name\":\"Kestrel_VLLM - 18 \u00b7 \u6295\u673a\u89e3\u7801\u4f4d\u7ea7\u5bf9\u62cd\u6536\u53e3\uff1abatch \u4e0e M=1 \u4e00\u81f4\uff0c\u6ce8\u610f\u529b\u8def\u5f84\u4e0e CPU \u9010\u5b57\u8282\u5bf9\u9f50 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-10-24T12:08:25+00:00\",\"dateModified\":\"2026-10-24T12:08:25+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/117433.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/117433.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/117433.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kestrel_VLLM - 18 \u00b7 \u6295\u673a\u89e3\u7801\u4f4d\u7ea7\u5bf9\u62cd\u6536\u53e3\uff1abatch \u4e0e M=1 \u4e00\u81f4\uff0c\u6ce8\u610f\u529b\u8def\u5f84\u4e0e CPU \u9010\u5b57\u8282\u5bf9\u9f50\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kestrel_VLLM - 18 \u00b7 \u6295\u673a\u89e3\u7801\u4f4d\u7ea7\u5bf9\u62cd\u6536\u53e3\uff1abatch \u4e0e M=1 \u4e00\u81f4\uff0c\u6ce8\u610f\u529b\u8def\u5f84\u4e0e CPU \u9010\u5b57\u8282\u5bf9\u9f50 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/117433.html","og_locale":"zh_CN","og_type":"article","og_title":"Kestrel_VLLM - 18 \u00b7 \u6295\u673a\u89e3\u7801\u4f4d\u7ea7\u5bf9\u62cd\u6536\u53e3\uff1abatch \u4e0e M=1 \u4e00\u81f4\uff0c\u6ce8\u610f\u529b\u8def\u5f84\u4e0e CPU \u9010\u5b57\u8282\u5bf9\u9f50 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"18 \u00b7 \u6295\u673a\u89e3\u7801\u4f4d\u7ea7\u5bf9\u62cd\u6536\u53e3&#xff1a;batch \u4e0e M1 \u4e00\u81f4&#xff0c;\u6ce8\u610f\u529b\u8def\u5f84\u4e0e CPU \u9010\u5b57\u8282\u5bf9\u9f50 \u4e00\u53e5\u8bdd&#xff1a;\u628a\u300cM&gt;1 batch verify \u4e0e M1 decode\u300d\u7684\u5bf9\u62cd\u4ece top-1 \u4e0b\u6c89\u5230\u5b8c\u6574 logits \u9010\u5b57\u8282&#xff0c;\u7ea0\u6b63\u4e00\u5904 64-token \u957f\u5e8f\u5217\u7684\u8bef\u8bfb&#xff0c;\u5e76\u628a CPU\u2194GPU \u7684\u5206\u6b67\u4e00\u8def\u6d88\u5230 layer 0 \u7684 MoE FFN \u4e3a\u6b62\u2014\u2014\u5c42 0 \u6574\u6761\u6ce8\u610f\u529b\u8def\u5f84&#xff08;RMSNorm \u2192 QKV","og_url":"https:\/\/www.wsisp.com\/helps\/117433.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-10-24T12:08:25+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"14 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/117433.html","url":"https:\/\/www.wsisp.com\/helps\/117433.html","name":"Kestrel_VLLM - 18 \u00b7 \u6295\u673a\u89e3\u7801\u4f4d\u7ea7\u5bf9\u62cd\u6536\u53e3\uff1abatch \u4e0e M=1 \u4e00\u81f4\uff0c\u6ce8\u610f\u529b\u8def\u5f84\u4e0e CPU \u9010\u5b57\u8282\u5bf9\u9f50 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-10-24T12:08:25+00:00","dateModified":"2026-10-24T12:08:25+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/117433.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/117433.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/117433.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"Kestrel_VLLM - 18 \u00b7 \u6295\u673a\u89e3\u7801\u4f4d\u7ea7\u5bf9\u62cd\u6536\u53e3\uff1abatch \u4e0e M=1 \u4e00\u81f4\uff0c\u6ce8\u610f\u529b\u8def\u5f84\u4e0e CPU \u9010\u5b57\u8282\u5bf9\u9f50"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/117433","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=117433"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/117433\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=117433"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=117433"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=117433"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=117433"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}