Lecture 6 Kernels, Triton 課程筆記

本講座:基準測試/分析 + 編寫內核

總結

編程模型(PyTorch、Triton、PTX)與硬件之間的差距 => 性能奧秘
理解擴展的基準測試
用于理解 PyTorch 函數內部結構的分析(用內核觸底)
看 PTX 匯編,了解 CUDA 內核的內部結構
編寫函數的 5 種方法:manual、PyTorch、編譯、CUDA、Triton
GeLU(按元素)、softmax(按行)、matmul(復聚合)
關鍵原則:組織計算以盡量減少讀/寫
關鍵思想:內核融合(倉庫/工廠類比)、平鋪(共享內存)
自動編譯器(Triton、torch.compile)會隨著時間的推移而變得更好

硬件

![[Pasted image 20250815095146.png]]

計算:流式多處理器 (SM) [A100:108]
內存:
DRAM [A100: 80GB] - 大而慢
二級緩存 [A100: 40MB]
L1 緩存 [A100:每 SM 192KB] - 小、快

執行模型

![[Pasted image 20250815095139.png]]

線程:進程單個索引(即 f(i))
線程塊:(又名并發線程數組):在單個 SM 上調度
網格 :線塊的集合

為什么使用線程塊?共享內存。

直觀理解:將讀取相似數據的 f(i)分組在一起
線程塊內的線程擁有共享內存(速度與 L1 緩存相當)[A100: 164KB]
可以在塊內同步線程(用于讀取/寫入),但不能跨塊同步

硬件與執行相互作用

![[Pasted image 20250815095210.png]]

線程塊以波次形式調度到 SM 上。
問題:最后一波次線程塊較少,導致部分 SM 空閑(低占用率)。
波形量化:使線程塊數量能被 SM 數量整除。
經驗法則:線程塊的數量應該 >= 4 倍的 SM 數量
挑戰:執行模型中隱藏了一些硬件方面的特性(例如,調度、SM 數量)。

算術強度:每字節的浮點運算次數

如果數值較高,表示操作是計算密集型(好)
如果數值較低,表示操作是內存密集型(壞)
一般規則:矩陣乘法是計算密集型,其他操作都是內存密集型

重要提示:請測試和分析您的代碼!

您可以閱讀規格表(營銷材料)和論文
但性能取決于您的庫版本、硬件和工作負載
因此,測試和分析您的代碼是必不可少的。

示例計算:在多層感知機(MLP)上運行前向/后向傳播。

run_mlp(dim=128, num_layers=16, batch_size=128, num_steps=5)
benchmarking() # 用時多久?profiling() # 時間花在哪里?

每次做修改時,請務必進行基準測試/性能分析!

矩陣乘法基準測試

首先,我們來基準測試方形矩陣的矩陣乘法。

![[Pasted image 20250815100516.png]]
![[Pasted image 20250815100527.png]]

在1024和2048上,時間幾乎沒有增加
因為在執行時這些矩陣乘法時存在恒定因子的開銷,如從CPU傳送到GPU、啟動內核

讓我們測試一下我們的多層感知機!

![[Pasted image 20250815100744.png]]

每次MLP執行大約需要五秒鐘

性能分析

雖然基準測試關注的是端到端時間,但性能分析則關注時間的具體花費位置。
很明顯:性能分析可以幫助你了解時間具體花費在哪些地方。
更深入:性能分析幫助你了解(被調用的內容)。
PyTorch 有一個內置的性能分析器 https://pytorch.org/tutorials/recipes/recipes/profiler_recipe.html
讓我們對一些代碼進行性能分析,看看幕后發生了什么。

CUDA

CUDA 是 C/C++ 的擴展,包含管理 GPU 的 API。
我們將編寫一些函數f,當調用這個CUDA內核時,它將自動對向量或矩陣的所有元素調用f,然后我們將并行計算我們想要的一切
網格:
線程塊的集合:numBlocks = (2, 4),blockDim = (1, 8)

線程塊:
線程的集合:blockIdx = (0, 1)

線程:
單個操作單元:threadIdx = (0, 3)。

你編寫線程執行的代碼,并使用 (blockIdx, blockDim, threadIdx) 來確定要執行的操作。
設置 CUDA_LAUNCH_BLOCKING,以便如果有錯誤,CUDA 會告訴你哪里出了問題。

os.environ["CUDA_LAUNCH_BLOCKING"] = "1"

load_inline 函數使得編寫 CUDA 代碼并將其綁定到 Python 模塊變得方便,以便立即使用。

CUDA 代碼:包含完整的邏輯

實際內核所在,這將被發送到GPU,并進行計算,然后返回結果
![[Pasted image 20250815104644.png]]

這是一個包裝器,將協調內核的啟動,內核實際上存在于GPU中

TORCH_CHECK(x.device().is_cuda());//確保x存在于GPU設備中
TORCH_CHECK(x.is_contiguous());//確保x是連續的,位于連續的內存塊中
// Allocate empty tensor
torch::Tensor y = torch::empty_like(x);

![[Pasted image 20250815104736.png]]

總結

  1. 編程模型(如PyTorch、Triton、PTX)與硬件的“差距”為何會導致性能差異?
    不同編程模型對硬件細節的抽象程度不同:PyTorch封裝了底層邏輯,易用但可能未充分利用硬件特性;Triton提供中間抽象,平衡靈活性與性能;PTX接近硬件指令,可控性最高但復雜度大。這種抽象差距導致對內存訪問、線程調度等硬件細節的優化程度不同,最終體現為性能差異。

  2. GPU執行模型中,線程、線程塊、網格的關系及對硬件利用率的影響是什么?
    線程是最小執行單元,負責單個索引操作;線程塊是線程的集合,在單個SM上調度,共享塊內共享內存;網格是線程塊的集合。線程塊數量需與SM數量匹配(建議≥4倍SM數),否則易因“最后一波次線程塊不足”導致SM空閑,降低硬件利用率。

  3. 算術強度的定義及對GPU性能的指導意義是什么?
    算術強度指每字節數據傳輸對應的浮點運算次數。數值高表示計算密集型(如矩陣乘法),能充分利用GPU算力;數值低表示內存密集型(如多數逐元素操作),易受內存帶寬限制。優化需針對類型調整策略:計算密集型提升并行效率,內存密集型減少數據傳輸。

  4. 基準測試與性能分析的核心區別及各自作用?
    基準測試關注端到端時間,用于評估整體性能(如矩陣乘法不同尺寸的耗時);性能分析聚焦時間分布,定位具體瓶頸(如哪部分內核、內存操作耗時最長)。二者結合:基準測試衡量優化效果,性能分析指導優化方向。

  5. CUDA內核編寫中,線程塊設計需考慮哪些硬件特性?共享內存的關鍵作用是什么?
    線程塊設計需匹配SM資源:受限于共享內存大小(如A100每塊164KB)、線程數上限,并需保證內存訪問合并(匹配DRAM突發傳輸)。共享內存位于SM內部,速度接近L1緩存,核心作用是緩存塊內重復訪問的數據,減少全局內存讀寫,提升數據重用效率。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919929.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919929.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919929.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot 整合網易163郵箱發送郵件實現找回密碼功能

在開發用戶系統時,發送郵件是一項常見需求,例如用戶忘記密碼時,通過郵箱發送驗證碼來驗證身份并重置密碼。本文將結合 Spring Boot 和 163 郵箱,演示如何實現郵件發送功能。 一、前提條件 普通用戶的 163 郵箱可以在 Spring Boot…

如何在mac玩windows游戲?3個工具推薦,不用換電腦!

Mac電腦雖然很流暢,但它也存在局限性,其中一點游戲玩家應該深有體會,那就是無法直接玩Windows專屬游戲,只能對著琳瑯滿目的游戲望眼欲穿。別急,我有辦法讓你在mac玩windows游戲,下面就來分享我的經驗。一、…

自回歸(Auto-Regressive, AR),自回歸圖像生成過程

根據論文中“**T2I Generation via Next-Token Prediction**”一節,自回歸(Auto-Regressive, AR)文本到圖像(T2I)模型的圖像生成過程可分為三個主要步驟,其原理和損失函數如下:---### &#x1f…

在mysql中,modify ,change ,rename to的作用是什么

在 MySQL 中,MODIFY、CHANGE 和 RENAME TO 都是 ALTER TABLE 語句的一部分,用于修改表的結構,但它們的作用和使用場景有所不同。1. MODIFY作用:用于修改表中現有列的定義,但不能修改列名。你可以使用 MODIFY 來更改列的…

【JVM】JVM的內存結構是怎樣的?

JVM的內存結構是Java程序運行時內存管理的核心,不同區域有明確的職責。 一、整體劃分 包括兩大部分,分為線程私有區域(隨線程創建/銷毀,無需垃圾回收)和線程共享區域(所有線程共用,需要垃圾回收管理)。 線程私有區域:程…

青少年軟件編程(python五級)等級考試試卷-客觀題(2023年12月)

更多內容和歷年真題請查看網站:【試卷中心 -----> 電子學會 ----> 機器人技術 ----> 五級】 網站鏈接 青少年軟件編程歷年真題模擬題實時更新 青少年軟件編程(python五級)等級考試試卷-客觀題(2023年12月&#xff0…

網絡編程-創建TCP協議服務器

int socket(int domain, int type, int protocol);頭文件&#xff1a; #include <sys/socket.h>#include <netinet/in.h> #include <netinet/ip.h>int skt_tcpfd;int domain;skt_tcpfdsocket(AF_INET,SOCK_STREAM,0);int bind(int sockfd, const struct soc…

ruoyi框架角色分配用戶

分配用戶&#xff0c;不要將當前正在登錄的用戶綁定。否則&#xff0c;在加入當前用戶之后&#xff0c;取消或者添加其他用戶時會被注銷當前登錄。

Java Stream常見函數與應用案例

1. Java Stream核心概念與基礎函數 1.1 Stream API的設計哲學與核心特性 Java Stream API的設計哲學源于函數式編程范式&#xff0c;其核心特性體現在數據處理模式的轉變上。與傳統集合操作相比&#xff0c;Stream API采用聲明式編程風格&#xff0c;支持鏈式調用&#xff0c;顯…

【Canvas與徽章】中國制造金色玻璃光徽章

【成圖】【代碼】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>中國制造金色玻璃光徽章 Draft1</title><style type"tex…

終結系統裸奔:Debian老舊版本安全加固終極指南

核心警示:Debian 8與10已結束官方支持,暴露于0day漏洞風險中。本文提供的加固方案僅為遷移前的臨時防護措施,非長久之計。 一、老舊Debian系統的致命隱患 支持狀態: Debian 8(Jessie):2018年終止安全更新 Debian 10(Buster):2024年7月結束主流支持 風險清單: 無補…

Ape.Volo項目源碼學習(1:源碼下載及運行)

Ape.Volo項目是基于 .Net 8 、SqlSugar、Vue2.x、RBAC、前后端分離開箱則用的中后臺快速開發框架&#xff0c;其使用Async/Await異步編程&#xff0c;支持CodeFirst模式、RabbitMQ/RedisMQ消息隊列、CORS 跨域配置、數據庫操作&#xff08;讀寫分離、多庫、分表&#xff09;、支…

2-4.Python 編碼基礎 - 流程控制(判斷語句、循環語句、break 語句與 continue 語句)

一、判斷語句 1、if 語句 &#xff08;1&#xff09;基本格式 if 【判斷條件】:【滿足條件時執行的代碼塊】&#xff08;2&#xff09;演示 number 10if number > 0:print("這個數是正數")# 輸出結果這個數是正數2、if - else 語句 &#xff08;1&#xff09;基本…

大模型自我進化框架SE-Agent:開啟軟件工程自動化新時代

一、引言&#xff1a;當大模型學會“自我進化” 在軟件開發領域&#xff0c;傳統模式下人類工程師面對復雜任務時&#xff0c;往往需要經歷反復調試、多輪迭代才能產出高質量代碼。而隨著大語言模型&#xff08;LLM&#xff09;的興起&#xff0c;一種名為**SE-Agent&#xff…

UE官方文檔學習 C++ TAarry 查詢(四)多種查詢方式

一.IndexofByKey 返回索引通過值&#xff0c;返回來查找鍵。二IndexOfByPredicate通過定義二元謂詞&#xff0c;來判定是否有符合謂詞判定的元素。符合條件True的&#xff0c;才返回Index。這里所謂Lamda,函數就是 把函數當作參數輸入&#xff0c;里面的參數值傳遞前加個[]。這…

根據Wireshark捕獲數據包時間和長度繪制電腦發射信號波形

下一期&#xff1a; 根據Wireshark捕獲數據包時間和長度繪制路由器發送給電腦數據的信號波形-CSDN博客 一、Wireshark采集數據 數據格式&#xff1a; 在我的另一篇博客中詳細介紹了怎么導出數據&#xff1a; Wireshark導出數據包時間和長度-CSDN博客 通過MATLAB加載數據&a…

Suno API 接入指南:快速上手與高效集成

隨著 AI 技術的發展&#xff0c;音樂生成已經逐漸成為開發者和創作者探索的新方向。Suno API 提供了一套簡潔的接口&#xff0c;讓我們能夠通過代碼快速生成音樂、歌詞&#xff0c;甚至旋律。本文將帶你從零開始&#xff0c;完成 Suno API 的接入與調用&#xff0c;并分享一些高…

React Hooks原理深潛:從「黑魔法」到「可觀測」的蛻變之旅

文章目錄【技術棧深潛計劃】React Hooks原理深潛&#xff1a;從「黑魔法」到「可觀測」的蛻變之旅一、引言&#xff1a;為什么我們需要“深潛”Hooks&#xff1f;二、基石&#xff1a;沒有JavaScript閉包&#xff0c;就沒有Hooks2.1 閉包的精簡回顧2.2 Hooks與閉包的關聯三、核…

MySql知識梳理之DDL語句

例子&#xff1a;為emp表增加一個新的字段”昵稱”為nickname&#xff0c;類型為varchar(20)alter table emp add nickname varchar(20) comment 昵稱;例子&#xff1a;將emp表的nickname字段修改為username&#xff0c;類型為varchar(30)ALTER TABLE emp CHANGE nickname us…

Games 101 第四講 Transformation Cont(視圖變換和投影變換)

三維變換 三種變換 下面分別是放縮&#xff0c;旋轉&#xff0c;平移在旋轉當中&#xff0c;繞著y軸旋轉矩陣的順序不一樣&#xff0c;因為繞著y軸轉在右手坐標系中 &#xff0c;z是第一軸&#xff0c;x是第二軸&#xff0c;而負號會加在第一軸上&#xff0c;因此負號在下面。 …