天天看點

windows下搭建CUDA開發環境——GPU程式設計

關鍵詞: cuda   windows   下   軟體開發   環境   搭建

您在找熱搜關鍵詞:

引自:http://www.makaidong.com/yaoyuanzhi/archive/2010/11/13/1876215.html

本文我們以visual studio 2005 為例示範cuda的安裝以及軟體開發環境搭建,以及cuda與mfc聯調的實作。

1.cuda安裝包

cuda是免費使用的,各種作業系統下的cuda安裝包均可以在http://www.nvidia.cn/object/cuda_get_cn.html上免費下載下傳。cuda提供3個安裝包,分别是: driver, toolkit和sdk。sdk包括許多例子程式和函數庫。toolkit包括cuda的基本工具。安裝時按照順序,先安裝driver,再toolkit,最後sdk。

cuda toolkit

安裝後在nvidia_cuda_toolkit安裝目錄下出現6個檔案夾,分别是:

bin :     工具程式和動态連結庫

doc :     相關文檔

include : header頭檔案包

lib :     程式庫

open64 :  基于open64的cuda compiler

src :     部分原始代碼

安裝過程中toolkit自動設定了3個環境變量:cuda_bin_path、cuda_inc_path和cuda_lib_path分别對應工具程式庫、頭檔案庫和程式庫,預設路徑為目前安裝檔案夾下的bin、include 和lib三個檔案夾。

cuda sdk

sdk可以根據需要選擇安裝(推薦安裝,因為sdk中的許多例子程式和函數庫非常有用。

cuda display

對于沒有安裝nv顯示卡的計算機,不需要安裝display安裝包,程式也可以在模拟模式下運作。

2.在visual studio2005中使用cuda

    cuda的主要工具是nvcc,它會執行所需要的程式,将cuda程式編譯并執行。本文将介紹在windows環境下,基于vs 2005ide環境下的幾種配置cuda nvcc的方法。

2.1 nv自帶的修改模闆方法

    在cuda sdk安裝目錄下的project目錄下建立檔案夾,命名為想要建立的工程名字,比如test1。并在project檔案夾下找到sdk自帶的template檔案夾,将template檔案夾下所有的檔案copy到test1下。

    将copy到test1檔案夾下的所有檔案檔案名中的template改為test(也即是自己的工程檔案名字)。test.sln與test.vcproj是vs 8系列的工程檔案,test_vc7.sln與test_vc7.vcproj是vs 7系列的工程檔案,可以根據自己visual studio的版本選擇要更改的工程檔案,其它兩個可以删除。在visual studio c++ 2005 express中,删除test_vc7.sln與test_vc7.vcproj即可。

将*.cu、*.sln和*.vcproj用記事本等文字編輯軟體其他 打開,使用查找替換功能将以上檔案中所有的template改為test。

使用*.sln檔案打開整個工程,可以任意更改代碼,編譯運作。

修改輸出檔案路徑(可選,如不改變,可執行檔案輸出到上兩級目錄下的bin目錄中),如使用了cuda sdk中的動态連結庫,将相應的動态連結庫拷貝到可執行檔案的同一目錄下。

    總結:這種方法是nv公司為windows下使用vs編譯cuda提供的标準方法(參見\sdk\doc\cuda_sdk_release_notes_windows.txt), 使用公司提供的模闆更改為自己想要建立的工

此文來自: 馬開東部落格 轉載請注明出處 網址: http://www.makaidong.com

程,也可以參照以上方法,在sdk project庫中的找到與自己想建立工程相近的其它工程做更改。

2.2 在win32項目中建立.cu檔案

    首先建立一個c++的win32的控制台應用程式empty project,并添加一個新的源檔案,此處以main.cu為例。

p1.建立一個win32 project

設定為empty project

p3.建立一個cuda程式專用的main.cu檔案

在solution explorer 中main.cu上右鍵單擊,選擇property。在打開的對話框中選擇general,确定tool的選項是custom build tool。

确認tool選項為custom build tool。

選擇custom bulid step,在command line中分别設定模式參數。這裡要分幾種編譯方式來設定指令行參數。

(1)、release 模式:"$(cuda_bin_path)\nvcc.exe" -ccbin "$(vcinstalldir)bin" -c -dwin32 -d_console -d_mbcs -xcompiler /ehsc,/w3,/nologo,/wp64,/o2,/zi,/mt -i"$(cuda_inc_path)" -o $(configurationname)\$(inputname).obj $(inputfilename)

(2)、debug 模式:"$(cuda_bin_path)\nvcc.exe" -ccbin "$(vcinstalldir)bin" -c -d_debug -dwin32 -d_console -d_mbcs -xcompiler /ehsc,/w3,/nologo,/wp64,/od,/zi,/rtc1,/mtd -i"$(cuda_inc_path)" -o $(configurationname)\$(inputname).obj $(inputfilename)

    如果計算機中沒有安裝nv顯示卡,使用模拟模式,需增加兩個額外的設定。建立兩個模式emurelease和emudebug。

p6.建立模式(1)

p6.建立模式(2)

        對建立立的emurelease和emudebug的command line分别設定為:

(1)、emurelease 模式:"$(cuda_bin_path)\nvcc.exe" -ccbin "$(vcinstalldir)bin" -deviceemu -c -dwin32 -d_console -d_mbcs -xcompiler /ehsc,/w3,/nologo,/wp64,/o2,/zi,/mt -i"$(cuda_inc_path)" -o $(configurationname)\$(inputname).obj $(inputfilename)

(2)、emudebug 模式:"$(cuda_bin_path)\nvcc.exe" -ccbin "$(vcinstalldir)bin" -deviceemu -c -d_debug -dwin32 -d_console -d_mbcs -xcompiler /ehsc,/w3,/nologo,/wp64,/od,/zi,/rtc1,/mtd -i"$(cuda_inc_path)" -o $(configurationname)\$(inputname).obj $(inputfilename)

3.1.4、對所有的設定模式,均在 custom build step 的 outputs 中加入 $(configurationname)\$(inputname).obj。

p7.設定outputs

右鍵單擊project,選擇property,再選擇linker,對所有模式修改以下設定:

(1)、general/enable incremental linking:no

(2)、general/additional library directories:$(cuda_lib_path)

(3)、input/additional dependencies:cudart.lib

p8.設定linker參數(1)

p9.設定linker參數(2)

設定頭檔案路徑tools -> options,彈出以下對話框

将右邊的下拉框選擇include files,點選添加按鈕,将c:\program files\nvidia corporation\nvidia cuda sdk\common\inc選入到頭檔案搜尋路徑中。

選擇連結庫檔案路徑

同上庫頭檔案路徑選擇,将右邊下拉框選擇library file,選擇路徑c:\program files\nvidia corporation\nvidia cuda sdk\common\lib。

完成,可以編寫cuda程式,并直接編譯執行了(編譯方式于c++相同)

總結:這種方法既不需要借助模闆,也不需要使用第三方的軟體其他 。但是操作相當複雜,而且僅對配置的單個project有效。如果重建立立一個project又要重新配置一遍。

需要注意的是,當需要使用cuda sdk中的動态連結庫(以dll為字尾)時,将動态連結庫和生成的可執行檔案放在同一個路徑下。

如果是driver api,需要添加”cuda.lib cudart.lib”,頭檔案#include ,#include。

2.3 使用cuda_vs_wizard插件

    下載下傳cuda_vs_wizard插件并安裝。

    将cuda安裝目錄下的bin和cuda sdk安裝目錄下的bin\win32檔案夾下的四個檔案夾(debug, emudebug, release, emurelease)的路徑全部加入環境變量中的path變量中。

    使用vc直接建立工程。在工程選項裡選擇cudawinapp。

如果是在模拟模式下運作,需要在解決方案 中右鍵屬性,在configuration properities 中将configuration 設定為emu模式。

模拟模式設定(1)

模拟模式設定(2)。

總結:這種方法雖然使用了第三方的工具,但隻需要配置一

您在找熱搜關鍵詞:

此文來自: 馬開東部落格 轉載請注明出處 網址: http://www.makaidong.com

次即可,而且配置簡單,以後每次建立cuda程式都可以直接生成。如果是建立預定義頭檔案的工程,則建立的cuda程式,會自帶一個sample.cu,可以選擇在sample.cu的基礎上更改或删除sample.cu重建立立.cu檔案。如果是建立空工程則沒有。建立方法.cu檔案的方法是建立.cpp檔案或.txt檔案改名為.cu檔案即可。推薦使用。

2.4 文法高亮設定。

找到cuda sdk安裝目錄下doc\syntax_highlighting\自帶的檔案usertypt.dat,将其copy到microsoft visual studio 安裝目錄的\common7\ide下。

在visual studio中做以下設定: 在tools-> options ->text editor-> file extension中添加cu。編輯方式microsoft visual c++。

p16.設定高亮

重新啟動visual studio,完成高亮設定。

??

3.配置生成規則。将sdk目錄下c/common目錄下的cuda,rules拷貝到vs安裝目錄下的vc\vcprojectdefaults子目錄下。建立一個 win32工程,并在項目上右擊,選擇custombuildrules,在cuda build rule前打勾。在工程中建立一個.cu檔案,右擊屬性後檢視自定義生成規則是否已經是cuda build rule。

3. cuda在mfc中的聯調方法執行個體

3.1 sdk中程式的編譯

         例如我們的sdk安裝路徑“c:\program files\nvidia corporation\nvidia cuda sdk\projects\devicequery”中可以找到devicequery的工程檔案。

         當我們把這個檔案夾拷貝到其他目錄下時,會出現找不到頭檔案的錯誤,如“找不到cutil.h”。為什麼會出現這種情況呢?我們注意到在devicequery中對其的引用#include <cutil.h>,是在系統目錄下的。這個系統目錄在c:\program files\nvidia corporation\nvidia cuda sdk\common\inc中可以找到cutil.h頭檔案。

         通過檢視devicequery.cu的屬性,通過觀察“指令行”:

"$(cuda_bin_path)\nvcc.exe" -ccbin "$(vcinstalldir)bin" -c -d_debug -dwin32 -d_console -d_mbcs -xcompiler /ehsc,/w3,/nologo,/wp64,/od,/zi,/rtc1,/mtd -i"$(cuda_inc_path)" -i./ -ihttp://www.makaidong.com/common/inc -o $(configurationname)\devicequery.obj devicequery.cu

注意紅色下劃線部分,帶便往上退兩個檔案夾,然後進入commom檔案夾中的inc檔案夾。再比較之前的兩個路徑,這正好是decicequery.sin檔案到cutil.h的一個通路的過程。

windows下搭建CUDA開發環境——GPU程式設計
windows下搭建CUDA開發環境——GPU程式設計

         當我們将工程檔案拷貝到新的目錄下時,這樣的一個通路方式必然會失效。于是我們需要做如下的一些設定。

1.  首先我們需要将c:\program files\nvidia corporation\nvidia cuda sdk\bin\win32檔案目錄下的四個檔案夾分别添加到環境變量裡。

windows下搭建CUDA開發環境——GPU程式設計

具體的操作方法是:”我的電腦” ->屬性->進階->環境變量path,注意路徑都是全路徑,每個變量間用“;”分隔。

windows下搭建CUDA開發環境——GPU程式設計

2.  注意到這裡面的系統變量nvsdkcuda_root為c:\program files\nvidia corporation\nvidia cuda sdk。

windows下搭建CUDA開發環境——GPU程式設計

我們在轉移了工程檔案目錄後,隻需要将指令行進行修改。即将之前的紅線部分作如下修改:

"$(cuda_bin_path)\nvcc.exe" -ccbin "$(vcinstalldir)bin" -c -d_debug -dwin32 -d_console -d_mbcs -xcompiler /ehsc,/w3,/nologo,/wp64,/od,/zi,/rtc1,/mtd -i"$(cuda_inc_path)" -i./ -i"$(nvsdkcuda_root)/common/inc" -o $(configurationname)\devicequery.obj devicequery.cu

3.  此外我們還需要将“項目屬性”的“連結器”做對應的修改。然後該程式即可正常編譯運作。

windows下搭建CUDA開發環境——GPU程式設計

3.2 mfc中應用cuda程式

本章建立一個mfc工程,然後在該工程中添加對cu檔案中cuda程式的調用。本章還可參考sdk中的程式示例cppintegration。

3.2.1 配置visualstudio環境配置準備工作

文法高亮:将d:\programming\cuda\sdk\doc\syntax_highlighting\visual_studio_8裡面的usertype.dat檔案copy到microsoft visual studio 8\common7\ide目錄下面(如果已經存在,就追加到原來的後面)。

設定vs2005環境(因為本程式将不僅僅是在cu檔案中使用cuda函數了,其中還包括在cpp檔案中使用,是以需要包括這些庫):

進入tools|options|projects and solutions|vc++directories 添加:

include files:

d:\programming\cuda\toolkit\include

d:\programming\cuda\sdk\common\inc

library files:

d:\programming\cuda\toolkit\lib

d:\programming\cuda\sdk\common\lib

source files:d:\programming\cuda\sdk\common\src    

文本編輯器設定:進入vc++ project settings:c/c++ file extensions:添加*.cu,在text editor-file extension:添加cu 對應editor到microsoft vc++ editor。    

visual assist x設定(如果需要安裝的話):關閉已經所有打開的visual studio,安裝va,之後進入系統資料庫編輯器:hkey_current_user\software\whole tomato\vanet8 找到右邊的extsource項,将其值添加.cu;.cuh;之後關閉,再次打開vs2005即可。)

3.2.2 建立全局函數和頭檔案

         首先我們在頭檔案和資源檔案中建立全局函數以供調用:

         這裡的testcuda函數采用extern關鍵字聲明c語言擴充。

windows下搭建CUDA開發環境——GPU程式設計
windows下搭建CUDA開發環境——GPU程式設計

我們在檢視類視圖的時候就可以看到該全局函數:

windows下搭建CUDA開發環境——GPU程式設計

3.2.3 建立cuda代碼

為了标示清楚,我們首先建立了一個名為cuda的篩選器,然後在該篩選器中分别建立名為first.cu和first_kernel.cu的兩個源代碼檔案。然後其中添加代碼如下:

#include "stdio.h"

#include "cutil.h"

#include "first_kernel.cu"

extern "c" void runtest(float *source,int datalen,float *result)

{

    int count;

    cudagetdevicecount(&count);

    if(count == 0) {

        fprintf(stderr, "there is no device.\n");

         *result=-1;

    }

    int i;

    for(i = 0; i < count; i++) {

        cudadeviceprop prop;

        if(cudagetdeviceproperties(&prop, i) == cudasuccess) {

            if(prop.major >= 1) {

                break;

            }

        }

    }

    if(i == count) {

        fprintf(stderr, "there is no device supporting cuda 1.x.\n");

         *result=-1;

    }

     float * d_source,*d_result;

     cudamalloc((void**)&d_source,datalen*sizeof(float));

     cudamalloc((void**)&d_result,sizeof(float));

     cudamemcpy(d_source,source,datalen*sizeof(float),cudamemcpyhosttodevice);

     kernel<<<1,256,0>>>(d_source,datalen,d_result);

     cudamemcpy(result,d_result,sizeof(float),cudamemcpydevicetohost);

     cudafree(d_source);

     cudafree(d_result);

}

以及在first_kernel.cu中添加的核心函數(即并行部分):

#ifndef _first_kernel_h_

#define _first_kernel_h_

__global__ void kernel(float *source,int len,float *result)

{

     int i;

     float sum;

     sum=0;

     for(i=0;i<len;i++)

         sum+=*(source+i);

     *result=sum;

}

#endif

3.2.3 修改連結器設定

首先是first.cu的屬性設定:

将“正常”中的工具一項設為“自定義生成工具”。

然後在指令行中參考3.1中的設定方式。這裡需要注意的是“附加依賴項”為first_kernel.cu.

windows下搭建CUDA開發環境——GPU程式設計
windows下搭建CUDA開發環境——GPU程式設計

而在first_kernel.cu中的屬性設定,我們需要将這個存放核心函數的檔案“從生成中排除”。

windows下搭建CUDA開發環境——GPU程式設計

         最後是設定項目的屬性,仍舊參照3.1在“項目屬性”的“連結器”的屬性中作一些改動。

windows下搭建CUDA開發環境——GPU程式設計

  &nb

搜尋此文相關文章: CUDA  在 Windows  下的 軟體開發環境 搭建 此文連結: http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%B1%87/38217.shtml

繼續閱讀