分布式GPU上計算長向量模的方法

分布式GPU上計算長向量模的方法

當向量分布在多個GPU卡上時,計算向量模(2-范數)需要以下步驟:

  1. 在每個GPU上計算本地數據的平方和
  2. 跨GPU通信匯總所有平方和
  3. 在根GPU上計算總和的平方根

實現方法

下面是一個完整的CUDA示例代碼,使用NCCL進行多GPU通信:

#include <iostream>
#include <cmath>
#include <cuda_runtime.h>
#include <nccl.h>#define CHECK_CUDA(call) { \cudaError_t err = call; \if (err != cudaSuccess) { \std::cerr << "CUDA error at " << __FILE__ << ":" << __LINE__ << ": " \<< cudaGetErrorString(err) << std::endl; \exit(EXIT_FAILURE); \} \
}#define CHECK_NCCL(call) { \ncclResult_t res = call; \if (res != ncclSuccess) { \std::cerr << "NCCL error at " << __FILE__ << ":" << __LINE__ << ": " \<< ncclGetErrorString(res) << std::endl; \exit(EXIT_FAILURE); \} \
}// CUDA核函數:計算局部平方和
__global__ void compute_local_square_sum(const float* vec, float* partial_sum, size_t n) {extern __shared__ float shared_mem[];unsigned int tid = threadIdx.x;unsigned int i = blockIdx.x * blockDim.x + threadIdx.x;float sum = 0.0f;if (i < n) {float val = vec[i];sum = val * val;}// 歸約到共享內存shared_mem[tid] = sum;__syncthreads();// 塊內歸約for (unsigned int s = blockDim.x / 2; s > 0; s >>= 1) {if (tid < s) {shared_mem[tid] += shared_mem[tid + s];}__syncthreads();}// 第一個線程寫入結果if (tid == 0) {partial_sum[blockIdx.x] = shared_mem[0];}
}// 計算向量模
float distributed_vector_norm(int ngpus, size_t total_elements, size_t local_elements, const float* local_vec, cudaStream_t stream, ncclComm_t comm) {// 1. 每個GPU計算本地平方和const int block_size = 256;const int grid_size = (local_elements + block_size - 1) / block_size;float* d_partial_sums;CHECK_CUDA(cudaMalloc(&d_partial_sums, grid_size * sizeof(float)));// 調用核函數計算局部平方和compute_local_square_sum<<<grid_size, block_size, block_size * sizeof(float), stream>>>(local_vec, d_partial_sums, local_elements);// 2. 在設備上完成最終歸約float* d_local_sum;CHECK_CUDA(cudaMalloc(&d_local_sum, sizeof(float)));// 使用CUDA的歸約函數完成設備上的最終歸約void* d_temp_storage = nullptr;size_t temp_storage_bytes = 0;cub::DeviceReduce::Sum(d_temp_storage, temp_storage_bytes, d_partial_sums, d_local_sum, grid_size, stream);CHECK_CUDA(cudaMalloc(&d_temp_storage, temp_storage_bytes));cub::DeviceReduce::Sum(d_temp_storage, temp_storage_bytes, d_partial_sums, d_local_sum, grid_size, stream);// 3. 跨GPU通信匯總所有平方和float* d_global_sum;CHECK_CUDA(cudaMalloc(&d_global_sum, sizeof(float)));// 使用NCCL進行all reduce操作CHECK_NCCL(ncclAllReduce((const void*)d_local_sum, (void*)d_global_sum, 1, ncclFloat, ncclSum, comm, stream));// 4. 計算平方根(只在root GPU上獲取結果)float global_sum = 0.0f;int root = 0;int rank;CHECK_NCCL(ncclCommUserRank(comm, &rank));if (rank == root) {CHECK_CUDA(cudaMemcpyAsync(&global_sum, d_global_sum, sizeof(float), cudaMemcpyDeviceToHost, stream));CHECK_CUDA(cudaStreamSynchronize(stream));}// 清理CHECK_CUDA(cudaFree(d_temp_storage));CHECK_CUDA(cudaFree(d_partial_sums));CHECK_CUDA(cudaFree(d_local_sum));CHECK_CUDA(cudaFree(d_global_sum));return (rank == root) ? sqrtf(global_sum) : 0.0f;
}int main(int argc, char* argv[]) {// 初始化int ngpus;CHECK_CUDA(cudaGetDeviceCount(&ngpus));// 初始化NCCLncclComm_t comm;ncclUniqueId id;if (rank == 0) ncclGetUniqueId(&id);MPI_Bcast(&id, sizeof(id), MPI_BYTE, 0, MPI_COMM_WORLD);CHECK_NCCL(ncclCommInitRank(&comm, ngpus, id, rank));// 假設總向量大小為1億元素size_t total_elements = 100000000;size_t local_elements = total_elements / ngpus;// 分配和初始化本地向量float* d_local_vec;CHECK_CUDA(cudaMalloc(&d_local_vec, local_elements * sizeof(float)));// 初始化向量數據(這里簡單設置為全1,實際應用中應填充真實數據)float init_val = 1.0f;CHECK_CUDA(cudaMemset(d_local_vec, init_val, local_elements * sizeof(float)));// 創建CUDA流cudaStream_t stream;CHECK_CUDA(cudaStreamCreate(&stream));// 計算向量模float norm = distributed_vector_norm(ngpus, total_elements, local_elements, d_local_vec, stream, comm);int rank;CHECK_NCCL(ncclCommUserRank(comm, &rank));if (rank == 0) {std::cout << "Vector norm: " << norm << std::endl;std::cout << "Expected norm: " << sqrtf(total_elements) << std::endl;}// 清理CHECK_CUDA(cudaFree(d_local_vec));CHECK_CUDA(cudaStreamDestroy(stream));CHECK_NCCL(ncclCommDestroy(comm));return 0;
}

關鍵點說明

  1. 數據分布:向量被均勻分布在多個GPU上,每個GPU處理一部分數據。

  2. 本地計算

    • 使用CUDA核函數計算本地數據的平方和
    • 使用塊內歸約優化性能
    • 使用CUB庫進行設備端最終歸約
  3. 跨GPU通信

    • 使用NCCL進行all-reduce操作,匯總所有GPU的平方和
    • NCCL針對多GPU通信進行了優化
  4. 結果計算

    • 只在根GPU上計算最終結果的平方根
    • 其他GPU可以忽略結果或用于后續計算

編譯說明

編譯此代碼需要:

  • CUDA工具包
  • NCCL庫
  • CUB頭文件(通常包含在CUDA工具包中)

編譯命令示例:

nvcc -o distributed_norm distributed_norm.cu -lnccl

性能優化建議

  1. 對于非常大的向量,可以考慮使用更高效的內存訪問模式
  2. 根據GPU架構調整塊大小和網格大小
  3. 使用CUDA圖來捕獲整個計算流程,減少啟動開銷
  4. 考慮使用FP16或TF32計算來提升吞吐量(如果精度允許)

這種方法可以高效地計算分布在多個GPU上的大型向量的模,適用于大規模科學計算和機器學習應用。

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

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

相關文章

高并發下單庫存扣減異常?飛算 JavaAI 自動化生成分布式事務解決方案

在電商、旅游等行業業務量激增&#xff0c;高并發下單場景中&#xff0c;傳統庫存扣減方式弊端盡顯。超賣問題因缺乏有效并發控制機制頻發&#xff0c;多個訂單同時訪問庫存數據&#xff0c;導致同一商品多次售出&#xff0c;訂單無法履約引發客戶投訴&#xff1b;同時&#xf…

MVCWebAPI使用FromBody接受對象的方法

近期在做軟件升級操作的時候突然想著需要的參數比較多&#xff0c;如果需要參數的話參數比較多&#xff0c;所有想著使用frombody來集合數據統一操作做了個樣張希望對您有幫助 代碼如下&#xff1a; /// <summary>/// 入口當前文件接口下的操作數據/// </summary>/…

Atlas 800I A2 離線部署 DeepSeek-R1-Distill-Llama-70B

一、環境信息 1.1、硬件信息 Atlas 800I A2 1.2、環境信息 注意&#xff1a;這里驅動固件最好用商業版&#xff0c;我這里用的社區版有點小問題 操作系統&#xff1a;openEuler 22.03 LTS NPU驅動&#xff1a;Ascend-hdk-910b-npu-driver_24.1.rc3_linux-aarch64.run NPU固…

NLP預處理:如何 處理表情符號

一、說明 本系列文總結了在NLP處理中&#xff0c;進行文本預處理的一些內容、步驟、處理工具包應用。本篇專門談論網上文章表情符號處理&#xff0c;對于初學者具有深刻學習和實驗指導意義。 二、介紹 表情符號已成為現代交流不可或缺的一部分&#xff0c;尤其是在社交媒體、…

C++/SDL 進階游戲開發 —— 雙人塔防(代號:村莊保衛戰 14)

&#x1f381;個人主頁&#xff1a;工藤新一 &#x1f50d;系列專欄&#xff1a;C面向對象&#xff08;類和對象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;終會照亮我前方的路 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 文章目錄 二…

解鎖空間數據新質生產力暨:AI(DeepSeek、ChatGPT)、Python、ArcGIS Pro多技術融合下的空間數據分析、建模與科研繪圖及論文寫作

人工智能&#xff08;AI&#xff09;與ArcGIS Pro的結合&#xff0c;為空間數據處理和分析開辟了前所未有的創新路徑。AI通過強大的數據挖掘、深度學習及自動化能力&#xff0c;可高效處理海量、多源、異構的空間數據&#xff0c;極大提升了分析效率與決策支持能力。而ArcGIS P…

18.2.go語言redis中使用lua腳本

在 Redis 中使用 Lua 腳本可以實現原子性操作、減少網絡開銷以及提高執行效率。 Redis 執行 Lua 腳本的原理 Redis 內置了 Lua 解釋器&#xff0c;能夠直接在服務器端執行 Lua 腳本。當執行 Lua 腳本時&#xff0c;Redis 會將腳本作為一個整體執行&#xff0c;保證腳本執行期…

?Unity_Demolition Media Hap (播放Hap格式視頻 超16K大分辨率視頻 流暢播放以及幀同步解決方案)

播放大分辨率視頻以及實現局域網視頻同步是許多開發者會遇到的需求,AVPro有一個 Ultra Edition版本,也能播放Hap格式視頻,之外就是Demolition Media Hap插件啦,實測即使是 7208*3808 大分辨率的視頻幀率還是能穩定在30幀,它能幫助我們輕松解決這些問題??。 一、插件概述 …

AI大模型知識與醫療項目實踐 - Java架構師面試實戰

AI大模型知識與醫療項目實踐 - Java架構師面試實戰 本文模擬了一場互聯網大廠的Java架構師面試&#xff0c;圍繞AI大模型知識、工具以及其在醫療項目中的實踐和趨勢展開討論。 第一輪提問 面試官&#xff1a; 馬架構&#xff0c;請您介紹一下AI大模型的基本概念及其在醫療領…

Windows 的文件系統不區分大小寫,Linux區分

在 Windows 系統中&#xff0c;文件系統默認是不區分大小寫的。這意味著在 Windows 上&#xff0c;文件名 ui_BalanceMeasureScreenUI.h 和 ui_balancemeasurescreenui.h 被視為同一個文件。因此&#xff0c;即使你在代碼中使用了不同的大小寫方式來引用同一個文件&#xff0c;…

Unity 資源合理性檢測

一&#xff1a;表格過度配置&#xff0c;表格資源是否在工程中存在&#xff0c;并輸出不存在的資源 import pandas as pd import glob import osassets [] count 0# 遍歷configs文件夾下所有xlsx文件 for file_path in glob.glob(configs/*.xlsx):count 1try:sheets pd.re…

Python爬蟲實戰:獲取高考資源網各學科精品復習資料

一、引言 高考資源網擁有豐富的高考復習資料,對于我們而言,獲取這些資源并整理分享能為考生提供有價值的幫助。然而,手動從網站查找和下載資源效率低且易出錯。利用 Python 爬蟲技術可實現自動化資源獲取,提高工作效率。但在爬取過程中,需考慮網站反爬機制,采取相應措施…

DuckDB:現代數據分析的“SQLite“內核革命

在數據工程、數據科學快速演進的今天&#xff0c;一個新的名字正在快速躥紅&#xff1a;DuckDB。 有人稱它是數據分析領域的SQLite&#xff0c;也有人稱它為下一代輕量級OLAP引擎。 無論哪種稱呼&#xff0c;都離不開一個事實&#xff1a; DuckDB 重新定義了小型數據倉庫和本地…

GIS開發筆記(16)解決基于osg和osgearth三維地圖上添加placeNode圖標點擊不易拾取的問題

一、實現效果 二、實現原理 在圖標添加的位置同時添加一個紅色圓球,半徑為5000~8000米,圖標和圓球掛接到同一個group節點,group節點再掛接到根節點,當點擊到圓球時,通過遍歷父節點就可以找到被點擊的圖標節點。 三、參考代碼 //添加圖標代碼 #pragma once #include &…

計算機網絡學習筆記 1-3章

第 1 章 計算機網絡體系結構 【考綱內容】 &#xff08;一&#xff09;計算機網絡概述 計算機網絡的概念、組成與功能&#xff1b;計算機網絡的分類&#xff1b; 計算機網絡的性能指標 &#xff08;二&#xff09;計算機網絡體系結構與參考模型 計算機網絡分層結構&#xff…

基于NVIDIA RTX 4090的COLMAP 3.7安裝指南:Ubuntu 20.04 + CUDA 11.8環境配置【2025最新版!!】

一、引言 三維重建技術作為計算機視覺領域的核心方向&#xff0c;在數字孿生、自動駕駛等領域具有重要應用價值。COLMAP作為開源的SfM&#xff08;Structure-from-Motion&#xff09;工具&#xff0c;其GPU加速特性可顯著提升重建效率。由于最新研究三維重建的需要&#xff08…

Spring Boot 依賴管理: `spring-boot-starter-parent` 與 `spring-boot-dependencies`

前言 在 Spring Boot 的開發實踐中&#xff0c;依賴管理是構建高質量應用的基礎。spring-boot-starter-parent 和 spring-boot-dependencies 是 Spring Boot 提供的兩大核心依賴管理工具&#xff0c;它們在簡化依賴版本控制、統一配置等方面發揮著關鍵作用。 一、核心概念解析…

【MySQL】基本查詢

目錄 增加 查詢 基本查詢 where子句 結果排序 篩選分頁結果 修改(更新) 刪除 普通刪除 截斷表 插入查詢結果 聚合函數 分組查詢 這一節的內容是對表內容的增刪查改&#xff0c;其中重點是表的查詢 增加 語法&#xff1a; INSERT [INTO] table_name [(column [, …

【C++詳解】C++入門(二)引用、內聯函數、nullptr宏

文章目錄 一、引用引用的概念和定義引用的功能引用的特性const引用const用法回顧權限的放大縮小const引用的功能 指針和引用的關系 二、內聯函數三、nullptr補充結構體指針變量類型重定義 一、引用 引用的概念和定義 C祖師爺為了優化在部分場景中使用指針會出現的效率較低和比…

畢業設計-基于深度學習的實時網絡入侵檢測系統

項目技術說明 深度學習實時網絡入侵檢測系統是一種利用深度學習技術對網絡流量進行實時分析&#xff0c;以識別和阻止潛在網絡攻擊的安全解決方案。相比傳統基于規則的入侵檢測系統(IDS)&#xff0c;這種系統能夠通過學習網絡流量的正常模式和異常模式&#xff0c;更有效地檢測…