關鍵詞: 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的一個通路的過程。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5CM3ADNwUjMwMTMxEDMxAjMvwVNwIjN5EzLcBTMwIzLcNXZnFWbp9CXt92YuM3ZvxmYuNmLyADMjlGcvw1LcpDc0RHaiojIsJye.jpg)
當我們将工程檔案拷貝到新的目錄下時,這樣的一個通路方式必然會失效。于是我們需要做如下的一些設定。
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 下的 軟體開發環境 搭建 此文連結: http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%B1%87/38217.shtml