如何封裝CUDA類庫,編譯成dll以供其餘工程調用

環境:win7_64 VS2010 CUDA6.0 VAX Quadro410函數

安裝配置CUDA環境,這裏就不詳細介紹了。spa

1、手動創建CUDA工程code

  1. 打開VS2010,新建空白項目,起名爲 test2。 接口

  2. 在解決方案管理器中,右鍵點擊工程test2,生成自定義,選擇CUDA6.0文檔

  3. 添加頭文件 t.h,注意這裏t.cuh,也是能夠的,可是爲了外觀上等同於純C\C++類庫,寫成.h編譯器

  4. 添加源文件 t.cu ,右鍵點擊t.cu,屬性,常規,項類型,選擇CUDA C/C++。it

    這樣一個手動創建的CUDA工程就配置好了。io

2、創建CUDA類庫,並生成dll編譯

  1. 在t.h中,寫上函數聲明,包含兩類函數,一是KERNEL函數,使用GPU的並行計算;二是調用KERNEL函數的普通C函數。這兩類函數必須放到cu文件中,由CUDA編譯器編譯,內容以下:class

#ifndef _TEST2_H
#define _TEST2_H//防護重複編譯
#ifdef _DLLEXPORTING//dll處處符號宏定義
#define TEST2_DLLDECL __declspec(dllexport)
#else
#define TEST2_DLLDECL __declspec(dllimport)
#endif
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
//這兩個頭文件是CUDA必備,可是你右鍵->打開文檔「」的時候VS卻不能找到。不須要你手動設置路徑,只須要在 右鍵工程->生成自定義 中,選擇CUDA,VS便可自動找到包含路徑
#include <stdio.h>
__global__ void addKernel(int *c, const int *a, const int *b);//這個是KERNEL函數,不能做爲類庫外部接口
cudaError_t TEST2_DLLDECL  addWithCuda(int *c, const int *a, const int *b, unsigned int size);//這個C函數,內部調用了KERNEL函數,只能放在cu文件中,使用CUDA編譯器編譯。使用__declspec(dllimport)調用聲明,做爲dll的接口供外部調用。

    2.在t.cu中寫入兩個函數的實現,以下:

#include "t.h"
__global__ void addKernel(int *c, const int *a, const int *b)
{
    int i = threadIdx.x;
    c[i] = a[i] + b[i];
}
cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size)
{
 //其餘代碼省略
        addKernel<<<1, size>>>(dev_c, dev_a, dev_b);
        //其餘代碼省略
 return cudaStatus;
}

    3.工程屬性,CUDA C\C++中,選擇Host ,Proprocessor Definition 中,添加_DLLEXPORTING

    4.在工程屬性中,設置生成目標爲DLL,這樣會生成,dll,lib,pdb,等幾種文件

3、普通C++工程調用CUDA類庫dll

  1. 在相同解決方案中新建工程,在工程屬性中,連接器,常規,附加庫目錄,添加上一步生成的lib所在的目錄;在連接器,輸入,附加依賴項,添加test2.lib;保證你生成的exe和dll在同一目錄下。

  2. 工程,右鍵,生成自定義,選擇CUDA

  3. 雖然CUDA編譯器參與了生成過程,可是這個工程就是普通的C、C++工程, 自身使用VC編譯器,你只須要添加#include「..\\test2\\test2.h」就好了

相關文章
相關標籤/搜索