leetGPU解題筆記(1)

1.題面

題目要求

向量加法
實現一個程序,在GPU上對兩個包含32位浮點數的向量執行逐元素加法。該程序應接受兩個長度相等的輸入向量,并生成一個包含它們和的輸出向量。

實現要求

禁止使用外部庫
solve函數簽名必須保持不變
最終結果必須存儲在向量C中
示例1:
輸入:A = [1.0, 2.0, 3.0, 4.0]
B = [5.0, 6.0, 7.0, 8.0]
輸出:C = [6.0, 8.0, 10.0, 12.0]
示例2:
輸入:A = [1.5, 1.5, 1.5]
B = [2.3, 2.3, 2.3]
輸出:C = [3.8, 3.8, 3.8]

約束條件

輸入向量A和B長度相同
1 ≤ N ≤ 100,000,000

2.已有代碼解析

函數參數與目的

void solve(const float* A, const float* B, float* C, int N)
  • 該函數接收三個指向GPU內存的指針:AB是輸入向量,C是輸出向量。
  • N表示向量的長度,即元素個數。

線程與線程塊配置

int threadsPerBlock = 256;
int blocksPerGrid = (N + threadsPerBlock - 1) / threadsPerBlock;
  • 線程塊大小(threadsPerBlock):每個線程塊包含256個線程。這是CUDA編程中常用的配置,適合大多數GPU架構。
  • 網格大小(blocksPerGrid):根據向量長度N計算所需的線程塊數量。使用向上取整公式確保所有元素都被處理。例如:
    • N=1000時,blocksPerGrid = (1000 + 256 - 1) / 256 = 4
    • 每256個線程就打包成一個block,blocksPerGrid就表示打包了多少個

核函數調用

vector_add<<<blocksPerGrid, threadsPerBlock>>>(A, B, C, N);
  • 核函數(vector_add):這是一個在GPU上執行的函數,負責逐元素地將AB相加,結果存入C
  • 執行配置(<<<...>>>):指定網格和線程塊的維度。這里使用一維網格和一維線程塊。
  • 核函數會被并行調用,每個線程負責計算一個元素:C[i] = A[i] + B[i]

同步操作

cudaDeviceSynchronize();
  • 確保核函數執行完成后才返回。這對于需要立即使用結果的場景很重要。

3.QA環節

Q1: Grid是什么,為什么bocksPerGrid就是塊的數目?

Grid是CUDA編程模型中的一個概念,表示線程塊(Block)的集合。在GPU并行計算中,一個Grid是核函數(Kernel)的一次執行實例,它包含多個線程塊,這些線程塊可以并行或串行執行,具體取決于硬件資源。

blocksPerGrid是根據向量長度N和每個線程塊的線程數量threadsPerBlock計算得出的。在CUDA中,網格(Grid)和線程塊(Block)都可以是一維、二維或三維的。在這個向量加法的例子中,我們使用了一維網格,因此blocksPerGrid直接表示網格中一維方向上的線程塊數量。計算公式為:

blocksPerGrid = (N + threadsPerBlock - 1) / threadsPerBlock;

這個公式實現了向上取整的效果,確保所有N個元素都有對應的線程來處理。例如:

  • N=1000threadsPerBlock=256時,blocksPerGrid = (1000 + 256 - 1) / 256 = 4
  • 每個線程塊處理256個元素,4個線程塊總共可以處理1024個元素,覆蓋了N=1000的需求。

Q2: 這里使用“一維網格”和“一維線程塊”是什么含義,還有其他選擇嗎,比如二維的?

一維網格和一維線程塊

在CUDA中,線程組織是分級的:

  • 線程塊(Block):由多個線程組成,可以是一維、二維或三維
  • 網格(Grid):由多個線程塊組成,同樣可以是一維、二維或三維

在向量加法的例子中:

  • 一維線程塊:每個線程塊中的線程按一維數組排列,線程索引由threadIdx.x表示
  • 一維網格:線程塊按一維數組排列,線程塊索引由blockIdx.x表示

每個線程的全局索引計算方式為:

int i = blockIdx.x * blockDim.x + threadIdx.x;

其中:

  • blockDim.x是每個線程塊的線程數量(256)
  • blockIdx.x是當前線程塊的索引
  • threadIdx.x是當前線程在線程塊內的索引
二維網格和二維線程塊

是的,CUDA支持二維甚至三維的網格和線程塊,適用于處理二維或三維數據結構(如圖像、矩陣)。例如:

二維線程塊

對于圖像處理,可以使用二維線程塊:

dim3 threadsPerBlock(16, 16);  // 每個線程塊有16×16=256個線程

線程索引由threadIdx.xthreadIdx.y表示,線程塊內的線程按二維矩陣排列。

二維網格

對應的網格也可以是二維的:

dim3 blocksPerGrid((width + threadsPerBlock.x - 1) / threadsPerBlock.x,(height + threadsPerBlock.y - 1) / threadsPerBlock.y
);

線程塊索引由blockIdx.xblockIdx.y表示,網格中的線程塊按二維矩陣排列。

全局索引計算

對于二維網格和二維線程塊,全局索引計算方式為:

int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
int idx = row * width + col;  // 轉換為一維索引

為什么向量加法使用一維組織?

向量加法處理的是一維數組,每個元素的計算只依賴于自身索引,使用一維組織更直觀且高效:

  • 線程索引計算簡單
  • 內存訪問模式連續,提高緩存利用率

對于二維數據(如圖像、矩陣),使用二維組織更自然,能夠更好地映射數據結構和計算邏輯。

解題思路

__global__ void vector_add(const float* A, const float* B, float* C, int N) {int i = blockIdx.x * blockDim.x + threadIdx.x;if(i<N){C[i]=A[i]+B[i];}
}

根據第幾個block和在block內的局部地址,得到總的id。注意i<N的邊界約束,這是因為我們無法保證N是256的倍數,可能會產生數組越界。

在這里插入圖片描述

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

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

相關文章

5. JVM 的方法區

1. JVM介紹和運行流程-CSDN博客 2. 什么是程序計數器-CSDN博客 3. java 堆和 JVM 內存結構-CSDN博客 4. 虛擬機棧-CSDN博客 5. JVM 的方法區-CSDN博客 6. JVM直接內存-CSDN博客 7. JVM類加載器與雙親委派模型-CSDN博客 8. JVM類裝載的執行過程-CSDN博客 9. JVM垃圾回收…

網絡安全的基本練習

一.docker搭建 1.安裝dockerapt-get install docker.io docker-compose2.編寫配置文件&#xff08;注意路徑正確&#xff09;vim /etc/systemd/system/docker.service.d/http-proxy.conf[Service] Environment"HTTP_PROXYhttp://科學上網訪問的ip:端口" Environment&…

380. O(1) 時間插入、刪除和獲取隨機元素

實現RandomizedSet 類&#xff1a; RandomizedSet() 初始化 RandomizedSet 對象 bool insert(int val) 當元素 val 不存在時&#xff0c;向集合中插入該項&#xff0c;并返回 true &#xff1b;否則&#xff0c;返回 false 。 bool remove(int val) 當元素 val 存在時&#xff…

【LeetCode Hot100 | 每日刷題】字母異位詞分組

題目鏈接&#xff1a;49. 字母異位詞分組 - 力扣&#xff08;LeetCode&#xff09; 題目&#xff1a; 給你一個字符串數組&#xff0c;請你將 字母異位詞 組合在一起。可以按任意順序返回結果列表。 示例 1: 輸入: strs ["eat", "tea", "tan"…

docker 安裝windows

目錄 下載地址&#xff1a; 使用教程&#xff1a; docker compose 查看版本 測試啟動 hello-world 報錯1 The system cannot find the file specified&#xff1a; 檢查 Docker Desktop 是否運行中 報錯2HF_ENDPOINT 1. 臨時解決方案&#xff08;當前終端會話有效&…

docker compose 和build

目錄 docker compose 和build 的區別是什么&#xff1f; 核心差別&#xff1a; 1. docker build --platform linux/amd64 -f Dockerfile -t infiniflow/ragflow:nightly_lbg . 2. docker compose -f docker-compose-gpu.yml up -d 二者如何配合&#xff1f; 總結 docker …

裂變時刻:全球關稅重構下的券商交易系統躍遷路線圖(2025-2027)

——基于RWA清算、量子加密與實時非線性風控的下一代跨境基礎設施核心事件錨定&#xff1a;特朗普于7月7日對14國啟動分級關稅制裁&#xff08;日韓25%、東南亞30%-40%、金磚關聯國10%附加稅&#xff09;&#xff0c;引發日元兌美元暴跌至144.47、銅價單日跳漲3.2%、散戶單日交…

python爬蟲初入門——基本庫和寫入方法

1.準備環境 python環境&#xff1a;3.10 2.常用庫 1.請求庫&#xff1a;實現 HTTP 請求操作 requests&#xff1a;基于 urllib 編寫的&#xff0c;阻塞式 HTTP 請求庫&#xff0c;發出一個請求&#xff0c;一直等待服務器響應后&#xff0c;程序才能進行下一步處理。seleni…

Sonar掃描C#代碼配置

需要的工具 MSBuild、sonar-scanner-4.6.1.2450-windows、jdk1.8.0_181 下載地址&#xff1a;https://download.csdn.net/download/code12313/91315686 配置sonar的地址 一、環境變量配置 1.新建變量&#xff0c;nameSONAR_RUNNER_MSBUILD_HOME。valueD:\work\dev\dev_serve…

python 在運行時沒有加載修改后的版本

陳舊的Python字節碼 (.pyc 文件)&#xff1a;最常見的原因&#xff01;Python 會把你修改的 .py 文件編譯成 .pyc 字節碼來加速后續運行。有時&#xff0c;即使你修改了 .py 文件&#xff0c;系統可能仍然固執地加載舊的、未被刪除的 .pyc 文件。1. 用“硬編碼探針”強制驗證# …

【會員專享數據】2013-2024年我國省市縣三級逐年SO?數值數據(Shp/Excel格式)

之前我們分享過2013-2024年全國范圍逐年SO?柵格數據&#xff08;可查看之前的文章獲悉詳情&#xff09;&#xff01;該數據來源于韋晶博士、李占清教授團隊發布在國家青藏高原科學數據中心網站上的中國高分辨率高質量近地表空氣污染物數據集。很多小伙伴拿到數據后反饋柵格數據…

出現SSL連接錯誤的原因和解決方案

介紹 SSL連接錯誤是一種常見但關鍵的問題&#xff0c;這可能會阻止客戶端和服務器之間的安全連接。這些錯誤發生在TLS握手過程失敗時&#xff0c;這意味著客戶端和服務器無法建立安全的HTTPS連接。這種失敗可以在SSL/TLS協商過程中的任何階段發生&#xff0c;從初始協議協議到…

vue3 el-date-picker 保存后 日期減一問題

在使用 el-date-picker&#xff08;Element UI 的日期選擇器組件&#xff09;時&#xff0c;如果你發現日期在保存到后臺后自動減一&#xff0c;這通常是由于時區差異或者是時間格式解析問題導致的。這里有一些可能的解決方案&#xff1a;1. 檢查前端發送的日期格式確保你在前端…

什么是IP關聯?跨境賣家如何有效避免IP關聯?

一位深圳賣家曾管理30個亞馬遜店鋪賬號&#xff0c;某日清晨發現所有賬號被批量封禁——原因竟是平臺檢測到這些賬號長期共享同一IP地址&#xff0c;判定為“IP關聯”。而在跨境領域如亞馬遜、eBay、Shopee、TikTok等平臺&#xff09;&#xff0c;對于IP關聯的判定都是比較嚴格…

Redis集群方案——哨兵機制

Redis Sentinel&#xff08;哨兵&#xff09;是Redis官方提供的高可用性(HA)解決方案&#xff0c;用于管理Redis主從架構并實現自動故障轉移。一、集群結構和作用哨兵是一個分布式系統&#xff0c;由多個哨兵節點組成&#xff1a;哨兵的作用如下&#xff1a;監控&#xff1a;Se…

1.2.3_2 TCP/IP模型

在這個視頻中&#xff0c;我們要探討TCP/IP模型。對于TCP/IP模型考試的要求是這樣的&#xff0c;首先我們需要記住它各個層次的名稱和順序&#xff0c;以及我們需要了解TCP/IP 模型和OSI參考模型&#xff0c;它們在設計理念上有哪些區別&#xff0c;設計理念的區別又導致了TCP/…

EVOLVEpro安裝使用教程-蛋白質語言模型驅動的快速定向進化

寫在前面&#xff1a;蛋白質是生命活動的基石&#xff0c;其功能和序列之間的復雜關系長期以來吸引著科學家們的關注。盡管深度突變掃描等實驗方法可以解析蛋白質突變的功能影響&#xff0c;但這些技術的應用范圍局限于序列空間的一小部分。近年來&#xff0c;基于蛋白質語言模…

【Linux】Rocky Linux 清華鏡像源安裝 GitLab

使用清華鏡像源安裝 GitLab 地址&#xff1a;清華鏡像源 1. 搜索 gitlab&#xff0c;我們選擇 gitlab-ce 社區版進行安裝 2. 新建 /etc/yum.repos.d/gitlab-ce.repo&#xff0c;內容為 注意&#xff1a;el$releasever 是清華鏡像源內的文件夾版本 [gitlab-ce] nameGitlab C…

【龍澤科技】新能源汽車維護與動力蓄電池檢測仿真教學軟件【吉利幾何G6】

產品簡介新能源汽車維護與動力蓄電池檢測仿真教學軟件是依托《全國職業院校技能大賽》“新能源汽車維修”賽項中“新能源汽車維護與動力蓄電池檢測” 競賽模塊&#xff0c;自主開發的一款仿真教學軟件。軟件采用仿真技術對車輛進行指定維護作業&#xff0c;并對動力蓄電池總成進…

UE5多人MOBA+GAS 18、用對象池來設置小兵的隊伍的生成,為小兵設置一個目標從己方出生點攻打對方出生點,優化小兵的血條UI

文章目錄根據小兵隊伍更換小兵的皮膚管理小兵的生成使用對象池來管理小兵的生成為小兵設置一個目標小兵生成完整代碼調整一下小兵的UI根據小兵隊伍更換小兵的皮膚 懶得開UE了&#xff0c;增加一個Minion類繼承基類角色CCharacter // 幻雨喜歡小貓咪#pragma once#include &qu…