[9] CUDA性能測量與錯誤處理

CUDA性能測量與錯誤處理

  • 討論如何通過CUDA事件來測量它的性能
  • 如何通過CUDA代碼進行調試

1.測量CUDA程序的性能

1.1 CUDA事件

  • CPU端的計時器可能無法給出正確的內核執行時間
  • CUDA事件等于是在你的CUDA應用運行的特定時刻被記錄的時間戳,通過使用CUDA事件API,由GPU來記錄這個時間戳
  • 使用CUDA測量時間需要兩個步驟:創建事件和記錄事件,記錄事件(開始時間與結束時間)
  • 代碼如下:
#include "stdio.h"
#include<iostream>
#include <cuda.h>
#include <cuda_runtime.h>
//Defining number of elements in Array
#define N	50000
//Defining Kernel function for vector addition
__global__ void gpuAdd(int* d_a, int* d_b, int* d_c) {//Getting Thread index of current kernelint tid = threadIdx.x + blockIdx.x * blockDim.x;while (tid < N){d_c[tid] = d_a[tid] + d_b[tid];tid += blockDim.x * gridDim.x;}}int main(void) {//Defining host arraysint h_a[N], h_b[N], h_c[N];//Defining device pointersint* d_a, * d_b, * d_c;//----------創建事件記錄起止時間---------------------cudaEvent_t e_start, e_stop;cudaEventCreate(&e_start);cudaEventCreate(&e_stop);//第一次記錄時間戳cudaEventRecord(e_start, 0);// allocate the memorycudaMalloc((void**)&d_a, N * sizeof(int));cudaMalloc((void**)&d_b, N * sizeof(int));cudaMalloc((void**)&d_c, N * sizeof(int));//Initializing Arraysfor (int i = 0; i < N; i++) {h_a[i] = 2 * i * i;h_b[i] = i;}// Copy input arrays from host to device memorycudaMemcpy(d_a, h_a, N * sizeof(int), cudaMemcpyHostToDevice);cudaMemcpy(d_b, h_b, N * sizeof(int), cudaMemcpyHostToDevice);//Calling kernels passing device pointers as parametersgpuAdd << <512, 512 >> > (d_a, d_b, d_c);//Copy result back to host memory from device memorycudaMemcpy(h_c, d_c, N * sizeof(int), cudaMemcpyDeviceToHost);cudaDeviceSynchronize();//再次記錄時間戳cudaEventRecord(e_stop, 0);//等待所有GPU工作都完成cudaEventSynchronize(e_stop);float elapsedTime;//計算時間插值cudaEventElapsedTime(&elapsedTime, e_start, e_stop);printf("Time to add %d numbers: %3.1f ms\n", N, elapsedTime);int Correct = 1;printf("Vector addition on GPU \n");//Printing result on consolefor (int i = 0; i < N; i++) {if ((h_a[i] + h_b[i] != h_c[i])){Correct = 0;}}if (Correct == 1){printf("GPU has computed Sum Correctly\n");}else{printf("There is an Error in GPU Computation\n");}//Free up memorycudaFree(d_a);cudaFree(d_b);cudaFree(d_c);return 0;
}

1.2 NVIDIA Visual Profiler

  • 如果你在程序中使用了CUDA,代碼的性能并未提升,在這種情況下,能夠可視化地查看代碼的哪些部分花費了最長的時間完成將非常有用,這叫剖析內核執行代碼
  • 英偉達提供了以上用途的工具 nvvp ,就在標準的CUDA安裝包里,在電腦的如下路徑可以被找到:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\libnvvp
    在這里插入圖片描述
  • 執行它需要安裝java環境,即安裝jdk8即可,可以去官網下載,也可以從我的鏈接 jdk8下載,然后需要配置環境變量C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\extras\CUPTI\lib64 C:\Program Files\Java\jdk-1.8\bin
    在這里插入圖片描述
  • 打開nvvp 會出現如下窗口,此工具會分析你的代碼執行過程,采集GPU上的性能數據,運行結束后會給你一個詳細的報告,包括每個內核的執行時間,代碼中每個詳細操作的時間戳,以及代碼存儲器的使用情況
    在這里插入圖片描述
  • 想要得到詳細報告,可依次點擊 File -> New Session,然后在彈出的對話框中選擇程序的.exe文件
    在這里插入圖片描述
  • Profiler 是分析內核執行情況的重要工具,它也可以用來比較兩個內核的性能。它會告訴你就是是代碼里的何種操作拉低了性能

2. CUDA中的錯誤處理

  • 如果系統中沒有可用的GPU設備怎么辦?顯存不足怎么辦?
  • 學會在CUDA程序里邊添加錯誤處理代碼很有好處
#include "cuda_runtime.h"
#include "device_launch_parameters.h"#include <stdio.h>__global__ void gpuAdd(int *d_a, int *d_b, int *d_c) {*d_c = *d_a + *d_b;
}
int main()
{//Defining host variablesint h_a, h_b, h_c;//Defining Device Pointersint *d_a, *d_b, *d_c;//Initializing host variablesh_a = 1;h_b = 4;//定義錯誤結果變量cudaError_t cudaStatus;// Allocate GPU buffers for three vectors (two input, one output)    .cudaStatus = cudaMalloc((void**)&d_c, sizeof(int));if (cudaStatus != cudaSuccess) {fprintf(stderr, "cudaMalloc failed!");goto Error;}cudaStatus = cudaMalloc((void**)&d_a, sizeof(int));if (cudaStatus != cudaSuccess) {fprintf(stderr, "cudaMalloc failed!");goto Error;}cudaStatus = cudaMalloc((void**)&d_b, sizeof(int));if (cudaStatus != cudaSuccess) {fprintf(stderr, "cudaMalloc failed!");goto Error;}// Copy input vectors from host memory to GPU buffers.cudaStatus = cudaMemcpy(d_a,&h_a, sizeof(int), cudaMemcpyHostToDevice);if (cudaStatus != cudaSuccess) {fprintf(stderr, "cudaMemcpy failed!");goto Error;}cudaStatus = cudaMemcpy(d_b, &h_b, sizeof(int), cudaMemcpyHostToDevice);if (cudaStatus != cudaSuccess) {fprintf(stderr, "cudaMemcpy failed!");goto Error;}// Launch a kernel on the GPU with one thread for each element.gpuAdd<<<1, 1>>>(d_a, d_b, d_c);// Check for any errors launching the kernelcudaStatus = cudaGetLastError();if (cudaStatus != cudaSuccess) {fprintf(stderr, "addKernel launch failed: %s\n", cudaGetErrorString(cudaStatus));goto Error;}// Copy output vector from GPU buffer to host memory.cudaStatus = cudaMemcpy(&h_c, d_c, sizeof(int), cudaMemcpyDeviceToHost);if (cudaStatus != cudaSuccess) {fprintf(stderr, "cudaMemcpy failed!");goto Error;}printf("Passing Parameter by Reference Output: %d + %d = %d\n", h_a, h_b, h_c);
Error:cudaFree(d_c);cudaFree(d_a);cudaFree(d_b);return 0;
}
  • -----------------------END----------------------------

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

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

相關文章

UVa1466/LA4849 String Phone

UVa1466/LA4849 String Phone 題目鏈接題意分析AC 代碼 題目鏈接 本題是2010年icpc亞洲區域賽大田賽區的G題 題意 平面網格上有n&#xff08;n≤3000&#xff09;個單元格&#xff0c;各代表一個重要的建筑物。為了保證建筑物的安全&#xff0c;警察署給每個建筑物派了一名警察…

MFC 用Imm類庫實現輸入法修改輸入模式

1.導入Imm類庫&#xff0c;電腦里都有 #include <Imm.h> #pragma comment(lib, "imm32.lib")2.在想要的地方增加代碼 HIMC himc ImmGetContext(m_hWnd);if (himc ! NULL) {ImmSetOpenStatus(himc, TRUE);ImmNotifyIME(himc, NI_COMPOSITIONSTR, CPS_CANCEL,…

時代終結,微軟宣布淘汰VBScript;Flink漏洞被廣泛利用;Grandoreiro銀行木馬強勢回歸,1500多家銀行成攻擊目標 | 安全周報0524

揭秘SolarMarker惡意軟件&#xff1a;多層次基礎設施讓清除工作陷入困境 Recorded Future的新發現表明&#xff0c;SolarMarker信息竊取惡意軟件背后的持續威脅行為者已經建立了一個多層次的基礎設施&#xff0c;以使執法部門的清除工作變得復雜。 該公司在上周發布的一份報告…

SwiftUI中AppStorage的介紹使用

在Swift中&#xff0c;AppStorage是SwiftUI中引入的一個屬性包裝器&#xff0c;在這之前我們要存儲一些輕量級的數據采用UserDefaults進行存取。而AppStorage用于從UserDefaults中讀取值&#xff0c;當值改變時&#xff0c;它會自動重新調用視圖的body屬性。也就是說&#xff0…

React@16.x(11)ref

目錄 1&#xff0c;介紹1.1&#xff0c;得到的結果 2&#xff0c;參數類型2.1&#xff0c;字符串&#xff08;不再推薦&#xff09;2.2&#xff0c;對象2.3&#xff0c;函數函數調用時機 3&#xff0c;注意點 1&#xff0c;介紹 reference 引用。和 vue 中的 refs 類似&#x…

IEC60870-5-104通信規約 | 報文解析 | 組織報文與解析報文(C++)

文章目錄 一、IEC60870-5-104通信規約1.IEC104的報文結構2.IEC104的報文格式--I/U/S格式2.1 I幀2.2 U幀2.3 S幀 3.應用服務數據單元ASDU 二、IEC60870-5-104規約通信過程報文幀解析三、組織報文與解析報文&#xff08;C&#xff09; 一、IEC60870-5-104通信規約 IEC60870-5-104…

golang 守護進程管理

添加守護進程 vim /etc/systemd/system/xxx.service [Unit] DescriptionGo Socket Service Afternetwork.target[Service] Typesimple ExecStart/data/quwan/quwan_ws WorkingDirectory/data/quwan # 停止前發送信號 ExecStop/bin/kill -SIGTERM $MAINPID # 如果超過20s 進程…

筆記-Python lambda

在學習python的過程中&#xff0c;lambda的語法時常會使人感到困惑&#xff0c;lambda是什么&#xff0c;為什么要使用lambda&#xff0c;是不是必須使用lambda&#xff1f; 下面就上面的問題進行一下解答。 1、lambda是什么&#xff1f; 看個例子&#xff1a; 1 g lambda…

什么是GPT-4o,推薦GPT-4o的獲取使用方法,使用GPT4o模型的最新方法教程(2024年5月16更新)

2024年5月最新GPT-4o模型使用教程和簡介 2024年5月最新GPT-4o模型使用教程和簡介 2024 年 5 月 13 日&#xff0c;openai 發布了最新的模型 GPT4o。 很多同學還不知道如何訪問GPT-4、GPT-4 Turbo和GPT-4o等模型&#xff0c;這篇文章介紹如何在ChatGPT中訪問GPT-4o&#xff0…

milvus索引

Milvus是一個開源的向量數據庫引擎&#xff0c;旨在支持大規模向量相似度搜索和分析。索引在Milvus中扮演著非常重要的角色&#xff0c;它們用于加速向量數據的檢索。下面詳細介紹一下Milvus中的索引&#xff1a; 1. 索引類型 Milvus支持多種索引類型&#xff0c;每種類型都適…

無人機偵察:雷達系統概述

一、雷達基本原理 無人機偵察中的雷達系統主要基于無線電波的傳播和反射原理。雷達發射機產生特定頻率的電磁波&#xff0c;并通過天線以定向波束形式向空間發射。當這些電磁波遇到目標時&#xff0c;部分能量會被反射回來&#xff0c;被雷達接收機捕獲。通過測量發射和接收電…

基于SpringBoot+Vue+Redis+Mybatis的商城購物系統 【系統實現+系統源碼+答辯PPT】

前言 該系統采用SpringBootVue前后端分離開發&#xff0c;前端是一個單獨的項目&#xff0c;后端是一個單獨的項目。 ??技術棧&#xff1a;SpringBootVueMybatisRedisMysql ??開發工具&#xff1a;IDEA、Vscode ??瀏覽器&#xff1a;Chrome ??開發環境&#xff1a;JDK1…

Pytorch 筆記

執行下面這段代碼后&#xff0c;為什么返回的是 2 &#xff1f; vector torch.tensor([7, 7]) vector.shape為什么返回的是 torch.Size([2])&#xff1f; 當你創建一個PyTorch張量時&#xff0c;它會記住張量中元素的數量和每個維度的大小。在你的代碼中&#xff0c;torch.t…

通過 js 調起微信官方的微信支付api

通過 js 調起微信官方的微信支付api function onBridgeReady() {WeixinJSBridge.invoke(getBrandWCPayRequest, { "appId": "wx2421b1c4370ec43b", // 公眾號ID&#xff0c;由商戶傳入 "timeStamp": "1395712654", // 時間戳&quo…

動態插入HTML內容有哪些常見用法

動態插入HTML內容的常見用法包括但不限于以下幾種情況&#xff1a; 用戶交互反饋&#xff1a;當用戶在網頁上進行某些操作時&#xff08;如點擊按鈕、提交表單等&#xff09;&#xff0c;可以使用JavaScript動態插入HTML內容來提供即時的反饋或結果。例如&#xff0c;當用戶點…

vue3第三十五節(TS 之 泛型)

本節介紹 ts 中泛型的常用情景 1 什么是泛型 泛型的本質是參數化類型&#xff0c;也就是說所操作的數據類型被指定為一個參數。這種參數類型可以用在類、接口和方法的創建中&#xff0c;分別稱為泛型類、泛型接口、泛型方法。 泛型使用<T>來定義類型&#xff0c;<T…

使用canarytokens進行入侵檢測

canarytokens 基本概念 canarytokens是一種用于識別網絡入侵的工具。它們是一種虛擬的“蜜罐”&#xff0c;可以在網絡上放置&#xff0c;當有人嘗試訪問它們時&#xff0c;可以立即觸發警報&#xff0c;以便及時發現潛在的安全威脅。這些token可以是各種形式&#xff0c;可以…

項目管理基礎知識

項目管理基礎知識 導航 文章目錄 項目管理基礎知識導航一、項目相關概念二、時間管理三、人員管理四、風險管理 一、項目相關概念 項目定義的三層意思 一定的資源約束:時間資源、經費資源、人力資源一定的目標一次性任務 里程碑 是項目中的重要時點或事件持續時間為零&…

深度神經網絡——什么是遷移學習?

1.概述 在練習機器學習時&#xff0c;訓練模型可能需要很長時間。從頭開始創建模型架構、訓練模型&#xff0c;然后調整模型需要大量的時間和精力。訓練機器學習模型的一種更有效的方法是使用已經定義的架構&#xff0c;可能具有已經計算出的權重。這是背后的主要思想 遷移學習…

makefile一些特殊且常用的符號

$^&#xff1a;表示所有的依賴文件列表&#xff0c;多個文件以空格分隔。 $&#xff1a;表示目標文件的名稱。 $<&#xff1a;表示第一個依賴文件的名稱。 $*&#xff1a;表示目標文件的主文件名&#xff08;不包括擴展名&#xff09;。 $?&#xff1a;表示所有比目標文件更…