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