lz之前看過一點點的gpu的加速**,後來發現要想寫好cuda**對硬體的理解,記憶體的理解,平行計算等要求還是很高的,然後就很慫的放棄了,沒有繼續下去,而且實驗室基本上都是做cv的,很少有同學做hpc,所以對這方面屬於真小白。
直到前陣子,去gtc china,也還是小白,cuda也就用過最基礎的cudamalloc和cudamemcpy這兩個常規操作,直到後續需要將整個演算法移植到gpu上,才不得不看cuda的相關知識。
回到正題,以前弄深度學習,配置環境,上來就是安裝cuda,相信很多小夥伴都被安裝cuda所折磨過,但是cuda到底是什麼呢?
cuda(compute unified device architecture),是顯示卡廠商nvidia推出的運算平台。 cuda™是一種由nvidia推出的通用平行計算架構,該架構使gpu能夠解決複雜的計算問題。 它包含了cuda指令集架構(isa)以及gpu內部的平行計算引擎。 開發人員可以使用c語言來為cuda™架構編寫程式,c語言是應用最廣泛的一種高階程式語言。所編寫出的程式可以在支援cuda™的處理器上以超高效能執行。cuda3.0已經開始支援c++和fortran。
換個方式理解,就是為程式猿利用gpu的計算能力提供的乙個工具!
什麼是cudnn?
nvidia cudnn是用於深度神經網路的gpu加速庫。它強調效能、易用性和低記憶體開銷。nvidia cudnn可以整合到更高階別的機器學習框架中,如谷歌的tensorflow、加州大學伯克利分校的流行caffe軟體。簡單的插入式設計可以讓開發人員專注於設計和實現神經網路模型,而不是簡單調整效能,同時還可以在gpu上實現高效能現代平行計算。
第乙個cuda**
#include
#include
#define random(x) (rand() % x)
#define max 10
// single block single thread
__global__ void
vector_add_gpu_1
(int
*d_a,
int*d_b,
int*d_c,
int n)
}// single block multiple threads
__global__ void
vector_add_gpu_2
(int
*d_a,
int*d_b,
int*d_c,
int n)
}// multiple blocks multiple threads
__global__ void
vector_add_gpu_3
(int
*d_a,
int*d_b,
int*d_c,
int n)
}int
main()
cudaerror_t cudastatus;
// gpu memory allocate
int*d_a,
*d_b,
*d_c;
cudamalloc((
void**
)&d_a,
sizeof
(int
)*n)
;cudamalloc((
void**
)&d_b,
sizeof
(int
)*n)
;cudamalloc((
void**
)&d_c,
sizeof
(int
)*n)
;// data a and b copy to gpu
cudastatus =
cudamemcpy
(d_a, a,
sizeof
(int
)*n, cudamemcpyhosttodevice);if
(cudastatus != cudasuccess)
cudastatus =
cudamemcpy
(d_b, b,
sizeof
(int
)*n, cudamemcpyhosttodevice);if
(cudastatus != cudasuccess)
//vector_add_gpu_1<<<1, 1>>>(d_a, d_b, d_c, n);
//vector_add_gpu_2<<<1, 12>>>(d_a, d_b, d_c, n);
vector_add_gpu_3<<
<4,
3>>
>
(d_a, d_b, d_c, n)
;// result copy back to cpu
cudamemcpy
(c, d_c,
sizeof
(int
)*n, cudamemcpydevicetohost)
; std:
:cout <<
"the result of add is: "
<< std:
:endl;
for(size_t i =
0; i)// gpu memory free
cudafree
(d_a)
;cudafree
(d_b)
;cudafree
(d_c)
;free
(a);
free
(b);
free
(c);
return0;
}
輸出的結果:
geforce gtx 970m
3024 mb
48 kb 36
7535
6291
the result of add is:912
8810
關於cuda的裝置管理函式,可以對應下面引數進行查詢:
/**
* cuda device properties
*/struct __device_builtin__ cudadeviceprop
;
寫cuda**一直很猶豫,這也算是邁出了第一步吧/(ㄒoㄒ)/~~ 裝置管理 裝置管理概述
i o裝置是作業系統龐大複雜的主要原因之一,不同外部裝置之間,速度差異很大,控制介面複雜,資料表示各異,與其它功能聯絡緊密,特別是檔案系統。在這種情況下,難以針對裝置做統一的規劃與設計。對i o裝置的直接控制,是通過特定的裝置控制器進行的,主機只需要對控制器進行操作即可,無需理會具體裝置的引數細節。...
裸裝置管理
裸裝置 raw device,就是不被作業系統直接管理的裝置。這種裝置少了作業系統一層,i o效率更高。資料庫一般會用到。常與lvm聯用。建立裸裝置 mkdir raw mknod dev rawctl c 162 0 mknod dev raw raw1 c 162 1 mknod dev raw...
linux裝置管理
linux 的裝置管理 6.1 裝置管理概述 linux 裝置的分類 linux 使用套介面 socket 以檔案i o 方式提供了對網路資料的訪問。裝置驅動程式 三 裝置的識別 而多個scsi 硬碟及其各個分割槽分別賦予次裝置號1 2 3 root localhost ls dev sda l b...