[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-cuda-cp-async-ampere-hbm-latency-zh":3,"article-related-cuda-cp-async-ampere-hbm-latency-zh":28,"series-research-d458f7db-1e28-4cf1-9bd8-ad9c95dee997":87},{"id":4,"slug":5,"title":6,"content":7,"summary":8,"source":9,"source_url":10,"author":11,"image_url":12,"cover_image":12,"category":13,"language":14,"translated_content":11,"related_article_id":15,"keywords":16,"key_takeaways":11,"views":25,"created_at":26,"published_at":27,"topic_cluster_id":11},"d458f7db-1e28-4cf1-9bd8-ad9c95dee997","cuda-cp-async-ampere-hbm-latency-zh","Ampere 的 cp.async 怎麼藏 HBM 延遲","\u003Cp>在 \u003Ca href=\"https:\u002F\u002Fwww.nvidia.com\u002Fen-us\u002Fdata-center\u002Fa100\u002F\" target=\"_blank\" rel=\"noopener\">NVIDIA A100\u003C\u002Fa> 上，HBM2e 一次載入大約要 450 到 600 cycles。這個數字很殘酷。你如果什麼都不做，一個 warp 可能就卡在那邊發呆。\u003C\u002Fp>\u003Cp>Am\u003Ca href=\"\u002Fnews\u002Fopenai-vs-deepmind-models-apps-2026-zh\">pe\u003C\u002Fa>re 的 \u003Ccode>cp.async\u003C\u002Fcode> 很有意思。它把資料直接搬進 shared memory。它不先佔住 register，也不會把 long scoreboard 拉滿。講白了，就是讓你先做別的事，再回頭收資料。\u003C\u002Fp>\u003Cp>這篇文章要談的，不只是指令本身。重點是思維切換。你不再想「先 load，再 compute」。你要想的是「資料先飛，算力先跑」。\u003C\u002Fp>\u003Ch2>A100 的記憶體階層，才是主角\u003C\u002Fh2>\u003Cp>A100 的效能，不是只看 CUDA core 數量。真正決定速度的，常常是記憶體階層。Registers 很快，但每個 thread 只有 255 個上限。Shared memory 和 L1 共享 192 KB。L2 cache 有 40 MB。HBM2e 理論頻寬可到 2 TB\u002Fs，但實戰通常沒那麼漂亮。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1775167621432-n9fo.png\" alt=\"Ampere 的 cp.async 怎麼藏 HBM 延遲\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>這些數字不是規格表裝飾品。它們直接決定 kernel 會不會翻車。Register spill 會掉到 local memory。那就是 global memory 等級的痛。Shared memory 如果打到 bank conflict，warp 也會被迫排隊。L2 miss 太多，延遲就會飆上去。\u003C\u002Fp>\u003Cp>所以你看到 source code 很順，不代表跑起來就順。GPU 最愛在這種地方打臉人。尤其是資料路徑一長，問題就會被放大。\u003C\u002Fp>\u003Cul>\u003Cli>Register file：每個 SM 約 256 KB\u003C\u002Fli>\u003Cli>Shared memory bank：32 個 bank，每個 4 bytes 寬\u003C\u002Fli>\u003Cli>L2 cache：A100 上是 40 MB\u003C\u002Fli>\u003Cli>HBM2e 理論頻寬：2 TB\u002Fs\u003C\u002Fli>\u003Cli>HBM2e 延遲：大約 450 到 600 cycles\u003C\u002Fli>\u003C\u002Ful>\u003Cp>所以 \u003Ccode>cp.async\u003C\u002Fcode> 的目的很明確。它不是消滅延遲。它是把延遲藏起來。這兩件事差很多。\u003C\u002Fp>\u003Ch2>\u003Ca href=\"https:\u002F\u002Fdocs.nvidia.com\u002Fcuda\u002Fparallel-thread-execution\u002Findex.html\" target=\"_blank\" rel=\"noopener\">cp.async\u003C\u002Fa> 到底改了什麼\u003C\u002Fh2>\u003Cp>傳統 global load 會先進 register。這代表 warp 要等資料回來，才能繼續用那些目的暫存器。硬體會把這段等待算進 long scoreboard。你就只能乾等。\u003C\u002Fp>\u003Cp>\u003Ccode>cp.async\u003C\u002Fcode> 不一樣。它把資料直接從 global memory 搬到 shared memory。中間不經過目的 register。這樣一來，warp 發出指令後，可以立刻去做其他運算。\u003C\u002Fp>\u003Cp>這個差異看起來很小，實際上很兇。因為它把 load 和 compute 拆開了。你可以在算上一批 tile 的時候，讓下一批資料自己飛進來。這就是 overlap。\u003C\u002Fp>\u003Cblockquote>“Latency hiding is the name of the game.” — Mark Harris\u003C\u002Fblockquote>\u003Cp>這句話很老派，但一直有效。\u003Ca href=\"https:\u002F\u002Fdeveloper.nvidia.com\u002Fblog\u002Fauthor\u002Fmarkharris\u002F\" target=\"_blank\" rel=\"noopener\">Mark Harris\u003C\u002Fa> 一直在講同一件事。GPU 程式設計的核心，不是讓記憶體變快。是讓算力不要閒著。\u003C\u002Fp>\u003Cp>我覺得 \u003Ccode>cp.async\u003C\u002Fcode> 厲害的地方，就在這裡。它不是魔法。它是把原本硬碰硬的等待，改成排程問題。\u003C\u002Fp>\u003Ch2>commit、wait、double buffer 才是實戰\u003C\u002Fh2>\u003Cp>\u003Ccode>cp.async.commit_g\u003Ca href=\"\u002Fnews\u002Fkiro-aws-healthomics-bioinformatics-workflow-zh\">ro\u003C\u002Fa>up\u003C\u002Fcode> 和 \u003Ccode>cp.async.wait_group\u003C\u002Fcode> 這組搭配，才是實戰重點。前者只是做分組記帳。後者則是等到還剩幾組在飛。你如果設成 \u003Ccode>wait_group 1\u003C\u002Fcode>，就代表允許一組還在路上。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1775167618039-xf30.png\" alt=\"Ampere 的 cp.async 怎麼藏 HBM 延遲\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>這樣就能做 double buffer。A buffer 在算，B buffer 在載。下一輪再交換。Kernel 不需要把 memory 變快。它只要讓 machine 一直忙。\u003C\u002Fp>\u003Cp>這種做法很像工廠產線。不是每個工人都等同一個零件。是把流程拆開，讓每個站都不空轉。GPU 很吃這套。\u003C\u002Fp>\u003Cul>\u003Cli>傳統路徑：load 到 register，再等資料回來\u003C\u002Fli>\u003Cli>\u003Ccode>cp.async\u003C\u002Fcode> 路徑：直接進 shared memory\u003C\u002Fli>\u003Cli>\u003Ccode>commit_group\u003C\u002Fcode>：把一批 async copy 分組\u003C\u002Fli>\u003Cli>\u003Ccode>wait_group 1\u003C\u002Fcode>：保留一組在飛，其他先算\u003C\u002Fli>\u003C\u002Ful>\u003Cp>但這裡有代價。Shared memory 佔用會增加。stage 數一多，occupancy 可能掉。這不是免費午餐。你如果 kernel 算術密度不夠，可能反而賠。\u003C\u002Fp>\u003Cp>所以像 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fcutlass\" target=\"_blank\" rel=\"noopener\">CUTLASS\u003C\u002Fa> 這種 library，才會把 pipeline depth 當成可調參數。不是每個 kernel 都適合同一種 stage 數。這種事真的只能量。\u003C\u002Fp>\u003Ch2>Profiler 看到的差別很直接\u003C\u002Fh2>\u003Cp>你如果想知道 kernel 有沒有吃到 \u003Ccode>cp.async\u003C\u002Fcode> 的好處，別先看感覺。直接看 profiler。傳統 load-heavy kernel，常常是 long scoreboard stall 佔大頭。你會看到 warp 很多時間都在等資料。\u003C\u002Fp>\u003Cp>改成好的 pipelined 版本後，情況會變。long scoreboard 會明顯下降。FMA pipe 會更忙。這才是你要的畫面。不是「理論頻寬很高」，而是「實際有在算」。\u003C\u002Fp>\u003Cp>這裡有個常見誤區。很多人只盯著 bandwidth。其實 kernel 快不快，不只看搬多少 GB\u002Fs。更重要的是，搬資料的時候，有沒有順便把 compute 填滿。\u003C\u002Fp>\u003Cul>\u003Cli>改前：\u003Ccode>smsp__warp_issue_stalled_long_scoreboard\u003C\u002Fcode> 常見 40% 到 70%\u003C\u002Fli>\u003Cli>改後：long scoreboard 可能降到 5% 以下\u003C\u002Fli>\u003Cli>調好後：\u003Ccode>smsp__pipe_fma_cycles_active\u003C\u002Fcode> 可到 70% 到 90%\u003C\u002Fli>\u003Cli>A100 L2 帶寬：約 4 TB\u002Fs aggregate\u003C\u002Fli>\u003C\u002Ful>\u003Cp>如果你想自己看，\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fcuda-samples\" target=\"_blank\" rel=\"noopener\">NVIDIA CUDA Samples\u003C\u002Fa> 是很好的起點。先看原版 kernel，再做一版 tiled + async copy。差異通常很明顯。\u003C\u002Fp>\u003Cp>工具面也別省。\u003Ca href=\"https:\u002F\u002Fdocs.nvidia.com\u002Fcuda\u002Fprofiler-users-guide\u002Findex.html\" target=\"_blank\" rel=\"noopener\">NVIDIA Nsight Compute\u003C\u002Fa> 的 stall reason 和 issue activity，真的值得看。沒有這些數據，很多優化都只是猜。\u003C\u002Fp>\u003Ch2>跟 Hopper 比，Ampere 還差哪裡\u003C\u002Fh2>\u003Cp>如果你把視野拉大，Ampere 只是中繼站。Hopper 又往前推了一步。它有 \u003Ca href=\"https:\u002F\u002Fwww.nvidia.com\u002Fen-us\u002Fdata-center\u002Fhopper-gpu-architecture\u002F\" target=\"_blank\" rel=\"noopener\">Tensor Memory Accelerator\u003C\u002Fa>，也就是 TMA。這東西把資料搬運再往硬體化推進。\u003C\u002Fp>\u003Cp>這代表什麼？代表資料移動越來越不像 blocking load。它更像一個可排程的搬運任務。程式設計師還是要想資料布局，但不用把每次搬運都當成同步事件。\u003C\u002Fp>\u003Cp>我自己的看法很直接。你如果還在寫那種「load、wait、compute、repeat」的 kernel，通常還有空間可以挖。尤其在 A100 這種卡上，\u003Ccode>cp.async\u003C\u002Fcode> 很值得試。\u003C\u002Fp>\u003Cul>\u003Cli>Ampere：靠 \u003Ccode>cp.async\u003C\u002Fcode> 做 overlap\u003C\u002Fli>\u003Cli>Hopper：再往前，加入 TMA\u003C\u002Fli>\u003Cli>競品面：AMD ROCm 也在推資料搬運優化，但 API 路線不同\u003C\u002Fli>\u003Cli>實務面：GEMM、convolution、stencil 類 kernel 最常吃到好處\u003C\u002Fli>\u003C\u002Ful>\u003Cp>但別亂上。不是每個 kernel 都適合 async copy。資料量太小、算術密度太低，或 occupancy 已經很差的時候，硬上只會更亂。先量，再改。\u003C\u002Fp>\u003Ch2>這件事其實是 CUDA 老問題的新解法\u003C\u002Fh2>\u003Cp>CUDA 很多年來都在講 overlap。只是早期工具沒那麼順。你要自己拆 load、自己控同步、自己顧 pipeline。現在 \u003Ccode>cp.async\u003C\u002Fcode> 只是把這套做得更自然。\u003C\u002Fp>\u003Cp>這也解釋了為什麼很多高效能 library 都很愛它。像 GEMM、att\u003Ca href=\"\u002Fnews\u002Fprompt-engineering-agents-structured-outputs-zh\">ent\u003C\u002Fa>ion、卷積這些工作，資料搬運本來就很重。只要能把搬運藏到計算後面，整體效率就會好看很多。\u003C\u002Fp>\u003Cp>台灣做 AI 軟體的人，很多都只盯模型。其實底層 kernel 才是血肉。模型跑得快，不只是 Transformer 參數多。還要看資料怎麼走。這點很現實，也很煩，但就是事實。\u003C\u002Fp>\u003Ch2>下一步怎麼做\u003C\u002Fh2>\u003Cp>如果你手上有 A100 或其他 Ampere GPU，我會建議你先挑一個熱點 kernel。看它是不是被 long scoreboard 卡住。再試一版 double-buffer 的 \u003Ccode>cp.async\u003C\u002Fcode> 寫法。不要一次改太多。\u003C\u002Fp>\u003Cp>如果 stall 比例下降，FMA 利用率上升，那就代表方向對了。若沒有，問題可能在資料布局、shared memory bank conflict，或 occupancy 本身。這時候別硬拗，回頭看 profiler。\u003C\u002Fp>\u003Cp>說到底，\u003Ccode>cp.async\u003C\u002Fcode> 的價值很務實。它不是讓 HBM 變不慢。它是讓你少等一點。對做 CUDA 的人來說，少等 100 個 cycles，常常就夠有感了。\u003C\u002Fp>\u003Cp>你如果現在就在調 kernel，我的建議很簡單：先量 long scoreboard，再試 async pipeline。別先信直覺。GPU 很少照直覺走。\u003C\u002Fp>","A100 上一次 HBM2e 載入約要 450 到 600 cycles。Ampere 的 cp.async 讓資料直進 shared memory，搭配 pipeline 把等待時間藏進計算裡。","softwarefrontier.substack.com","https:\u002F\u002Fsoftwarefrontier.substack.com\u002Fp\u002Fmastering-cuda-and-high-performance-ea1",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1775167621432-n9fo.png","research","zh","68bfa04a-94c4-4c8a-921c-61e93ab207aa",[17,18,19,20,21,22,23,24],"CUDA","cp.async","Ampere","A100","HBM2e","shared memory","Nsight Compute","CUTLASS",2,"2026-04-02T22:06:36.022671+00:00","2026-04-02T22:06:35.906+00:00",{"tags":29,"relatedLang":46,"relatedPosts":50},[30,32,34,36,38,40,42,44],{"name":18,"slug":31},"cpasync",{"name":24,"slug":33},"cutlass",{"name":17,"slug":35},"cuda",{"name":23,"slug":37},"nsight-compute",{"name":22,"slug":39},"shared-memory",{"name":21,"slug":41},"hbm2e",{"name":19,"slug":43},"ampere",{"name":20,"slug":45},"a100",{"id":15,"slug":47,"title":48,"language":49},"cuda-cp-async-ampere-hbm-latency-en","cp.async on Ampere: Hide HBM Latency on A100","en",[51,57,63,69,75,81],{"id":52,"slug":53,"title":54,"cover_image":55,"image_url":55,"created_at":56,"category":13},"33c9a55c-a8c0-4367-b742-f4567d1e98e3","mathematicians-warn-ai-could-distort-math-zh","數學界警告 AI 會扭曲證明標準","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780504386035-080l.png","2026-06-03T16:32:29.415063+00:00",{"id":58,"slug":59,"title":60,"cover_image":61,"image_url":61,"created_at":62,"category":13},"5c3cb90f-7efd-426f-8c09-32a303f82be9","humanoid-gpt-zero-shot-motion-tracking-zh","Humanoid-GPT：用 GPT 擴大動作追蹤","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780469319284-znpc.png","2026-06-03T06:47:34.463464+00:00",{"id":64,"slug":65,"title":66,"cover_image":67,"image_url":67,"created_at":68,"category":13},"e3a4b0f7-03b3-43c6-ae51-906b337c5c2f","ipt-vlms-hidden-space-reasoning-zh","IPT 讓 VLM 更會想像隱藏空間","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780468394735-1k40.png","2026-06-03T06:32:46.560029+00:00",{"id":70,"slug":71,"title":72,"cover_image":73,"image_url":73,"created_at":74,"category":13},"5fca9fe5-af66-47ce-85f0-0ffe1bee30b9","neuron-selectivity-changes-with-scale-zh","神經元選擇性會隨規模改變","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780467514422-7oss.png","2026-06-03T06:17:44.126547+00:00",{"id":76,"slug":77,"title":78,"cover_image":79,"image_url":79,"created_at":80,"category":13},"9f9c2a61-d058-4c62-bb88-106e683657f0","nasa-landsat-wild-disturbances-rising-zh","NASA Landsat：野火與風暴變多","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780448581102-owp0.png","2026-06-03T01:02:37.513233+00:00",{"id":82,"slug":83,"title":84,"cover_image":85,"image_url":85,"created_at":86,"category":13},"3479bdee-21fb-4fda-9572-9394caba01b0","adacodec-predictive-visual-code-video-mllms-zh","AdaCodec 用預測碼壓縮影片 token","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1780381988591-z2sp.png","2026-06-02T06:32:28.249023+00:00",[88,93,98,103,108,113,118,123,128,133],{"id":89,"slug":90,"title":91,"created_at":92},"f18dbadb-8c59-4723-84a4-6ad22746c77a","deepmind-bets-on-continuous-learning-ai-2026-zh","DeepMind 押注 2026 連續學習 AI","2026-03-26T08:16:02.367355+00:00",{"id":94,"slug":95,"title":96,"created_at":97},"f4a106cb-02a6-4508-8f39-9720a0a93cee","ml-papers-of-the-week-github-research-desk-zh","每週 ML 論文清單，為何紅到 GitHub","2026-03-27T01:11:39.284175+00:00",{"id":99,"slug":100,"title":101,"created_at":102},"c4f807ca-4e5f-47f1-a48c-961cf3fc44dc","ai-ml-conferences-to-watch-in-2026-zh","2026 AI 研討會投稿時程整理","2026-03-27T01:51:53.874432+00:00",{"id":104,"slug":105,"title":106,"created_at":107},"cf046742-efb2-4753-aef9-caed5da5e32e","adaptive-block-scaled-data-types-zh","IF4：神經網路量化的聰明選擇","2026-03-31T06:00:36.990273+00:00",{"id":109,"slug":110,"title":111,"created_at":112},"53a0dc54-0371-4e40-8d5e-74e94a73840c","geometry-aware-similarity-metrics-for-neural-representations-zh","超越距離測量：用微分幾何重新理解神經網路","2026-03-31T06:01:01.241968+00:00",{"id":114,"slug":115,"title":116,"created_at":117},"fee7d472-a775-4b1d-bbc2-1e8bca1bbf8b","on-the-fly-repulsion-in-the-contextual-space-for-rich-divers-zh","讓AI繪圖更有創意：用排斥力提升生成多樣性","2026-03-31T06:01:25.439673+00:00",{"id":119,"slug":120,"title":121,"created_at":122},"a9901203-d69b-447b-8854-15d14eab32b4","vision-aided-beam-prediction-cnn-eca-zh","影像輔助波束預測升級 CNN","2026-04-01T10:00:25.8073+00:00",{"id":124,"slug":125,"title":126,"created_at":127},"b55e7dd4-0a24-4b3d-804d-b0309a03f498","triple-band-fss-mimo-antenna-sub-6-ghz-zh","三頻 FSS MIMO 天線瞄準 sub-6 GHz","2026-04-01T13:18:36.857305+00:00",{"id":129,"slug":130,"title":131,"created_at":132},"f68290bd-e7f3-4b30-ba22-dcd4e0130a66","openclaw-1299-repos-eight-weeks-analysis-zh","OpenClaw 1299 個 Repo 的資料解讀","2026-04-02T05:03:45.208411+00:00",{"id":134,"slug":135,"title":136,"created_at":137},"ed9f80eb-eb02-4d35-8ad4-0ddf428751dd","beam-coherence-aware-combining-mmwave-mimo-zh","毫米波 MIMO 的雙階合併法","2026-04-02T05:27:26.897188+00:00"]