CUDA動態庫封裝以及呼叫

2021-08-20 04:26:46 字數 3833 閱讀 1790

cuda動態庫封裝以及呼叫

參考:通過將cuda相關計算操作放在庫中,方便在專案中呼叫,省去了每次編譯cu檔案的麻煩,也便於整合到其他平台上。

一、封裝cuda動態庫

主要步驟:修改自定義方式、設定cu檔案項型別為cdua cc++ ,新增依賴庫cudart.lib.

1、建立乙個動態庫,這裡建的庫是x86的,也可以更改為x64.

2、新增cu檔案

3、源程式內容

cudadll32.h

[cpp] 

view plain

copy

// 下列 ifdef 塊是建立使從 dll 匯出更簡單的

// 巨集的標準方法。此 dll 中的所有檔案都是用命令列上定義的 cudadll32_exports

// 符號編譯的。在使用此 dll 的

// 任何其他專案上不應定義此符號。這樣,原始檔中包含此檔案的任何其他專案都會將

// cudadll32_api 函式視為是從 dll 匯入的,而此 dll 則將用此巨集定義的

// 符號視為是被匯出的。

#ifdef cudadll32_exports

#define cudadll32_api __declspec(dllexport)

#else

#define cudadll32_api __declspec(dllimport)

#endif

extern

"c"cudadll32_api 

intvectoradd(

intc, 

inta, 

intb, 

intsize);  

kernel.cu

[cpp] 

view plain

copy

#include "cuda_runtime.h"  

#include "device_launch_parameters.h"    

#include "cudadll32.h"

//cuda核函式  

__global__ void

addkernel(

int*c, 

const

int*a, 

const

int*b)  

//向量相加  

cudadll32_api int

vectoradd(

intc, 

inta, 

intb, 

intsize)  

// 在gpu中為變數dev_a、dev_b、dev_c分配記憶體空間.  

cudastatus = cudamalloc((void

**)&dev_c, size * 

sizeof

(int

));  

if(cudastatus != cudasuccess)   

cudastatus = cudamalloc((void

**)&dev_a, size * 

sizeof

(int

));  

if(cudastatus != cudasuccess)   

cudastatus = cudamalloc((void

**)&dev_b, size * 

sizeof

(int

));  

if(cudastatus != cudasuccess)   

// 從主機記憶體複製資料到gpu記憶體中.  

cudastatus = cudamemcpy(dev_a, a, size * sizeof

(int

), cudamemcpyhosttodevice);  

if(cudastatus != cudasuccess)   

cudastatus = cudamemcpy(dev_b, b, size * sizeof

(int

), cudamemcpyhosttodevice);  

if(cudastatus != cudasuccess)   

// 啟動gpu核心函式  

addkernel <> >(dev_c, dev_a, dev_b);  

// 採用cudadevicesynchronize等待gpu核心函式執行完成並且返回遇到的任何錯誤資訊  

cudastatus = cudadevicesynchronize();  

if(cudastatus != cudasuccess)   

// 從gpu記憶體中複製資料到主機記憶體中  

cudastatus = cudamemcpy(c, dev_c, size * sizeof

(int

), cudamemcpydevicetohost);  

if(cudastatus != cudasuccess)   

result = 0;  

// 重置cuda裝置,在退出之前必須呼叫cudadevicereset  

cudastatus = cudadevicereset();  

if(cudastatus != cudasuccess)   

error:  

//釋放裝置中變數所佔記憶體  

cudafree(dev_c);  

cudafree(dev_a);  

cudafree(dev_b);  

return

result;  

}  4、修改專案的自定義方式為:cuda8.0

5、修改cu檔案的項型別

7、生成dll檔案

二、呼叫動態庫

建立乙個控制台工程,呼叫庫三步驟:

呼叫源**:包含標頭檔案、並把dll檔案拷貝到可行性目錄下

[cpp] 

view plain

copy

// callcudadll32.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include "cudadll32.h"

intmain()  

;  int

b[arraysize] = ;  

intc[arraysize] = ;  

// add vectors in parallel.  

intnumber = vectoradd(c, a, b, arraysize);  

printf(" +  = \n"

,  c[0], c[1], c[2], c[3], c[4]);  

printf("呼叫cuda成功!\n"

);  

return

0;  

}  結果顯示:

CUDA動態庫封裝以及呼叫

參考 通過將cuda相關計算操作放在庫中,方便在專案中呼叫,省去了每次編譯cu檔案的麻煩,也便於整合到其他平台上。一 封裝cuda動態庫 主要步驟 修改自定義方式 設定cu檔案項型別為cdua cc 新增依賴庫cudart.lib.1 建立乙個動態庫,這裡建的庫是x86的,也可以更改為x64.2 新...

Qt呼叫CUDA動態庫及配置

1 首先保證cuda整合到vs下 如下圖順利安裝nsight for vs2012 cuda安裝比較簡單,選自定義安裝,然後一直next 就可以了。2 cuda動態庫的封裝參考以前的部落格 封裝成功後生成dll 和lib兩個檔案。注意 a 這裡封裝的時候要考慮的安裝的qt的版本,如果qt的版本是x8...

c 動態庫封裝及呼叫(1 動態庫介紹)

1 乙個程式從原始檔編譯生成可執行檔案的步驟 預編譯 編譯 彙編 鏈結 1 預編譯,即預處理,主要處理在源 檔案中以 開始的預編譯指令,如巨集展開 處理條件編譯指令 處理 include指令等。2 編譯過程就是把預處理完的檔案進行一系列詞法分析 語法分析 語義分析以及優化後生成相應的彙編 檔案。3 ...