CUDA動態庫封裝以及呼叫

2021-08-01 00:07:42 字數 3411 閱讀 6047

參考:

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

一、封裝cuda動態庫

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

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

2、新增cu檔案

3、源程式內容

cudadll32.h

// 下列 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 int vectoradd(int c, int a, int b, int size);

kernel.cu

#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(int c, int a, int b, int size)

// 在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 << <1, size >> >(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檔案拷貝到可行性目錄下

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

//#include "stdafx.h"

#include "cudadll32.h"

int main()

; int b[arraysize] = ;

int c[arraysize] = ;

// add vectors in parallel.

int number = vectoradd(c, a, b, arraysize);

printf(" + = \n",

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

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

return 0;

}

結果顯示:

CUDA動態庫封裝以及呼叫

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

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 ...