本文將計算兩個向量(陣列)的和。分別在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的探索能力與幾乎即時訪問多個計算核心相結合。系統可以直觀地與本...