CUDA在VS2010下5 5設置
分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net
在開始學習之前,首先要做的就是找到一本好的教材,要知道一本好的教材可以讓我們更加輕松地入門。在看了一些個CUDA編程相關的教材之後,我向大家推薦的一本教材叫做《GPU高性能編程CUDA實戰》。本教材相比其他的教材而言,它講得比較細,對於一些我們可能不太明白的知識點做了詳細的說明。而且這本教材以層層深入的方式向我們展示了GPU的世界,從而引領我們進入CUDA編程的大門。其他的教材的話我建議的是《深入淺出談CUDA》以及《CUDA編程指南》,前一本書可以和《GPU高性能編程CUDA實戰》這本書一起看,我建議先看《深入淺出談CUDA》,然後再看《GPU高性能編程CUDA實戰》,這樣理解起來能夠更加的透徹。介紹完了教材,接下來我們就可以進入CUDA的世界了。首先就是需要一個具有NVIDIA顯卡的電腦,因為CUDA只能夠支持NVIDIA的顯卡,其他的顯卡(例如ATI)是不能夠進行CUDA編程的。有了硬件平臺,接下來我們需要的就是編程環境了。由於本人是在windows下進行的學習,所以我推薦的是VS2010+CUDA 5.5。VS2010的下載與安裝這裏就不再贅述,CUDA5.5是集成的CUDA ToolKit和SDK於一身的軟件,可以到NVIDIA Developer Zone去下載,下載地址https://developer.nvidia.com/cuda-downloads,有了工具我們就可以進行CUDA編程了。
CUDA安裝好之後,就可以配置VS2010的cuda環境了,此時cuda已經和你的vs綁定好了。於是我們就可以開始我們的第一個cuda程序:
1.創建一個cuda項目
由於安裝cuda5.5的時候已經和vs2010綁定,所以直接可以創建一個cuda項目。選擇cuda 5.5 runtime就可以。
此時vs2010會自動為這個項目添加一個cuda程序:kernel.cu。直接編譯這個.cu文件,可能會出現"轉換到 COFF 期間失敗: 文件無效或損壞"這樣的錯誤信息,修改如下所示:
右鍵->工程屬性->配置屬性-> 清單工具->輸入和輸出->嵌入清單,選擇[否]
2.CUDA C/C++關鍵字和函數高亮顯示
在上面.cu文件中發現CUDA C/C++的關鍵字__global__等沒有高亮顯示,而且還有下劃曲線。下面進行CUDA C/C++關鍵字和函數的語法高亮顯示,配置Visual AssistX 函數高亮,代碼提示等功能。
下面是關於代碼高亮的設置。共三個設置
2.1.cu文件中C/C++關鍵字高亮
這個設置是讓VS2010編輯.cu文件時,把.cu文件裏的C/C++語法高亮。
設置方法: 在VS2010的菜單 依次點擊:“工具|選項|文本編輯器|文件擴展名”,在這個界面裏: “編輯器”下拉框選“Microsoft Visual C++”,在“Extension”文本框輸入.cu 點擊“添加”按鈕 ,重復工作把.cuh 添加為vc++類型,點擊確定按鈕。 把全部.cu文件關閉,再打開,.cu文件C++關鍵字就高亮了。如果不行就重啟VS2010。但是CUDA的關鍵字還是黑色的,下一步把CUDA關鍵自高亮顯示。
2.2.CUDA關鍵字高亮
為了讓CUDA的關鍵字,如__device__、dim3之類的文字高亮,需要如下步驟:
把SDK_PATH\C\doc\syntax_highlighting\usertype.dat復制到X:\Program Files (X86)\Microsoft Visual Studio 10.0\Common7\IDE\ 目錄下
這裏 X:是安裝VS2010盤符,這是win7 64位下的路徑。
註意:win7 64系統不要復制到這個目錄裏,復制到這裏是不會CUDA關鍵字高亮的:
X:\Program Files \Microsoft Visual Studio 10.0\Common7\IDE\
(如果你的win7是32位的,可能正好是上面這個目錄,應該會高亮的,這是win7 64位和32位的差別)
再次強調:SDK_PATH要換成你安裝SDK的實際路徑,不要直接使用這個字符串。
VS2010需要重啟,重啟後打開.cu文件,CUDA的關鍵字應該變成藍色了。
2.3. CUDA 函數高亮,及CUDA函數輸入代碼提示
實現這個功能就要使用VAssistX了。 首先安裝支持VS2010的Visual AssistX, 在CUDA 安裝前、後安裝都行。需要兩步實現需要的功能:
a) 讓Visual AssistX支持CUDA函數高亮和代碼完成。在VS2010菜單裏依次點擊: “VAssistX->Visual assist X Options->Projects->C/C++Directories”在這個界面的 “Platform”下拉框選 Custom,在“Show Directories for..“下拉框選 Other include files, 然後在下面的輸入框裏,新建、添加三個路徑,點擊確定,三個路徑分別如下:
SDK_PATH的\c\common\inc
SDK_PATH的\shared\inc
X:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include
這裏SDK_PATH要用你安裝的SDK路徑代替,X:是你的CUDA toolkit安裝盤符。
這樣分別在這三個目錄裏面的.h文件定義的函數和類型VAssistX會幫我們在編輯文件時候實現高亮和完成代碼。如果少包含一個路徑,這個目錄裏的.h定義的函數和類型就不會高亮和提示了。
b)讓Visual AssistX支持.cu文件,也就讓Visual AssistX幫我們實現.cu文件高亮和代碼完成功能,需要編輯註冊表。首先關閉VS2010,點擊開始菜單輸入regedit打開註冊表,找到如下位置:HKEY_CURRENT_USER\Software\Whole Tomato\Visual Assist X\VANet10。在右邊找到ExtSource項目,鼠標右鍵選修改,在原有文字後添加如下文字:.cu;.cuh; 確定後
關閉註冊表,重新打開vs2010,Visual AssistX開始支持.cu及.cuh文件的語法高亮及代碼完成。此時.cu文件的CUDA函數是高亮的,使用函數名符號就會自動提示函數全稱,參數類型等信息了。
經過上面的安裝,開發程序應該沒問題了,但會發現有如下的問題:
1. VS2010顯示.cu文件時,有很多CUDA函數下有波浪線
2. 在.cu文件裏使用VS2010的“Go to definition”功能查無法找到CUDA函數的定義。
這兩個問題的原因是VS2010不認識這些函數,沒有指定它們在那個頭文件裏包含的。解決方法其實是一樣的,把CUDA tookit 和CUDA SDK的頭文件路徑加到VS2010的VC++目錄裏面。
CUDA編程主要做的就是和GPU打交道,在和這樣的一個陌生的家夥交流之前,我們需要做的就是先得認識和熟悉這個家夥。
在深入研究如何編寫設備代碼之前,我們需要通過某種機制來判斷計算機中當前有哪些設備,以及每個設備都支持哪些功能。幸運的是,可以通過一個非常簡單的接口來獲得這種信息。首先,我們希望知道在系統中有多少個設備是支持CUDA架構的,並且這些設備能夠運行基於CUDA C編寫的核函數。要獲得CUDA設備的數量.可以調用cudaGetDeviceCount()。這個函數的作用從色的名字就可以看出來。在調用cudaGetDeviceCount()後,可以對每個設備進行叠代、井查詢各個設備的相關信息。CUDA運行時將返回一個cudaDevice Prop類型的結構,其中包含了設備的相關屬性。我們可以獲得哪些屬性?從CUDA 3.0開始,在cudaDeviceProp結構中包含了以下信息:
struct cudaDeviceProp
{
char name[256]; //標識設備的ASCII字符串
size_t totalGlobalMem; //設備上全局內存的總量,單位為字節
size_t sharedMemPerBlock; //在一個線程塊(Block)中可使用的共享內存總量,單位為字節
int regsPerBlock; //每個線程塊中可用的32位寄存器數量
int warpSize; //在一個線程束(warp)中包含的線程數量
size_t memPitch; /在內存復制中最大的修正量(Pitch),單位為字節
int maxThreadsPerBlock; //在一個線程塊中包含的最大線程數目
int maxThreadsDim[3]; //在多維線程塊數組中,每一維包含的最大線程數量
int maxGridSize [3]; //在一個線程格(Grid)中,每一維可以包含的線程塊的數量
size_t totalConstMem; //常量內存的總量
int major; //設備計算功能集的主版本號
int minor; //設備計算功能集的次版本號
int clockRate; //
size_t textureAlignment; //設備的紋理對齊要求
int deviceoverlap; //一個布爾類型值,表示設備是否可以同時執行一個cudaMemory()調用和一個核函數調用
int multiProcessorCount; //設備上多處理器的數量
int kernelExecTimeoutEnabled; //一個布爾值,表示該設備上執行的核函數是否存在運行時限制
int integrated; //一個布爾值,表示設備是否是一個集成的GPU
int canMapHostMemory; //一個布爾值,表示設備是否將主機內存映射到cuda設備地址空間
int computeMode; //表示設備的計算模式:默認,獨占或禁止
int maxTexture1D; //一維紋理的最大大小
int maxTexture2D[2]; //二維紋理的最大維數
int maxTexture3D[3]; //三維紋理的最大維數
int maxTexture2DArray[3]; //二維紋理數組的最大維數
int concurrentKernels ; //一個布爾值,表示設備是否支持在同一個上下文中同時執行多個核函數
};
設備屬性的使用
通過上面的結構體,我們大致了解了設備的屬性,然後我們就可以通過這個結構體來查詢設備屬性了。可能會有人問,到底我們需要這些設備屬性來幹嘛,別著急,以後在編寫相關性能優化的代碼的時候,就知道了解這些屬性的好處了。現在我們只需要知道方法就可以了。
首先我們可以通過兩個函數,第一個就是上面的cudaGetDeviceCount()來選擇設備,然後循環地通過getDeviceProperties()來獲得設備的屬性,之後我們就可以通過這樣的一個結構體變量將設備的屬性值獲取出來。
#include <cuda_runtime.h>
#include <iostream>
using namespace std;
int main()
{
cudaDeviceProp prop;
int count;
cudaGetDeviceCount(&count);
for(int i = 0 ; i < count ; i++)
{
cudaGetDeviceProperties(&prop,i);
cout<<"the information for the device : "<<i<<endl;
cout<<"name:"<<prop.name<<endl;
cout<<"the memory information for the device : "<<i<<endl;
cout<<"total global memory:"<<prop.totalGlobalMem<<endl;
cout<<"total constant memory:"<<prop.totalConstMem<<endl;
cout<<"threads in warps:"<<prop.warpSize<<endl;
cout<<"max threads per block:"<<prop.maxThreadsPerBlock<<endl;
cout<<"max threads dims:"<<prop.maxThreadsDim[0]<<" "<<prop.maxThreadsDim[1]<<
" "<<prop.maxThreadsDim[2]<<endl;
cout<<"max grid dims:"<<prop.maxGridSize[0]<<" "<<
prop.maxGridSize[1]<<" "<<prop.maxGridSize[2]<<endl;
}
return 0;
}
我這邊只是獲取一部分的屬性值,只是和大家介紹一下,具體的屬性值可以按照這樣的方法來獲取。
再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net
CUDA在VS2010下5 5設置