CUDA (一) 基本裝置管理函式 向量相加

2021-10-02 07:22:32 字數 3155 閱讀 2484

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...