❶ 如何開啟顯卡CUDA功能
1、首先在電腦上找到並點擊「控制面板」選項,如下圖所示。
❷ CUDA編程:操作PTX文件
1、消冊含編譯CUDA文件,姿塵得到PTX文件。nvcc -arch=sm_20 -keep -o t266 t266.cu
2、修改PTX文件
3、nvcc -dryrun -arch=sm_20 -o t266 t266.cu --keep 2>拿笑dryrun.out
4、把-o "t266.ptx"之後的命令分步執行
5、執行
❸ 如何使用CUDA 顯卡編程
CUDA是利用GPU編程。你需要先去下一個visual
studio,然後去CUDA官網下一個現在版喚粗本的CUDA7.0。全部安裝好後就可以編程了。CUDA是並行編程,利用線程組和輪鎮織架構桐告。有很多教程,你可以去看看。最好的一本書是cuda
by
example。
❹ 如何學習cuda c
1、CUDAC編寫WindowsConsoleApplication
下面我們從一個簡單的例子開始學習CUDAC。
打開VS,新建一個CUDAWinApp項目,項目名稱為Vector,解決方案名稱為CUDADemo。依次點擊「確定」,「下一步」,選擇Emptyproject。點擊「Finished」。這樣一個CUDA的項目就建成了。
右鍵點擊Vector項目,依次選擇「添加」、「新建項」、「代碼」、「CUDA」。在名稱中輸入要添加的拿唯則文件名。如Vector.cu。然後點擊添加。
下面在Vector.cu文件里實現兩個向量相加的程序。
//添加系統庫
#include
#include
//添加CUDA支持
#include
__global__voidVecAdd(float*A,float*B,float*C);
__host__voidrunVecAdd(intargc,char**argv);
intmain(intargc,char**argv)
{
runVecAdd(argc,argv);
CUT_EXIT(argc,argv);
}
__host__voidrunVecAdd(intargc,char**argv)
{//初始化host端內存數據
constunsignedintN=8;//向量維數
constunsignedintmemSize=sizeof(float)*N;//需要空間的位元組數
float*h_A=(float*)malloc(memSize);
float*h_B=(float*)malloc(memSize);
float*h_C=(float*)malloc(memSize);
for(unsignedinti=0;i<N;i++)
{h_A[i]=i;h_B[i]山唯=i;}
//設備端顯存空間
float*d_A,*d_B,*d_C;
//初始化Device
CUT_DEVICE_INIT(argc,argv);
CUDA_SAFE_CALL(cudaMalloc((void**)&d_A,memSize));
CUDA_SAFE_CALL(cudaMalloc((void**)&d_B,memSize));
CUDA_SAFE_CALL(cudaMalloc((void**)&d_C,memSize));
CUDA_SAFE_CALL(cudaMemcpy(d_A,h_A,memSize,cudaMemcpyHostToDevice));
CUDA_SAFE_CALL(cudaMemcpy(d_B,h_B,memSize,cudaMemcpyHostToDevice));
VecAdd<<<1,N,memSize>>>(d_A,d_B,d_C);
CUT_CHECK_ERROR("Kernelexecutionfailed");
CUDA_SAFE_CALL(cudaMemcpy(h_C,d_C,memSize,cudaMemcpyDeviceToHost));
for(unsignedinti=0;i<N;i++)
{printf("%.0f",h_C[i]);}
free(h_A);free(h_B);free(h_C);
CUDA_SAFE_CALL(cudaFree(d_A));
CUDA_SAFE_CALL(cudaFree(d_B));
CUDA_SAFE_CALL(cudaFree(d_C));
}
__global__voidVecAdd(float*A,float*B,float*C)
{
//分配sharedmemory
extern__shared__floats_A[];
extern__shared__floats_B[];
extern__shared__floats_C[];
//從globalmemory拷貝到sharedmemory
constunsignedinti=threadIdx.x;
s_A[i]=A[i];
s_B[i]=B[i];
//計算
s_C[i]=s_A[i]+s_B[i];
//拷貝到globalmemory
C[i]=s_C[i];
}
由於這里不是講CUDA編程的,關於它的編程模型已經超出了我要介紹的范圍,您可以閱讀消棚《GPU高性能運算之CUDA》來獲得CUDA編程模型的知識。
編譯Vector項目,執行此項目後會得到圖1如下輸出:
圖1Vector項目執行結果
2、CUDAC編寫DLL模塊
更多情況下的您的軟體可能只是使用CUDA來實現一段程序的加速,這種情況下我們可以使用CUDAC編寫DLL來提供介面。下面我們就將例1編譯成DLL。
在剛才的CUDADemo解決方案目錄下添加一個新的CUDA項目(當然您也可以重新建立一個解決方案)。項目名為VecAdd_dynamic。ApplicationType選為DLL,AdditionalOptions選擇EmptyProject。
第一步,添加頭文件,文件名最好與工程名同名,這樣便於您的維護工作。這里我向項目中添加了VecAdd_dynamic.h,在此頭文件中添加如下代碼
#ifndef_VECADD_DYNAMIC_H_
#define_VECADD_DYNAMIC_H_
//並行計算N維向量的加法
__declspec(dllexport)voidVecAdd(float*h_A,float*h_B,float*h_C,intN);
#endif
第二步,添加cpp文件,文件名為VecAdd_dynamic.cpp,在此文件中添加如下代碼
#include
#include"VecAdd_dynamic.h"
#ifdef_MANAGED
#pragmamanaged(push,off)
#endif
BOOLAPIENTRYDllMain(HMODULEhMole,DWORDul_reason_for_call,LPVOIDlpReserved)
{
returnTRUE;
}
#ifdef_MANAGED
#pragmamanaged(pop)
#endif
第三步,添加def文件,此文件的功能就是確保其它廠商的編譯器能夠調用此DLL里的函數。這一點非常關鍵,因為您的程序可能用到多個廠家的編譯器。文件名為VecAdd_dynamic.def。向該文件中添加:
EXPORTS
VecAdd
第四步,添加cu文件,文件名為VecAdd_dynamic.cu。注意此文件最好直接添加到項目目錄下,不要添加到源文件選項卡或其它已有的選項卡下。
在cu文件里添加如下代碼,實現要導出的函數。
#include
#include
#include
#if__DEVICE_EMULATION__
boolInitCUDA(void)
{returntrue;}
#else
boolInitCUDA(void)
{
intcount=0;
inti=0;
cudaGetDeviceCount(&count);
if(count==0)
{
fprintf(stderr,"Thereisnodevice./n");
returnfalse;
}
for(i=0;i<count;i++)
{
cudaDevicePropprop;
if(cudaGetDeviceProperties(&prop,i)==cudaSuccess)
{
if(prop.major>=1)
{break;}
}
}
if(i==count)
{
fprintf(stderr,"ThereisnodevicesupportingCUDA./n");
returnfalse;
}
cudaSetDevice(i);
printf("CUDAinitialized./n");
returntrue;
}
#endif
__global__voidD_VecAdd(float*g_A,float*g_B,float*g_C,intN)
{
unsignedinti=threadIdx.x;
if(i<N)
{g_C[i]=g_A[i]+g_B[i];}
}
voidVecAdd(float*h_A,float*h_B,float*h_C,intN)
{
if(!InitCUDA())
{return;}
float*g_A,*g_B,*g_C;
unsignedintsize=N*sizeof(float);
CUDA_SAFE_CALL(cudaMalloc((void**)&g_A,size));
CUDA_SAFE_CALL(cudaMalloc((void**)&g_B,size));
CUDA_SAFE_CALL(cudaMalloc((void**)&g_C,size));
CUDA_SAFE_CALL(cudaMemcpy(g_A,h_A,size,cudaMemcpyHostToDevice));
CUDA_SAFE_CALL(cudaMemcpy(g_B,h_B,size,cudaMemcpyHostToDevice));
D_VecAdd<<<1,N>>>(g_A,g_B,g_C,N);
CUDA_SAFE_CALL(cudaMemcpy(h_C,g_C,size,cudaMemcpyDeviceToHost));
cudaFree(g_A);cudaFree(g_B);cudaFree(g_C);
}
第五步,如果您已經正確完成了以上四步,那麼剩下的就只有編譯,只要您用過VS,這一步就不需要我介紹了吧。成功之後,在您的解決方案文件目錄下的Debug文件夾下會有一個VecAdd_dynamic.dll文件。
3、在.NET中使用CUDAC編寫的DLL
下面介紹在託管程序中如何使用VecAdd_dynamic.dll。
第一步,在上面的解決方案CUDADemo下添加一個C++/CLR的Windows窗體應用程序,工程名為NETDemo(當然您也可以重新建一個解決方案,工程名也是隨意的)。
第二步,在窗體上添加一個按鈕,名字隨意,我將它的現實文本改為「調用CUDA_DLL」,給這個按鈕添加click事件。我們的代碼將在這個事件里添加調用VecAdd()的程序。在窗體上添加一個文本框用來顯示調用輸出的結果。
第三步,代碼實現。為工程NETDemo添加一個頭文件,我將它命名為Win32.h,這個文件中主要是實現VecAdd()函數的導入。在此文件中添加如下代碼
#pragmaonce
namespaceWin32
{
usingnamespaceSystem::Runtime::InteropServices;
[DllImport("VecAdd_dynamic.dll",EntryPoint="VecAdd",CharSet=CharSet::Auto)]
extern"C"voidVecAdd(float*h_A,float*h_B,float*h_C,intN);
}
在Form1.h中,#pragmaonce之後namespaceNETDemo之前添加以下代碼。
#include"Win32.h"
#include
在button1_Click()中添加如下代碼
intN=8;
float*h_A=(float*)malloc(N*sizeof(float));
float*h_B=(float*)malloc(N*sizeof(float));
float*h_C=(float*)malloc(N*sizeof(float));
for(inti=0;i<N;i++)
{h_A[i]=i;h_B[i]=i;}
Win32::VecAdd(h_A,h_B,h_C,N);
String^reslut;
for(inti=0;i<N;i++)
{reslut+=Convert::ToString(h_C[i])+",";}
this->textBox1->Text=Convert::ToString(reslut);
free(h_A);free(h_B);free(h_C);
第四步、執行NETDemo項目。點擊「調用CUDA_DLL」,您會看到圖3所示的結果
圖3NETDemo運行結果
到現在為止您已經完全可以正確使用CUDA了。
❺ cuda編程,把CPU轉到CUDA的編程,這演算法有點不正確!求解
cuda是基於標准c語言的,你先把c語言的基礎學好,然後動手自己寫一些c語言的程序,等對c語言有一定的功底之後,再看cuda,cuda與c語言的不同之處我覺得在於那個內核函數,以及如何劃分線程塊和柵格的緯度和大小,以及如何實現對於線程的索引的搜索,讓每一個線程處理對應的一個變數或者幾個變數。
然後是cuda的一些基礎的語法,這些你可以看一些簡單的cuda的例子,例如矩陣相加的例子,通過這些程序的例子可以很好的理解這些語法。
❻ 幻燈片設計模式怎麼找到
打州氏開PPT點 文件-新陵跡罩建尺鬧
右下角就會出現很多模板了(看到了吧!!!!)任你選了
這還可以到到網站上去找噢!!!!
只要點 網站上的模板就OK 了
❼ CUDA編程基礎——Grid、Block、Thread
本消尺余文主要介紹三者之間的關系。
三者之間關系如圖所示,從中可以看出,三者存在包含關系。每個grid分為多個block,每困棗個block分為多個Thread,grid和block最多可拿滾以是三維的。
❽ 什麼是CUDA
官方網站http://www.nvidia.cn/ object/cuda_get_cn_old.html
網路上有
CUDA(Compute Unified Device Architecture),顯卡廠商NVIDIA推出的運算平台。 CUDA™是一種由NVIDIA推出的通用並行計算架構,該架構使GPU能夠解決復雜的計算問題。 它包含了CUDA指令集架構(ISA)以及GPU內部的並行計算引擎。 開發人員現在可以使用C語言來為CUDA™架構編寫程序,C語言是應用最廣泛的一種高級編程語言。所編寫出的程序於是就可以在支持CUDA™的處理器上以超高性能運行。 將來還會支持其它語言,包括FORTRAN以及C++。
目錄
簡介
發展歷程
工具包
發展現況
背景
編輯本段簡介
計算行業正在從只使用CPU的「中央處理」向CPU與GPU並用的「協同處理」發展。為打造這一全新的計算典範,NVIDIA®(英偉達™)發明了CUDA(Compute Unified Device Architecture,統一計算設備架構)這一編程模型,是想在應用程序中充分利用CPU和GPU各自的優點。現在,該架構現已應用於GeForce®(精視™)、ION™(翼揚™)、Quadro以及Tesla GPU(圖形處理器)上,對應用程序開發人員來說,這是一個巨大的市場。
在消費級市場上,幾乎每一款重要的消費級視頻應用程序都已經使用CUDA加速或很快將會利用CUDA來加速,其中不乏Elemental Technologies公司、MotionDSP公司以及LoiLo公司的產品。
在科研界,CUDA一直受到熱捧。例如,CUDA現已能夠對AMBER進行加速。AMBER是一款分子動力學模擬程序,全世界在學術界與制葯企業中有超過60,000名研究人員使用該程序來加速新葯的探索工作。
在金融市場,Numerix以及CompatibL針對一款全新的對手風險應用程序發布了CUDA支持並取得了18倍速度提升。Numerix為近400家金融機構所廣泛使用。
CUDA的廣泛應用造就了GPU計算專用Tesla GPU的崛起。全球財富五百強企業現在已經安裝了700多個GPU集群,這些企業涉及各個領域,例如能源領域的斯倫貝謝與雪佛龍以及銀行業的法國巴黎銀行。
隨著微軟Windows 7與蘋果Snow Leopard操作系統的問世,GPU計算必將成為主流。在這些全新的操作系統中,GPU將不僅僅是圖形處理器,它還將成為所有應用程序均可使用的通用並行處理器。
編輯本段發展歷程
隨著顯卡的發展,GPU越來越強大,而且GPU為顯示圖像做了優化。在計算上已經超越了通用的CPU。如此強大的晶元如果只是作為顯卡就太浪費了,因此NVidia推出CUDA,讓顯卡可以用於圖像計算以外的目的。
目前只有G80、G92、G94、G96、GT200、GF100、GF110、GK100平台(即Geforce 8~Gecorce GTX690)的NVidia顯卡才能使用CUDA,工具集的核心是一個C語言編譯器。G80中擁有128個單獨的ALU,因此非常適合並行計算,而且數值計算的速度遠遠優於CPU。
CUDA的SDK中的編譯器和開發平台支持Windows、linux系統,可以與Visual Studio2005,2008,2010集成在一起。
Geforce8CUDA(Compute Unified Device Architecture)是一個新的基礎架構,這個架構可以使用GPU來解決商業、工業以及科學方面的復雜計算問題。它是一個完整的GPGPU解決方案,提供了硬體的直接訪問介面,而不必像傳統方式一樣必須依賴圖形API介面來實現GPU的訪問。在架構上採用了一種全新的計算體系結構來使用GPU提供的硬體資源,從而給大規模的數據計算應用提供了一種比CPU更加強大的計算能力。CUDA採用C語言作為編程語言提供大量的高性能計算指令開發能力,使開發者能夠在GPU的強大計算能力的基礎上建立起一種效率更高的密集數據計算解決方案。
從CUDA體系結構的組成來說,包含了三個部分:開發庫、運行期環境和驅動(表2)。
開發庫是基於CUDA技術所提供的應用開發庫。目前CUDA的1.1版提供了兩個標準的數學運算庫——CUFFT(離散快速傅立葉變換)和CUBLAS(離散基本線性計算)的實現。這兩個數學運算庫所解決的是典型的大規模的並行計算問題,也是在密集數據計算中非常常見的計算類型。開發人員在開發庫的基礎上可以快速、方便的建立起自己的計算應用。此外,開發人員也可以在CUDA的技術基礎上實現出更多的開發庫。
運行期環境提供了應用開發介面和運行期組件,包括基本數據類型的定義和各類計算、類型轉換、內存管理、設備訪問和執行調度等函數。基於CUDA開發的程序代碼在實際執行中分為兩種,一種是運行在CPU上的宿主代碼(Host Code),一種是運行在GPU上的設備代碼(Device Code)。不同類型的代碼由於其運行的物理位置不同,能夠訪問到的資源不同,因此對應的運行期組件也分為公共組件、宿主組件和設備組件三個部分,基本上囊括了所有在GPGPU開發中所需要的功能和能夠使用到的資源介面,開發人員可以通過運行期環境的編程介面實現各種類型的計算。
由於目前存在著多種GPU版本的NVidia顯卡,不同版本的GPU之間都有不同的差異,因此驅動部分基本上可以理解為是CUDA-enable的GPU的設備抽象層,提供硬體設備的抽象訪問介面。CUDA提供運行期環境也是通過這一層來實現各種功能的。目前基於CUDA開發的應用必須有NVIDIA CUDA-enable的硬體支持,NVidia公司GPU運算事業部總經理Andy Keane在一次活動中表示:一個充滿生命力的技術平台應該是開放的,CUDA未來也會向這個方向發展。由於CUDA的體系結構中有硬體抽象層的存在,因此今後也有可能發展成為一個通用的GPGPU標准介面,兼容不同廠商的GPU產品
編輯本段工具包
是一種針對支持CUDA功能的GPU(圖形處理器)的C語言開發環境。CUDA開發環境包括:
· nvcc C語言編譯器
· 適用於GPU(圖形處理器)的CUDA FFT和BLAS庫。[1]
· 分析器
· 適用於GPU(圖形處理器)的gdb調試器(在2008年3月推出alpha版)
· CUDA運行時(CUDA runtime)驅動程序(目前在標準的NVIDIA GPU驅動中也提供)。[1]
CUDA編程手冊
CUDA開發者軟體開發包(SDK)提供了一些範例(附有源代碼),以幫助使用者開始CUDA編程。這些範例包括:
· 並行雙調排序
· 矩陣乘法
· 矩陣轉置
· 利用計時器進行性能評價
· 並行大數組的前綴和(掃描)
· 圖像卷積
· 使用Haar小波的一維DWT
· OpenGL和Direct3D圖形互操作示例
· CUDA BLAS和FFT庫的使用示例
· CPU-GPU C—和C++—代碼集成
· 二項式期權定價模型
· Black-Scholes期權定價模型
· Monte-Carlo期權定價模型
· 並行Mersenne Twister(隨機數生成)
· 並行直方圖
· 圖像去噪
· Sobel邊緣檢測濾波器
· MathWorks MATLAB®
新的基於1.1版CUDA的SDK 範例現在也已經發布了。[1]
技術功能
· 在GPU(圖形處理器)上提供標准C編程語言
· 為在支持CUDA的NVIDIA GPU(圖形處理器)上進行並行計算而提供了統一的軟硬體解決方案
· CUDA兼容的GPU(圖形處理器)包括很多:從低功耗的筆記本上用的GPU到高性能的,多GPU的系統。
· 支持CUDA的GPU(圖形處理器)支持並行數據緩存和線程執行管理器
· 標准FFT(快速傅立葉變換)和BLAS(基本線性代數子程序)數值程序庫
· 針對計算的專用CUDA驅動
· 經過優化的,從中央處理器(CPU)到支持CUDA的GPU(圖形處理器)的直接上傳、下載通道
· CUDA驅動可與OpenGL和DirectX圖形驅動程序實現互操作
· 支持Linux 32位/64位以及Windows XP 32位/64位 操作系統
· 為了研究以及開發語言的目的,CUDA提供對驅動程序的直接訪問,以及匯編語言級的訪問。[1]
編輯本段發展現況
支持CUDA的GPU銷量已逾1億,數以千計的軟體開發人員正在使用免費的CUDA軟體開發工具來解決各種專業以及家用應用程序中的問題。這些應用程序從視頻與音頻處理和物理效果模擬到石油天然氣勘探、產品設計、醫學成像以及科學研究,涵蓋了各個領域。 目前市面上已經部署了超過一億顆支持CUDA的GPU,數以千計的軟體開發人員正在使用免費的CUDA軟體工具來為各種應用程序加速。
CUDA 的核心有三個重要抽象概念: 線程組層次結構、共享存儲器、屏蔽同步( barrier
synchronization),可輕松將其作為C 語言的最小擴展級公開給程序員。
CUDA 軟體堆棧由幾層組成,一個硬體驅動程序,一個應用程序編程介面(API)
和它的Runtime, 還有二個高級的通用數學庫,CUFFT 和CUBLAS。硬體被設計成支持輕
量級的驅動和Runtime 層面,因而提高性能。
所支持的OS(operating system)
CUDA目前支持linux和Windows操作系統。進行CUDA開發需要依次安裝驅動、toolkit、SDK三個軟體。在安裝目錄/C/src目錄下有很多的常式可以進行學習。
NVIDIA進軍高性能計算領域,推出了Tesla&CUDA高性能計算系列解決方案,CUDA技術,一種基於NVIDIA圖形處理器(GPU)上全新的並行計算體系架構,讓科學家、工程師和其他專業技術人員能夠解決以前無法解決的問題,作為一個專用高性能GPU計算解決方案,NVIDIA把超級計算能夠帶給任何工作站或伺服器,以及標准、基於CPU的伺服器集群
CUDA是用於GPU計算的開發環境,它是一個全新的軟硬體架構,可以將GPU視為一個並行數據計算的設備,對所進行的計算進行分配和管理。在CUDA的架構中,這些計算不再像過去所謂的GPGPU架構那樣必須將計算映射到圖形API(OpenGL和Direct 3D)中,因此對於開發者來說,CUDA的開發門檻大大降低了。CUDA的GPU編程語言基於標準的C語言,因此任何有C語言基礎的用戶都很容易地開發CUDA的應用程序。
由於GPU的特點是處理密集型數據和並行數據計算,因此CUDA非常適合需要大規模並行計算的領域。目前CUDA除了可以用C語言開發,也已經提供FORTRAN的應用介面,未來可以預計CUDA會支持C++、Java、Python等各類語言。可廣泛的應用在圖形動畫、科學計算、地質、生物、物理模擬等領域。
2008年NVIDIA推出CUDA SDK2.0版本,大幅提升了CUDA的使用范圍。使得CUDA技術愈發成熟
編輯本段背景
計算正在從CPU"中央處理"向CPU與GPU"協同處理"的方向發展。 為了實現這一新型計算模式,英偉達發明了英偉達™ CUDA™ 並行計算架構。該架構現在正運用於英偉達™ (NVIDIA) Tesla™、英偉達™ Quadro (NVIDIA Quadro) 以及英偉達™ 精視™ (NVIDIA GeForce) GPU上。對應用程序開發商來說,英偉達™ CUDA™ 架構擁有龐大的用戶群。
在科學研究領域,英偉達™ CUDA™ 受到狂熱追捧。 例如,英偉達™ CUDA™ 能夠加快AMBER這款分子動力學模擬程序的速度。全球有6萬余名學術界和制葯公司的科研人員使用該程序來加速新葯開發。 在金融市場,Numerix和CompatibL已宣布在一款對手風險應用程序中支持英偉達™ CUDA™ ,而且因此實現了18倍速度提升。
在GPU計算領域中,英偉達™ Tesla™ GPU的大幅增長說明了英偉達™ CUDA™ 正被人們廣泛採用。 目前,全球《財富》五百強企業已經安裝了700多個GPU集群,從能源領域中的斯倫貝謝和雪佛龍到銀行業中的法國巴黎銀行,這些企業的范圍十分廣泛。
❾ 深度學習caffe的代碼怎麼讀
1.學習程序的第一步,先讓程序跑起來,看看結果,這樣就會有直觀的感受。
Caffe的官網上Caffe | Deep Learning Framework 提供了很多的examples,你可以很容易地開始訓練一些已有的經典模型,如LeNet。我建議先從 LeNet MNIST Tutorial開始,因為數據集很小,網路也很小但很經典,用很少的時間就可以跑起來了。當你看到terminal刷拉拉的一行行輸出,看到不斷減少的loss和不斷上升的accuracy,訓練結束你得到了99+%的准確率,感覺好厲害的樣子。你可以多跑跑幾個例子,熟悉一下環境和介面。
2.單步調試,跟著Caffe在網路里流動
當玩了幾天之後,你對Caffe的介面有點熟悉了,對已有的例子也玩膩了,你開始想看看具體是怎麼實現的了。我覺得最好的方法是通過單步調試的方式跟著程序一步一步的在網路里前向傳播,然後再被當成誤差信息傳回來。
Caffe就像一個你平常編程中Project,你可以使用IDE或者GDB去調試它,這里我們不細說調試的過程。你可以先跟蹤前向傳播的過程,無非就是從高層次到低層次的調用Forward函數,Solver->Net->Layer->Specific Layer (Convolution等...).後向傳播也類似,但因為你對Caffe裡面的各種變數運算不熟悉,當你跟蹤完前向傳播時可能已經頭暈眼花了,還是休息一下,消化一下整個前向傳播的流程。
剛剛開始你沒有必要對每個Layer的計算細節都那麼較真,大概知道程序的運算流程就好,這樣你才可以比較快的對Caffe有個大體的把握。
3.個性化定製Caffe
到這里,你已經可以說自己有用過Caffe了,但是還不能算入門,因為你還不知道怎麼修改源碼,滿足自己特定的需求。我們很多時候都需要自己定義新的層來完成特定的運算,這時你需要在Caffe里添加新的層。
你一開肯定無從下手,腦子一片空白。幸運的是Caffe github上的Wiki Development · BVLC/caffe Wiki · GitHub已經有了教程了,而且這是最接近latest Caffe的源碼結構的教程,你在網上搜到的Blog很多是有點過時的,因為Caffe最近又重構了代碼。你可以跟著它的指導去添加自己的層。
雖然你已經知道要在哪裡添加自己的東西了,但你遇到最核心的問題是如何寫下面這四個函數。
forward_cpu()
forward_gpu()
backward_cpu()
backward_gpu()
你可以先模仿已有的層去實現這四個函數,而且我相信forward函數很快就可以寫出來了,但backward的還是一頭霧水。這時我們就要補補神經網路里最核心的內容了——Backpropagation.
4.理解並實現Backpropagation
這個我覺得是與平台無關的,不管你是使用Caffe、Torch 7,還是Theano,你都需要深刻理解並掌握的。因為我比較笨,花了好長時間才能夠適應推導中的各種符號。其實也不難,就是誤差順著Chain rule法則流回到前面的層。我不打算自己推導後向傳播的過程,因為我知道我沒有辦法將它表達得很好,而且網上已經有很多非常好的教程了。下面是我覺得比較好的學習步驟吧。
從淺層的神經網路(所謂的全連接層)的後向傳播開始,因為這個比較簡單,而且現在我們常說的CNN和LSTM的梯度計算也最終會回歸到這里。
第一個必看的是Ng深入淺出的Ufldl教程UFLDL Tutorial,還有中文版的,這對不喜歡看英語的同學是個好消息。當然你看一遍不理解,再看一遍,忘了,再看,讀個幾遍你才會對推導過程和數學符號熟悉。我頭腦不大行,來來回回看了好多次。
當然,Ufldl的教程有點短,我還發現了一個講得更細膩清晰的教程, Michael Nielsen寫的Neural networks and deep learning。它講得實在太好了,以至於把我的任督二脈打通了。在Ufldl的基礎上讀這個,你應該可以很快掌握全連接層的反向傳播。
最後在拿出standford大牛karpathy的一篇博客Hacker's guide to Neural Networks,這里用了具體的編程例子手把手教你算梯度,並不是推導後向傳播公式的,是關於通用梯度計算的。用心去體會一下。
這時你躍躍欲試,回去查看Caffe源碼里Convolution層的實現,但發現自己好像沒看懂。雖說卷積層和全連接層的推導大同小異,但思維上還是有個gap的。我建議你先去看看Caffe如何實現卷積的,Caffe作者賈揚清大牛在知乎上的回答在 Caffe 中如何計算卷積?讓我茅塞頓開。重點理解im2col和col2im.
這時你知道了Convolution的前向傳播,還差一點就可以弄明白後向傳播怎麼實現了。我建議你死磕Caffe中Convolution層的計算過程,把每一步都搞清楚,經過痛苦的過程之後你會對反向傳播有了新的體會的。在這之後,你應該有能力添加自己的層了。再補充一個完整的添加新的層的教程Making a Caffe Layer • Computer Vision Enthusiast。這篇教程從頭開始實現了一個Angle To Sine Cosine Layer,包含了梯度推導,前向與後向傳播的CPU和GPU函數,非常棒的一個教程。
最後,建議學習一下基本的GPU Cuda編程,雖然Caffe中已經把Cuda函數封裝起來了,用起來很方便,但有時還是需要使用kernel函數等Cuda介面的函數。這里有一個入門的視頻教程,講得挺不錯的NVIDIA CUDA初級教程視頻。
作者:Gein Chen
來源:知乎
❿ 有沒有一本講解gpu和CUDA編程的經典入門書籍
CUDA自帶的編程手冊就是最好的書籍,因為目前市場上你看到的精典書籍,對於一些架構的描述都已經過時了,怕你看完,如果對架構原理了解不透徹,反而容易誤入歧途,走火入魔。