參考:
通過將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 ...