GPU Microarch 學習筆記 [1]

WARP

GPU的線程從thread grid 到thread block,一個thread block在CUDA Core上執行時,會分成warp執行,warp的顆粒度是32個線程。比如一個thread block可能有1024個線程,分成32個warp執行。

?

上圖的CTA(cooperative thread arrays)即為thread block。

Warp內的32個線程是以lock-step的方式鎖步執行,也就是在沒有遇到分支指令的情況下,如果執行,那么執行的都是相同的指令。通過這種方式32個線程可以共享pc,源寄存器ID和目標寄存器ID。

雖然warp是以32的顆粒度,但是具體在GPU內部執行時,也可能是以16的顆粒度,分兩次執行,比如早期的fermi架構。

如上圖所示,兩個warp scheduler,每個warp每次只能在16個CUDA core上執行。

后續的Pascal GPU架構 CUDA core增加到了32個,每個周期都能執行一個warp。

寄存器

GPU的寄存器數量是影響劃分CUDA thread block的數量的原因之一。

雖然內部執行是按照warp執行的,按照調度順序和ready進行調度。但是寄存器的分配是靜態的按照thread number分配的,而不是warp。在warp執行時,32個線程,每個線程讀取源寄存器,寫入目標寄存器。假設每個寄存器4B,那么每次32個線程讀取128B。

因而128B也就是GPU L1 Cache Cacheline的大小。不同于CPU,每一級的cache都要維護MOSEI的一致性,對于GPU的thread來說,私有memory不需要共享,因此對于local memory可以write back。而全局共享memory則可以write evict。

CPU的寄存器,在編譯器編譯時,會根據寄存器的live time進行優化,而且在CPU內部執行時,進行重命名,在有限的寄存器數量上盡量的解決依賴問題。GPU只在編譯時優化,盡量減少對memory的使用,在內部執行時,如果針對每個warp都增加一個寄存器重命名單元,設計復雜。因此GPU每個線程需要的寄存器就是它編譯時需要的寄存器上限(寄存器上限也可以通過編譯器控制)。這就導致了實際GPU內部執行時對寄存器使用數量的波動。如下圖所示,因此也有很多文章研究如何優化寄存器的使用。

在編譯時,nvcc可以通過指定--maxrregcount指定寄存器的數量,但是過多的寄存器會因為固定的寄存器資源而導致thread數量變少,過少的寄存器也會導致需要頻繁的訪問memory,因此也需要折衷。

WARP Divergence

之前討論warp時說如果32個線程,沒有遇到分支,那么每個線程都執行同一條指令,但是如果存在分支呢?

GPU沒有CPU的分支預測,使用active mask和predicate register來構建token stack來處理遇到分支時的問題。

GPGPU-sim按照下圖模擬的token stack,其中的

另一種可能的token stack則是按照如下的方式構建,結合了指令,predicate register和token stack。

上圖中的(b)即為編譯出的匯編指令,SSY 0xF0即為push stack,if else分支指令結束重聚的指令地址為0xF0。每個warp會有當前的active pc寄存器和active mask寄存器。我們假設一個warp內有8個thread,在SSY 0xF0指令執行時,會將active mask 壓棧,壓棧的內容包括Fig1 中的entry type SSY,active mask和re-convergence pc,也就是0xF0(從SSY 0xF0指令可以獲得).

在分支指令@PO BRA 0xB8執行時,會將DIV(divergence),active mask(0xF0,這個并非pc,而是active mask,當前warp的每個thread的predicate register拼接而成,8bit 每個bit表示一個thread是否滿足if條件) 和 0xB8(if語句塊內的第一條指令的地址)壓棧。

然后gpu會默認執行else分支(因為if需要跳轉,else直接順序執行),執行else分支時,需要對active mask取反,只執行不滿足if條件的那些thread。

Else分支的最后一條匯編指令末尾會增加.S flag用于標志pop stack,此時pop指令會將active mask出棧,更新到active mask寄存器和active pc中,然后執行if 分支,直到執行完畢if內的最后一條指令,對應地址0xE8,此時再次出棧。

將當前active pc更新為0xF0,active mask更新為0xFF,此時if else分支執行完畢,回到重聚點,所有線程繼續lock-step鎖步執行。

這里只假設一個if else,但是實際上可能存在if else的嵌套,因此第一步SSY 0xF0,可以理解成上下文切換時的先保存當前的active mask。

上述的方案與GPGPU-sim中的架構類似,除了在指令中顯式的增加了壓棧出棧。

1.?https://www.bu.edu/pasi/files/2011/07/Lecture2.pdf

  1. 2.Dynamic Warp Formation and Scheduling for Effificient GPU Control Flow

3. RegMutex: Inter-Warp GPU Register Time-Sharing?

4. Analyzing Graphics Processor Unit (GPU) Instruction Set Architectures

?

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

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

相關文章

10條SQL優化技巧

一、一些常見的SQL實踐 (1)負向條件查詢不能使用索引 select * from order where status!0 and stauts!1 not in/not exists都不是好習慣 可以優化為in查詢: select * from order where status in(2,3) (2)前導模…

Codeforces Round 893 (Div. 2)B題題解

文章目錄 [The Walkway](https://codeforces.com/contest/1858/problem/B)問題建模問題分析1.分析所求2.如何快速計算每個商販被去除后的餅干數量代碼 The Walkway 問題建模 給定n個椅子,其中有m個位置存在商販,在商販處必須購買餅干吃,每隔…

Python程序設計——字符串處理的特殊方法

學習目標: 學習如何創建字符串使用len、min和max函數獲取一個字符串的長度、串中的最大和最小的字符使用下標運算符([])訪問字符串中的元素使用截取運算符str[ start:end]從較長的字符串中得到一個子串使用運算符連接兩個字符串,通過*運算符復制一個字符…

【Odroid C4】交叉編譯工具鏈安裝以及QT交叉編譯環境搭建

【Odroid C4】交叉編譯工具鏈安裝以及QT交叉編譯環境搭建 虛擬機環境,UBUNTU20.04 文章目錄 【Odroid C4】交叉編譯工具鏈安裝以及QT交叉編譯環境搭建一、Odroid C4交叉編譯工具鏈安裝二、QT下載及編譯安裝1.QT下載2.交叉編譯QT 配置QtCreator可以[參考](https://bl…

快速入門vue3新特性和新的狀態管理庫pinia

(創作不易,感謝有你,你的支持,就是我前行的最大動力,如果看完對你有幫助,請留下您的足跡) 目錄 Vue3.3新特性 defineOptions defineModel pinia 介紹 與 Vuex 3.x/4.x 的比較 安裝 核心概念 定義…

前饋神經網絡多分類任務

pytorch深度學習的套路都差不多,多看多想多寫多測試,自然就會了。主要的技術還是在于背后的數學思想和數學邏輯。 廢話不多說,上代碼自己看。 import torch import numpy as np import torch.nn as nn import torchvision import torchvisi…

【騰訊云Cloud Studio實戰訓練營】使用Cloud Studio社區版快速構建React完成點餐H5頁面還原

陳老老老板🦸 👨?💻本文專欄:生活(主要講一下自己生活相關的內容) 👨?💻本文簡述:生活就像海洋,只有意志堅強的人,才能到達彼岸。 👨?💻上一篇…

成集云 | 用友U8采購請購單同步釘釘 | 解決方案

源系統成集云目標系統 方案介紹 用友U8是中國用友集團開發和推出的一款企業級管理軟件產品。具有豐富的功能模塊,包括財務管理、采購管理、銷售管理、庫存管理、生產管理、人力資源管理、客戶關系管理等,可根據企業的需求選擇相應的模塊進行集…

什么是原子交換?

安全地在各個區塊鏈網絡之間傳輸資產對于釋放被困流動性并吸引更多用戶進入這一領域至關重要,同時也保持 Web3 的信任最小化核心價值。原子交換是一種讓兩個人在不依賴于中介來促成交易的情況下,在不同的區塊鏈網絡之間交換通證資產的方式。這為 DeFi 用…

Linux硬鏈接和軟連接

1、硬鏈接 硬連接指通過索引節點來進行連接。在 Linux 的文件系統中,保存在磁盤分區中的文件不管是什么類型都給它分配一個編號,稱為索引節點號(Inode Index)。在 Linux 中,多個文件名指向同一索引節點是存在的。比如:A 是 B 的硬…

數據結構之隊列詳解(包含例題)

一、隊列的概念 隊列是一種特殊的線性表,特殊之處在于它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操…

【Windows 常用工具系列 5 -- Selenium IDE的使用方法 】

文章目錄 Selenium 介紹Selenium IDE 介紹 Selenium IDE安裝Chrome 瀏覽器安裝Selenium IDE使用 Selenium 介紹 Selenium是一個用于Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。 Selenium家庭成員有三個,分別是S…

Ubuntu 20.04 與 ROS noetic安裝 gtsam 編譯 LIO-SAM 的適配版本

Ubuntu 20.04 基于 ROS noetic安裝 gtsam, 編譯 LIO-SAM 的適配版本 摘要安裝GTSAM(ros-noetic-gtsam版本)編譯LIO-SAM的適配版本 摘要 本文簡介在 Ubuntu 20.04 下以 ROS noetic 為基礎安裝 GTSAM 并成功編譯 LIO-SAM 的適配版本。 安裝GTSAM(ros-noetic-gtsam版…

騰訊云國際站代充-阿里云ECS怎么一鍵遷移到騰訊云cvm?

今天主要來介紹一下如何通過阿里云國際ECS控制臺一鍵遷移至騰訊云國際CVM。騰訊云國際站云服務器CVM提供全面廣泛的服務內容。無-需-綁-定PayPal,代-充-值騰訊云國際站、阿里云國際站、AWS亞馬遜云、GCP谷歌云,官方授權經銷商!靠譜&#xff0…

視頻匯聚集中存儲EasyCVR平臺調用iframe地址視頻無法播放,該如何解決?

安防監控視頻匯聚平臺EasyCVR基于云邊端一體化架構,具有強大的數據接入、處理及分發能力,可提供視頻監控直播、云端錄像、視頻云存儲、視頻集中存儲、視頻存儲磁盤陣列、錄像檢索與回看、智能告警、平臺級聯、云臺控制、語音對講、AI算法中臺智能分析無縫…

【SpringBoot】中的ApplicationRunner接口 和 CommandLineRunner接口

1. ApplicationRunner接口 用法: 類型: 接口 方法: 只定義了一個run方法 使用場景: springBoot項目啟動時,若想在啟動之后直接執行某一段代碼,就可以用 ApplicationRunner這個接口,并實現接口…

vue3+elementUI-plus實現select下拉框的虛擬滾動

網上查了幾個方案,要不就是不兼容,要不就是不支持vue3, 最終找到一個合適的,并且已上線使用,需要修改一下樣式: 代碼如下: main.js里引用 import vue3-virtual-scroller/dist/vue3-virtual-scroller.css; …

xollam勒索病毒數據恢復|金蝶、用友、管家婆、OA、速達、ERP等軟件數據庫恢復

引言: 數字時代的繁榮與便捷,也孕育著各種網絡安全威脅。其中,.xollam勒索病毒以其毒害性和隱蔽性引發了廣泛關注。本文91數據恢復將為您深入解析.xollam勒索病毒的威脅,探討解密方法,同時分享預防.xollam勒索病毒的關…

Python入門教程23:math模塊的用法

**math是Python 的一個內置模塊,它提供了許多數學函數和常量,用于進行數學計算。**以下是一些常用的math模塊中的函數和常量: math.pi:圓周率π的近似值,約等于3.14159。 math.e:自然對數的底數e的近似值…

【Tomcat】(Tomcat 下載Tomcat 啟動Tomcat 簡單部署 基于Tomcat進行網站后端開發)

文章目錄 Tomcat下載Tomcat啟動Tomcat簡單部署 基于Tomcat進行網站后端開發 Tomcat Tomcat 是一個 HTTP 服務器.HTTP 協議就是 HTTP 客戶端和 HTTP 服務器之間的交互數據的格式. HTTP 服務器我們可以通過 Java Socket 來實現. 而 Tomcat 就是基于 Java 實現的一個開源免費,也是…