【leetGPU】1. Vector Addition

問題

link: https://leetgpu.com/challenges/vector-addition

Implement a program that performs element-wise addition of two vectors containing 32-bit floating point numbers on a GPU. The program should take two input vectors of equal length and produce a single output vector containing their sum.

Implementation Requirements
External libraries are not permitted
The solve function signature must remain unchanged
The final result must be stored in vector C

解決思路

CUDA使用了SIMT的方法來分配不同線程,也就是對于每個細分后的thread,指令都不一樣。這就要我們首先要給并行的函數確定一下他們自己在GPU的什么位置。即要確定thread、block的數量。 對此有如下基礎知識:

  1. thread: 一個CUDA的并行程序會被以許多個thread來執行。
  2. block: 數個thread會被群組成一個block,同一個block中的thread可以同步,也可以通過shared memory進行通信。
  3. grid: 多個block則會再構成grid。

解釋一下(來源于: https://zhuanlan.zhihu.com/p/123170285):

一個CUDA core可以執行一個thread,一個SM的CUDA core會分成幾個warp(即CUDA core在SM中分組),由warp scheduler負責調度。盡管warp中的線程從同一程序地址,但可能具有不同的行為,比如分支結構,因為GPU規定warp中所有線程在同一周期執行相同的指令,warp發散會導致性能下降。一個SM同時并發的warp是有限的,因為資源限制,SM要為每個線程塊分配共享內存,而也要為每個線程束中的線程分配獨立的寄存器,所以SM的配置會影響其所支持的線程塊和warp并發數量。
一個warp中的線程必然在同一個block中, 如果block所含線程數目不是warp大小的整數倍,那么多出的那些thread所在的warp中,會剩余一些inactive的thread,也就是說,即使湊不夠warp整數倍的thread,硬件也會為warp湊足,只不過那些thread是inactive狀態,需要注意的是,即使這部分thread是inactive的,也會消耗SM資源。 由于warp的大小一般為32,所以block所含的thread的大小一般要設置為32的倍數。

由于一個warp (warp(線程束)是最基本的執行單元) 包含32個并行thread,所以thread的數量應該設置成32的整數倍,一般為256。線程塊大小需平衡并行效率和資源限制(如寄存器、共享內存等),一般設置為 ??threadsPerBlock = 256?? 每個線程塊包含256個線程。

CUDA的軟硬件:

在這里插入圖片描述
CUDA的軟件劃分。
在這里插入圖片描述

每個grid的block數量可以由下面的公式計算獲得.

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

該公式通過向上取整確保所有 N個元素都有對應的線程處理:

  • ??分子部分??:N + threadsPerBlock - 1通過添加 threadsPerBlock - 1實現向上取整
  • 分母部分??:除以 threadsPerBlock得到所需的線程塊數量

聲明函數

vector_add<<<blocksPerGrid, threadsPerBlock>>>(A, B, C, N);

由于是單一維度的vector,所以只需要用到blockIdx、blockDim和threadIdx的第一維度(x)。后面的二維問題再說y維度。CUDA中每一個線程都有一個唯一的標識ID即threadIdx,這個ID隨著Grid和Block的劃分方式的不同而變化:

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

答案

__global__ void vector_add(const float* A, const float* B, float* C, int N) {int idx=blockIdx.x*blockDim.x+threadIdx.x;if (idx < N) {C[idx] = A[idx] + B[idx];  // 逐元素相加}
}

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

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

相關文章

瑞吉外賣學習筆記

TableField 作用: 當數據庫中表的列名與實體類中的屬性名不一致&#xff0c;使用TableField 使其對應 TableField("db_column_name") private String entityFieldName;exist 屬性 : 指定該字段是否參與增刪改查操作。 TableField(exist false) private String tempF…

RoPE:相對位置編碼的旋轉革命——原理、演進與大模型應用全景

“以復數旋轉解鎖位置關系的本質表達&#xff0c;讓Transformer突破長度藩籬” 旋轉位置編碼&#xff08;Rotary Position Embedding, RoPE&#xff09; 是由 Jianlin Su 等研究者 于2021年提出的突破性位置編碼方法&#xff0c;通過復數空間中的旋轉操作將相對位置信息融入Tra…

震網(Stuxnet):打開潘多拉魔盒的數字幽靈

在科技飛速發展的今天&#xff0c;代碼和數據似乎只存在于無形的數字世界。但如果我告訴大家&#xff0c;一段代碼曾悄無聲息地潛入一座受到嚴密物理隔離的核工廠&#xff0c;并成功摧毀了其中的物理設備&#xff0c;大家是否會感到一絲寒意&#xff1f;這不是科幻電影的情節&a…

一文讀懂:到底什么是 “具身智能” ?

今天咱們來好好聊聊一個最近很火的一個技術話題——具身智能&#xff01; 這個詞聽起來是不是有點難懂&#xff1f;其實我們可以簡單理解為&#xff1a;具身智能是具有身體的人工智能體。這樣是不是會容易理解一些&#xff1f; 具身智能&#xff08;Embodied Intelligence&…

企業級區塊鏈平臺Hyperchain核心原理剖析

Hyperchain作為國產自主可控的企業級聯盟區塊鏈平臺&#xff0c;其核心原理圍繞高性能共識、隱私保護、智能合約引擎及可擴展架構展開&#xff0c;通過多模塊協同實現企業級區塊鏈網絡的高效部署與安全運行。 以下從核心架構、關鍵技術、性能優化、安全機制、應用場景五個維度展…

論文閱讀-RaftStereo

文章目錄1 概述2 模塊說明2.1 特征抽取器2.2 相關金字塔2.3 多級更新算子2.4 Slow-Fast GRU2.5 監督3 效果1 概述 在雙目立體匹配中&#xff0c;基于迭代的模型是一種比較主流的方法&#xff0c;而其鼻祖就是本文要講的RaftStereo。 先來說下什么是雙目立體匹配。給定極線矯正…

內存優化:從堆分配到零拷貝的終極重構

引言 在現代高性能軟件開發中&#xff0c;內存管理往往是性能優化的關鍵戰場。頻繁的堆內存分配(new/delete)不僅會導致性能下降&#xff0c;還會引發內存碎片化問題&#xff0c;嚴重影響系統穩定性。本文將深入剖析高頻調用模塊中堆分配泛濫導致的性能塌方問題&#xff0c;并…

【GoLang#2】:基礎入門(工具鏈 | 基礎語法 | 內置函數)

前言&#xff1a;Go 的一些必備知識 1. Go 語言命名 Go的函數、變量、常量、自定義類型、包(package)的命名方式遵循以下規則&#xff1a; 首字符可以是任意的Unicode字符或者下劃線剩余字符可以是Unicode字符、下劃線、數字字符長度不限 Go 語言代碼風格及開發事項代碼每一行結…

Bert項目--新聞標題文本分類

目錄 技術細節 1、下載模型 2、config文件 3、BERT 文本分類數據預處理流程 4、對輸入文本進行分類 5、計算模型的分類性能指標 6、模型訓練 7、基于BERT的文本分類預測接口 問題總結 技術細節 1、下載模型 文件名稱--a0_download_model.py 使用 ModelScope 庫從模型倉…

sendfile系統調用及示例

好的&#xff0c;我們繼續學習 Linux 系統編程中的重要函數。這次我們介紹 sendfile 函數&#xff0c;它是一個高效的系統調用&#xff0c;用于在兩個文件描述符之間直接傳輸數據&#xff0c;通常用于將文件內容發送到網絡套接字&#xff0c;而無需將數據從內核空間復制到用戶空…

數據結構習題--刪除排序數組中的重復項

數據結構習題–刪除排序數組中的重復項 給你一個 非嚴格遞增排列 的數組 nums &#xff0c;請你 原地 刪除重復出現的元素&#xff0c;使每個元素 只出現一次 &#xff0c;返回刪除后數組的新長度。元素的 相對順序 應該保持 一致 。然后返回 nums 中唯一元素的個數。 方法&…

Docker的容器設置隨Docker的啟動而啟動

原因也比較簡單&#xff0c;在docker run 的時候沒有設置–restartalways參數。 容器啟動時&#xff0c;需要增加參數 –restartalways no - 容器退出時&#xff0c;不重啟容器&#xff1b; on-failure - 只有在非0狀態退出時才從新啟動容器&#xff1b; always - 無論退出狀態…

JWT安全機制與最佳實踐詳解

JWT&#xff08;JSON Web Token&#xff09; 是一種開放標準&#xff08;RFC 7519&#xff09;&#xff0c;用于在各方之間安全地傳輸信息作為緊湊且自包含的 JSON 對象。它被廣泛用于身份驗證&#xff08;Authentication&#xff09;和授權&#xff08;Authorization&#xff…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘ipython’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘ipython’問題 摘要 在開發過程中&#xff0c;我們常常會遇到pip install報錯的問題&#xff0c;其中一個常見的報錯是 ModuleNotFoundError: No module named…

從三維Coulomb勢到二維對數勢的下降法推導

題目 問題 7. 應用 9.1.4 小節描述的下降法&#xff0c;但針對二維的拉普拉斯方程&#xff0c;并從三維的 Coulomb 勢出發 KaTeX parse error: Invalid delimiter: {"type":"ordgroup","mode":"math","loc":{"lexer&qu…

直播一體機技術方案解析:基于RK3588S的硬件架構特性?

硬件配置??主控平臺??? 搭載瑞芯微RK3588S旗艦處理器&#xff08;四核A762.4GHz 四核A55&#xff09;? 集成ARM Mali-G610 MP4 GPU 6TOPS算力NPU? 雙通道LPDDR5內存 UFS3.1存儲組合??專用加速單元??→ 板載視頻采集模塊&#xff1a;支持4K60fps HDMI環出采集→ 集…

【氮化鎵】GaN取代GaAs作為空間激光無線能量傳輸光伏轉換器材料

2025年7月1日,西班牙圣地亞哥-德孔波斯特拉大學的Javier F. Lozano等人在《Optics and Laser Technology》期刊發表了題為《Gallium nitride: a strong candidate to replace GaAs as base material for optical photovoltaic converters in space exploration》的文章,基于T…

直播美顏SDK動態貼紙模塊開發指南:從人臉關鍵點識別到3D貼合

很多美顏技術開發者好奇&#xff0c;如何在直播美顏SDK中實現一個高質量的動態貼紙模塊&#xff1f;這不是簡單地“貼圖貼臉”&#xff0c;而是一個融合人臉關鍵點識別、實時渲染、貼紙驅動邏輯、3D骨骼動畫與跨平臺性能優化的系統工程。今天&#xff0c;就讓我們從底層技術出發…

學習游戲制作記錄(劍投擲技能)7.26

1.實現瞄準狀態和接劍狀態準備好瞄準動畫&#xff0c;投擲動畫和接劍動畫&#xff0c;并設置參數AimSword和CatchSword投擲動畫在瞄準動畫后&#xff0c;瞄準結束后才能投擲創建PlayerAimSwordState腳本和PlayerCatchSwordState腳本并在Player中初始化&#xff1a;PlayerAimSwo…

【c++】問答系統代碼改進解析:新增日志系統提升可維護性——關于我用AI編寫了一個聊天機器人……(14)

在軟件開發中&#xff0c;代碼的迭代優化往往從提升可維護性、可追蹤性入手。本文將詳細解析新增的日志系統改進&#xff0c;以及這些改進如何提升系統的實用性和可調試性。一、代碼整體背景代碼實現了一個基于 TF-IDF 算法的問答系統&#xff0c;核心功能包括&#xff1a;加載…