日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

CUDA在Windows下的软件开发环境搭建

發布時間:2024/9/30 windows 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CUDA在Windows下的软件开发环境搭建 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://www.cnblogs.com/yaoyuanzhi/archive/2010/11/13/1876215.html

CUDA在Windows下的軟件開發環境搭建?

本文我們以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.cnblogs.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在“項目屬性”的“鏈接器”的屬性中作一些改動。

?

???????? 在“項目屬性”的“鏈接器”的“輸入”中加入附加依賴項庫文件cudart.lib

?

???????? 最后便可以編譯運行程序了^_^!

總結

以上是生活随笔為你收集整理的CUDA在Windows下的软件开发环境搭建的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。