1. 程式人生 > >windows下搭建CUDA開發環境——GPU程式設計

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

引自: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), 使用公司提供的模板更改為自己想要建立的工

程,也可以參照以上方法,在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)。

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

您在找熱搜關鍵詞: 次即可,而且配置簡單,以後每次建立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的一個訪問的過程。

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

1.  首先我們需要將c:\program files\nvidia corporation\nvidia cuda sdk\bin\win32檔案目錄下的四個資料夾分別新增到環境變數裡。

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

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

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

"$(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.  此外我們還需要將“專案屬性”的“連結器”做對應的修改。然後該程式即可正常編譯執行。

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語言擴充套件。

我們在檢視類檢視的時候就可以看到該全域性函式:

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.

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

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

  &nb

搜尋此文相關文章:CUDA 在Windows 下的軟體開發環境搭建

原文連結:地址