cuda stream

基本概念

cuda stream表示GPU的一個操作隊列,操作在隊列中按照一定的順序執行,也可以向流中添加一定的操作如核函數的啟動、內存的復制、事件的啟動和結束等
一個流中的不同操作有著嚴格的順序,但是不同流之間沒有任何限制
cuda stream中排隊的操作和主機都是異步的,所以排隊的過程中并不耽誤主機的執行

cuda stream的類型

cuda stream 是一種kernel外部級別的并行,包含兩種類型的流:
null stream 和 non-null stream
未定義、默認情況下使用的null stream,創建和釋放都是自動的;而non-null stream的整個過程都是需要人為定義和管理的

cuda stream的特性和范疇

基于cuda stream的異步內核啟動和數據傳輸支持以下類型的并發

  • · 重疊主機和設備的計算
  • · 重疊主機計算和主機設備數據傳輸
  • · 重疊主機設備數據傳輸和設備計算
  • · 并發多個設備計算,多個GPU
    不支持并發:
  • · 主機端的頁鎖內存申請,cudaMallocHost
  • · cudaMalloc
  • · cudaMemset
  • · 兩個地址向同一個設備地址的數據傳輸
  • · null stream

cuda stream基本流程

cudaSteam_t steam;
cudaError_t cudaStreamCreate(&steam);
cudaError_t cudaMemcpyAsync(void* dst, const void* src, size_t count, cudaMemcpyKind kind, cudaStream_t stream);
kernel_name<<<grid, block, sharedMemSize, stream>>>(argument list);
cudaError_t cudaStreamDestroy(cudaStream_t stream);

使用cuda stream加速應用程序的原理

如圖所示,假如要進行一個超大矩陣A和B的求和運算,可以將矩陣分為四份,將原始流中串行執行的數據傳輸、計算、結果傳輸過程使用四個stream來重疊一部分數據傳輸和設備計算,從而達到減少整體耗時的目的。
在這里插入圖片描述

對應的代碼如下

for (int i = 0; i < nstreams; i++) {int offset = i * eles_per_stream;cudaMemcpyAsync(&d_A[offset], &h_A[offset], eles_per_stream * sizeof(int), cudaMemcpyHostToDevice, streams[i]);cudaMemcpyAsync(&d_B[offset], &h_B[offset], eles_per_stream * sizeof(int), cudaMemcpyHostToDevice, streams[i]);......vector_sum<<<... , streams[i]>>>(d_A + offset, d_B + offset, d_C + offset);cudaMemcpyAsync(&h_C[offset], &d_C[offset], eles_per_stream * sizeof(int), cudaMemcpyDeviceToHost, streams[i]);
}for (int i = 0; i < nstreams; i++)cudaStreamSynchronize(streams[i]);

其他注意點

使用cuda stream時,kernel調用的第三個參數是共享內存的配置,當使用靜態共享內存(如 shared unsigned char s_data[BLOCK_HEIGHT + 10][BLOCK_WIDTH + 10];)時,不需要在核函數調用的第三個參數中設置共享內存大小。因為靜態共享內存在編譯時就已經確定了大小,定義時直接指定了固定大小(如 [BLOCK_HEIGHT + 10][BLOCK_WIDTH + 10]),編譯器會自動為其分配內存,無需運行時指定。核函數參數中共享內存設置的作用:核函數調用的第三個參數(如 <<<grid, block, shared_size>>>)僅用于動態共享內存,動態共享內存需要在運行時指定大小,格式為 extern shared type var[];
兩者的區別:
靜態共享內存:編譯時確定大小,定義時顯式指定維度
動態共享內存:運行時確定大小,使用 extern 關鍵字聲明

// 1. 靜態共享內存(無需設置第三個參數)
__global__ void staticSharedKernel() {__shared__ unsigned char s_data[BLOCK_HEIGHT + 10][BLOCK_WIDTH + 10];// ...
}// 調用方式(無需第三個參數)
staticSharedKernel<<<gridDim, blockDim, 0, stream>>>(...);// 2. 動態共享內存(需要設置第三個參數)
__global__ void dynamicSharedKernel(int kernelSize) {extern __shared__ unsigned char s_data[];  // 不指定大小// ...
}// 調用方式(需要指定大小)
size_t sharedSize = (BLOCK_WIDTH + 2*half) * (BLOCK_HEIGHT + 2*half) * sizeof(unsigned char);
dynamicSharedKernel<<<gridDim, blockDim, sharedSize, stream>>>(kernelSize);

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

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

相關文章

數據結構:完全二叉樹

完全二叉樹 定義&#xff1a; 按層序遍歷&#xff08;從上到下&#xff0c;從左到右&#xff09;填充節點。 除了最后一層外&#xff0c;其余各層必須全滿。 最后一層的節點必須 連續靠左。 完全二叉樹不一定是滿二叉樹。 滿二叉樹 (Full Binary Tree)&#xff1a;每個節點都有…

【Java初學基礎】?Object()頂級父類與它的重要方法equals()

object類常見方法/*** native 方法&#xff0c;用于返回當前運行時對象的 Class 對象&#xff0c;使用了 final 關鍵字修飾&#xff0c;故不允許子類重寫。*/ public final native Class<?> getClass() /*** native 方法&#xff0c;用于返回對象的哈希碼&#xff0c;主…

用深度學習(LSTM)實現時間序列預測:從數據到閉環預測全解析

用深度學習&#xff08;LSTM&#xff09;實現時間序列預測&#xff1a;從數據到閉環預測全解析 時間序列預測是工業、金融、環境等領域的核心需求——小到預測設備溫度波動&#xff0c;大到預測股價走勢&#xff0c;都需要從歷史數據中挖掘時序規律。長短期記憶網絡&#xff08…

gpu-z功能介紹,安裝與使用方法

GPU-Z 功能介紹、安裝與使用方法 一、核心功能 硬件信息檢測 識別顯卡型號、制造商、核心架構&#xff08;如NVIDIA Ada Lovelace、AMD RDNA 3&#xff09;、制造工藝&#xff08;如5nm、7nm&#xff09;。顯示顯存類型&#xff08;GDDR6X、HBM2e&#xff09;、容量、帶寬及顯…

數據搬家后如何處理舊 iPhone

每年&#xff0c;蘋果都會推出新款 iPhone&#xff0c;激發了人們升級到 iPhone 17、iPhone 17 Pro、iPhone 17 Pro Max 或 iPhone Air 等新機型的熱情。但在獲得新 iPhone 之前&#xff0c;有一件重要的事情要做&#xff1a;將數據從舊 iPhone 轉移到新設備。雖然許多用戶都能…

Java關鍵字深度解析(上)

這是一份全面的Java關鍵字實戰指南 目錄 1.數據類型關鍵字:內存布局與性能優化 1.1 基礎類型的內存密碼 byte-內存的極簡主義者 int-Java世界的萬能鑰匙 long - 時間與ID的守護者 1.2 引用類型的架構設計 String-不是關鍵字但勝于關鍵字 2.訪問修飾符:企業級權限控制 …

C語言深度解析:指針數組與數組指針的區別與應用

目錄 1 引言&#xff1a;從名字理解本質區別 2 指針數組&#xff1a;靈活管理多個指針 2.1 基本概念與聲明方式 2.2 內存布局與特性 2.3 典型應用場景&#xff1a;字符串數組與多維度數據管理 2.3.1 靜態分配示例&#xff1a;字符串數組 2.3.2 動態分配示例&#xff1a;…

Node.js 高級應用:負載均衡與流量限制

在當今高并發的網絡應用環境中&#xff0c;如何有效地分配服務器資源并保護系統免受惡意攻擊是開發者必須面對的重要問題。Node.js 作為一款廣受歡迎的服務器端 JavaScript 運行時環境&#xff0c;提供了豐富的工具和模塊來應對這些挑戰。本文將深入探討如何在 Node.js 中實現負…

信任鏈驗證流程

信任鏈驗證流程 (The Chain of Trust)整個過程就像一場嚴格的接力賽&#xff0c;每一棒都必須從可信的上一位手中接過接力棒&#xff08;信任&#xff09;&#xff0c;驗證無誤后&#xff0c;再跑自己的那段路&#xff0c;并把信任傳遞給下一棒現在&#xff0c;我們來詳細解讀圖…

黃昏時刻復古膠片風格人像風光攝影后期Lr調色教程,手機濾鏡PS+Lightroom預設下載!

調色教程這套 黃昏時刻復古膠片風格人像風光攝影后期 Lr 調色方案&#xff0c;以落日余暉為核心色彩元素&#xff0c;加入復古膠片質感&#xff0c;讓畫面充滿溫暖與懷舊氛圍。整體色調偏向橙紅與青綠的互補對比&#xff0c;天空的夕陽光影與人像膚色相互映襯&#xff0c;既有膠…

硬件驅動——I.MX6ULL裸機啟動(3)(按鍵設置及中斷設置

重點&#xff1a;1.GIC&#xff1a;&#xff08;Generic Interrupt Controller&#xff09;通用中斷控制器&#xff0c;是ARM架構中用于管理中斷的核心模塊&#xff0c;主要用于現代多核處理器系統。它負責接收&#xff0c;分發并分發中斷請求&#xff0c;減輕CPU負擔&#x…

用deepseek對GPU服務器進行壓力測試

利用 DeepSeek 模型對 GPU 服務器進行壓力測試&#xff0c;核心思路是通過模擬高負載的模型推理 / 微調任務&#xff0c;驗證 GPU 服務器在計算、顯存、網絡等維度的承載能力&#xff0c;同時觀察穩定性與性能瓶頸。以下是具體的測試方案&#xff0c;涵蓋測試環境準備、核心測試…

ARM(7)IMX6ULL 按鍵控制(輪詢 + 中斷)優化工程

一、硬件介紹1. 開關功能定義共 3 個開關&#xff08;兩紅一黃&#xff09;&#xff0c;功能分工明確&#xff1a;中間開關&#xff1a;復位按鈕左邊開關&#xff1a;低功耗按鈕右邊開關&#xff1a;用戶獨立控制的試驗按鍵&#xff08;核心控制對象&#xff09;2. 核心電平邏輯…

【QT隨筆】什么是Qt元對象系統?Qt元對象系統的核心機制與應用實踐

【QT隨筆】什么是Qt元對象系統&#xff1f;Qt元對象系統的核心機制與應用實踐 之所以寫下這篇文章&#xff0c;是因為前段時間自己面試的時候被問到了&#xff01;因此想借此分享一波&#xff01;&#xff01;&#xff01;本文主要詳細解釋Qt元對象系統的概念、作用及實現機制…

從技術視角解析加密貨幣/虛擬貨幣/穩定幣的設計與演進

隨著加密貨幣行情的持續走高&#xff0c;除了資產價值&#xff0c;我想試著從底層程序設計與架構角度解析比特幣、以太坊、穩定幣以及新興公鏈的核心技術方案。作者在2018年設計實施了基于區塊鏈技術的金融項目&#xff0c;并榮獲了國家課題進步獎&#xff0c;對加密貨幣及場景…

[MySQL]Order By:排序的藝術

[MySQL]Order By&#xff1a;排序的藝術 1. 簡介 在數據庫管理中&#xff0c;數據的排序是一項至關重要的操作。MySQL 的 ORDER BY 子句為我們提供了強大而靈活的功能&#xff0c;用于對查詢結果進行排序。無論是按照字母順序排列名稱&#xff0c;還是根據日期或數值進行升序…

【工具代碼】使用Python截取視頻片段,截取視頻中的音頻,截取音頻片段

目錄 ■截取視頻方法 1.下載 ffmpeg-8.0-essentials_build 2.配置到環境變量 3.python代碼 4.運行 5.效果 ■更多 截取視頻中的音頻 截取音頻 Sony的CR3圖片&#xff0c;轉換為JPG ■截取視頻方法 1.下載 ffmpeg-8.0-essentials_build "https://www.gyan.de…

Three.js 平面始終朝向相機

instanceMesh需要讓實例像粒子一樣始終朝向相機 可以如下處理shaderexport const billboarding // billboarding函數的GLSL實現 // 參數: // - position: 頂點動態位置偏移 // - positionLocal: mesh的position // - horizontal: 水平方向是否朝向相機 // - vertical: 垂直方…

旗訊 OCR 識別系統深度解析:一站式解決表格、手寫文字、證件識別難題!

在數字化辦公日益普及的今天&#xff0c;“紙質文檔轉電子”“圖片信息提取” 等需求愈發頻繁&#xff0c;但傳統手動錄入不僅效率低下&#xff0c;還容易出現數據錯誤。近期發現一款實用性極強的工具 —— 旗訊數字 OCR 識別系統&#xff0c;其覆蓋多場景的識別功能、極簡操作…

MissionPlanner架構梳理之(十四)日志瀏覽

概述和目的 Mission Planner 中的日志瀏覽系統提供了加載、查看、分析和解讀 ArduPilot 驅動的飛行器生成的飛行日志的工具。飛行日志包含飛行操作期間記錄的關鍵遙測數據&#xff0c;使用戶能夠查看飛行性能、診斷問題并從過去的飛行中獲取見解。 本頁記錄了日志瀏覽系統的架…