cuda c 的一些記錄(3)

2021-10-24 01:45:00 字數 2152 閱讀 6663

僅作個人記錄

參考:cuda程式設計(四)並行化我們的程式_mingchao_sun-csdn部落格

順便說一句,這位博主的cuda系列寫的很清晰,關於環境配置,也建議參考這位博主,簡單直接就行。

過程中碰到問題,還是建議檢視官方api文件

cuda runtime api :: cuda toolkit documentation

上一次的**(單執行緒)速度很拉閘,原因是(來自:cuda程式設計(四)並行化我們的程式_mingchao_sun-csdn部落格):

在 cuda 中,gpu記憶體用於儲存複製過來的資料的部分,稱為global memory。global memory是沒有 cache 的,而且,訪問global memory 所需要的時間(即 latency,延遲)是非常長的,通常是數百個 cycles(時鐘週期)。由於我們的程式只有乙個 thread,所以每次它讀取 global memory 的內容,都要等到讀取資料、累加到 sum 之後,才能進行下一步。這就是為什麼**表現會這麼的差,所使用的記憶體頻寬這麼的小的原因。

由於 global memory 沒有 cache,所以避開巨大的 latency 的方法,是利用大量的threads。假設現在有大量的 threads 同時執行,那麼當乙個 thread 讀取記憶體,開始等待結果的時候,gpu 就可以切換到下乙個 thread,並讀取下乙個記憶體位置。因此,當thread 的數目夠多的時候,就可以完全把 global memory 的巨大 latency 隱藏起來了,而此時就可以有效利用gpu的記憶體頻寬。

所以我們需要並行化我們的程式

#include #include #include //用於計時

#include #include using namespace std;

#define thread_num 1024

#define data_size 1048576

int data[data_size];

//產生隨機數

void generatenum(int *data, int size)

void printdeviceprop(const cudadeviceprop &prop)

//cuda初始化

bool initcuda()

} cudasetdevice(device);//決定使用編號為device的gpu

return true;

}//__global__函式(gpu上執行),計算立方和

__global__ void sum_squares(int *num, int *result, clock_t *time)

int main()

執行結果:

耗時:3189869/(

1620000

∗1000)=

0.001969

s3189869 / (1620000*1000) = 0.001969s

318986

9/(1

6200

00∗1

000)

=0.0

0196

9s記憶體頻寬:

data_size 為 1048576 = 1024*1024 也就是 1m,1m 個 int(32bits) 數字的資料量是 1m * (32/8) byte= 4mb,記憶體頻寬約為:

4 mb

/0.001969s=

2031.488mb

/s=2.03gb

/s4mb / 0.001969s = 2031.488mb/s = 2.03gb/s

4mb/0.

0019

69s=

2031

.488

mb/s

=2.0

3gb/

s已經是快了很多了,是之前的600多倍,不過1050ti的記憶體頻寬在 112 gb/s,還是不夠。

關於threadidx,可以看cuda(10)之深入理解threadidx_林微的部落格-csdn部落格

或者看programming guide :: cuda toolkit documentation

Mongodb一些記錄3

document compoundindexes public class user寫法如上,name和city將作為復合索引,數字引數指定索引的方向,1為正序,1為倒序。方向對單鍵索引和隨機存不要緊,但如果你要執行分組和排序操作的時候,它就非常重要了。document public class d...

boost spirit 的一些記錄

最近的工作跟 boost spirit 多一些,本來想整理乙個較為系統的筆記,不過感覺目前思路還比較凌亂,先隨便記錄一些。spirit 是 boost 中的乙個 ll解析器框架,他完成實現乙個 ebnf 語法解析器的功能,但它的輸入為c 語言。ll parser framework represen...

MFC的一些記錄

型別 mfc 將c 的關鍵字用巨集定義成以下內容。mfc型別 意思 c 型別 bool,boolean 布林型boolean byte 1 位元組數值型 char word 2 位元組數值型 short dword 4 位元組數值型 int uint 無符號整型 unsigned int void ...