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

2021-08-19 08:37:28 字數 3045 閱讀 5349

當下的gpgpu(general purpose gpu(graphic process unit))—(cuda: compute unified device architecture)即通用計算圖形處理器。

安裝過程可參考我的另一篇blog:

cuda軟體架構:(1)開發庫(cuda library)(2)執行時環境(cuda runtime)(3)驅動(cuda driver)

cuda的執行緒層次結構:kenel-->grid-->block-->thread

gpu硬體的乙個核心元件是sm(streaming multiprocessor)流式多處理器,sm可以併發地執行數百個執行緒,且乙個block對應乙個sm,而乙個sm則可以對應多個block

grid只是邏輯層;而sm才是真正的物理層;block的大小一般要設定成32的倍數

在vs上的配置過程可參考blog:

code:

#include #include #include #include //#include #include "cuda_runtime.h"  

#include "device_launch_parameters.h"

#define dword unsigned long

#pragma comment(lib,"winmm.lib")

using namespace std;

__global__ void add(float* a, float* b, float* c, int n)

}int main()

//申請device記憶體

float *d_x, *d_y, *d_z;

cudamalloc((void**)&d_x, nbytes);

cudamalloc((void**)&d_y, nbytes);

cudamalloc((void**)&d_z, nbytes);

//將host資料拷貝到device

cudamemcpy((void*)d_x, (void*)x, nbytes, cudamemcpyhosttodevice);

cudamemcpy((void*)d_y, (void*)y, nbytes, cudamemcpyhosttodevice);

//定義kernel的執行配置

dim3 blocksize(256);

dim3 gridsize((int)((n + blocksize.x - 1) / blocksize.x));

//編寫計時函式

dword t1, t2;

t1 = timegettime();

//執行kernel

add << < gridsize, blocksize >> >(d_x, d_y, d_z, n);

t2 = timegettime();

printf("use time:%f (s)\n", (t2 - t1)*1.0 / 1000);

//將device得到的結果拷貝到host

cudamemcpy((void*)z, (void*)d_z, nbytes, cudamemcpydevicetohost);

//檢查執行結果

float maxerror = 0.0;

for (int i = 0; i < n; i++)

cout << "最大誤差:" << maxerror << endl;

//釋放device記憶體

cudafree(d_x);

cudafree(d_y);

cudafree(d_z);

//釋放host記憶體

free(x);

free(y);

free(z);

system("pause");

return 0;

}

實現矩陣相乘平行計算的**:

#include #include #include #include //#include #include "cuda_runtime.h"  

#include "device_launch_parameters.h"

#define dword unsigned long

#pragma comment(lib,"winmm.lib")

using namespace std;

__global__ void add(float* a, float* b, float* c, int n)

}__global__ void matrixmuiondevice(int *m, int *n, int *p, int width)

p[y * width + x] = pervalue;

}int main()

} cudamemcpy(m, a, num * sizeof(int), cudamemcpyhosttodevice);

cudamemcpy(n, b, num * sizeof(int), cudamemcpyhosttodevice);

cudaeventrecord(start, 0);

matrixmuiondevice << <1, dimblock >> >(m, n, p, width);

cudathreadsynchronize();

cudaeventrecord(stop, 0);

cudaeventsynchronize(stop);

cudaeventelapsedtime(&elapsedtime, start, stop);

printf("%f\n", elapsedtime);

cudamemcpy(c, p, num * sizeof(int), cudamemcpydevicetohost);

for (int i = 0; i < 30; i++)

cout << endl;

} cudafree(m);

cudafree(n);

cudafree(p);

system("pause");

return 0;

}

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

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

Spark 平行計算框架

spark是乙個通用的平行計算框架,是一種快速處理大規模資料的通用引擎,由ucberkeley的amp實驗室開發。其架構如下圖所示 spark的中間資料放到記憶體中,對於迭代運算效率比較高 spark比hadoop更通用 效能與速度 容錯性 可用性 spark可以直接對hdfs進行資料的讀寫,同樣支...

CUDA 4 初探平行計算

本文將計算兩個向量 陣列 的和。分別在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,...