CUDA 4 初探平行計算

2021-09-23 14:27:50 字數 3082 閱讀 7075

本文將計算兩個向量(陣列)的和。分別在cpu和gpu上進行計算。

/**

* 平行計算

*/#include

#include

#include

using namespace std;

#define n (200000)

void

add_cpu

(int

*a,int

*b,int

*c)}

__global__ void

add(

int*a,

int*b,

int*c)

}// cpu 求和

intmain_cpu()

gettimeofday

(&tv1,

null);

add_cpu

(a, b, c)

;gettimeofday

(&tv2,

null);

float time =

(1000000

*(tv2.tv_sec - tv1.tv_sec)

+ tv2.tv_usec- tv1.tv_usec)

/1000.0

; cout <<

"time cpu: "

<< time <<

"ms, num : "

<< c[n-1]

<< endl;

return0;

}// gpu 求和

intmain

(int argc,

char

const

*ar**)

cudamemcpy

(dev_a, a, n *

sizeof

(int

), cudamemcpyhosttodevice)

;cudamemcpy

(dev_b, b, n *

sizeof

(int

), cudamemcpyhosttodevice)

;cudamemcpy

(dev_c, c, n *

sizeof

(int

), cudamemcpyhosttodevice)

;gettimeofday

(&tv1,

null);

// 呼叫kernel函式,<<<1,1>>>指gpu啟動1個執行緒塊,每個執行緒塊中有1個執行緒

// <<<256,1>>>指gpu啟動256個執行緒塊,每個執行緒塊中有1個執行緒, 如果是這樣,就會有乙個問題:

// 既然gpu將執行核函式的n個副本,那如何在**中知道當前正在執行的是哪乙個執行緒塊?

// 這個問題可以在**中找出答案:

// int tid = blockidx.x

// 乍一看,將乙個沒有定義的變數賦值給了變數tid,但是 blockidx 是乙個內建變數,在cuda執行是中已經定義了。

// 這個變數把包含的值就是當前執行裝置**的的執行緒塊索引。

// // 問題又來了,為什麼不是寫 int tid = blockidx呢? 事實上,這是因為cuda支援二維的執行緒塊陣列,對於二維空間的計算問題,

// 例如矩陣數**算或者影象處理,使用二維索引往往回答來很大的便利,因為他可以避免將線性索引轉換為矩形索引。

add<<

<1,

1>>

>

(dev_a, dev_b, dev_c)

;gettimeofday

(&tv2,

null);

float time =

(1000000

*(tv2.tv_sec - tv1.tv_sec)

+ tv2.tv_usec- tv1.tv_usec)

/1000.0

; cout <<

"time gpu: "

<< time <<

"ms"

;cudamemcpy

(c, dev_c, n *

sizeof

(int

), cudamemcpydevicetohost)

; cout <<

", num : "

<< c[n-1]

<< endl;

cudafree

(dev_a)

;cudafree

(dev_b)

;cudafree

(dev_c)

;main_cpu()

;return0;

}// time gpu: 0.048ms

// time cpu: 1.248

當我把n設定的很大的時候 n = 200000

結果,這個時候gpu的運算速度是cpu的33.6倍

當我把n設定的比較小的時候 n = 200,此時很明顯cpu的運算速度超過了gpu

為什麼會出現上述情況呢?

舉個例子說明:

比如說現在有2000個人要乘船過江去,如果論單個人的運輸速度,那麼摩托艇肯定快於大輪渡了;但是要是論全部運輸完所用的時間,那肯定輪渡早運輸完了,摩托艇還在飛快的跑著呢?

從理論上來說,1080ti有 3584換個cuda核心,頻率是1582mhz, 2flops/cycle,浮點效能358415822=11.3tfops。

每個cuda核心 2flops/cycle * 1.5g = 3gtflops

同期intel® xeon® cpu e5-2620 v3 @ 2.40ghz 12核心。運算峰值:2.4x1232(32是v4處理器支援simd的速算因子,即乙個始終週期內能做32次浮點運算)=1.34tflops。

單核效能:2.432=76.8tflops

如此看來,單核cpu的新能完勝gpu的單核;也就是說,在cuda和很少的情況下,計算效能不如cpu; 但是架不住cuda的核心多呀,人多力量大。

所以得出結論:cpu和 gpu的計算能力存在乙個交叉點。過了這個交叉點,gpu遠遠超過了cpu.

CUDA平行計算框架程式設計 矩陣相乘平行計算

當下的gpgpu general purpose gpu graphic process unit cuda compute unified device architecture 即通用計算圖形處理器。安裝過程可參考我的另一篇blog cuda軟體架構 1 開發庫 cuda library 2 執...

CUDA 程式設計 之平行計算思想

思想這個東西,是個人理解的問題。無論是 mpi openmp 等等平行計算的方法,都是使用多執行緒同時併發的執行。所謂併發,就是看起來一起執行罷了,在真正的單核cpu中,是在某段時間內,序列執行,通過執行緒排程來掩蓋其執行的順序。那麼cuda 程式設計中,平行計算的思想是simt,instructi...

python平行計算 python平行計算

0.基礎並行 發 multiprocessing threading 1.concurrent 2.併發 asynico 3.ipython下的平行計算 使用ipyparallel庫的ipython提供了前所未有的能力,將科學python的探索能力與幾乎即時訪問多個計算核心相結合。系統可以直觀地與本...