出於對平行計算的興趣,我嘗試了cpu、gpu cuda、gpu cuda cublas這三種方式進行矩陣乘法的計算。
一、cpu
#include
#include
#include
//#pragma gcc optimize(3)
#define r_size 256*8
intmain()
start=
clock()
;for
(i=0
;i)for
(j=0
;j)for
(k=0
;k) c[i*r_size+j]
+=a[i*r_size+k]
*b[k*r_size+j]
; end=
clock()
;printf
("time is %f s\n",(
(double
)end-start)
/clocks_per_sec)
;return0;
}
二、gpu cuda cublas
#include
"cuda_runtime.h"
#include
"cublas_v2.h"
#include
#include
#include
#include
#include
using namespace std;
intmain()
for(
int i =
0; i < n*k; i++
)float
*d_a,
*d_b,
*d_c,
*d_ct;
start=
clock()
;cudamalloc((
void**
)&d_a,
sizeof
(float
)*m*n)
;cudamalloc((
void**
)&d_b,
sizeof
(float
)*n*k)
;cudamalloc((
void**
)&d_c,
sizeof
(float
)*m*k)
;cudamemcpy
(d_a, h_a, m*n *
sizeof
(float
), cudamemcpyhosttodevice)
;cudamemcpy
(d_b, h_b, n*k *
sizeof
(float
), cudamemcpyhosttodevice)
;float alpha =1;
float beta =0;
//c=a*b
cublashandle_t handle;
cublascreate
(&handle)
;cublassgemm
(handle,
cublas_op_n,
cublas_op_n,
k,//矩陣b的列數
m,//矩陣a的行數
n,//矩陣a的列數
&alpha,
d_b,
k,
d_a,
n,&beta,
d_c,
k);cudamemcpy
(h_c, d_c, m*k *
sizeof
(float
), cudamemcpydevicetohost)
; end=
clock()
;cudafree
(d_a)
;cudafree
(d_b)
;cudafree
(d_c)
;free
(h_a)
;free
(h_b)
;free
(h_c)
;printf
("time used is %f s\n",(
(double
)end-start)
/clocks_per_sec)
;return0;
}
三、gpu cuda
#include
#include
#include
#include
#define block_num 32
//塊數量
#define thread_num 256
// 每個塊中的執行緒數
#define r_size block_num * thread_num
#define m_size r_size * r_size
__global__ void
mat_mul
(int
*mat1,
int*mat2,
int*result)}}
intmain
(int argc,
char
*ar**)
cudamalloc((
void**
)&g_mat1,
sizeof
(int
)* m_size)
;cudamalloc((
void**
)&g_mat2,
sizeof
(int
)* m_size)
;cudamalloc((
void**
)&g_mat_result,
sizeof
(int
)* m_size)
;
start=
clock()
;cudamemcpy
(g_mat1, mat1,
sizeof
(int
)* m_size, cudamemcpyhosttodevice)
;cudamemcpy
(g_mat2, mat2,
sizeof
(int
)* m_size, cudamemcpyhosttodevice)
; mat_mul<<
>
>
(g_mat1, g_mat2, g_mat_result)
;cudamemcpy
(result, g_mat_result,
sizeof
(int
)* m_size, cudamemcpydevicetohost)
; end=
clock()
;printf
("time=%f\n",(
(double
)end-start)
/clocks_per_sec)
;return0;
}
執行時間比較
從上到下依次為cuda cublas、cuda、cpu的執行時間,而且前兩種情況是(32x256)x(32x256)大小的兩個矩陣相乘,而第三種是(256x8)x(256x8)大小的兩個矩陣相乘,可以看出,執行速度cublas>cuda>>cpu.
php程式執行時間 php計算程式的執行時間
首先我們分析一下原理,要想得到程式執行時間,那麼可以在程式最開始執行的時候定義乙個變數記下當前時間,然後等我們程式執行完之後再記錄一下當前的時間,兩者相差就是該程式執行花費的時間了。這裡介紹一下 microtime 這個函式,microtime 用的不多,但是不能不知道這個函式,它是返回當前 uni...
Oracle JOB常見的執行時間
oracle job常見的執行時間 1 每分鐘執行 trunc sysdate,mi 1 24 60 2 每天定時執行 例如 每天凌晨0點執行 trunc sysdate 1 每天凌晨1點執行 trunc sysdate 1 1 24 每天早上8點30分執行 trunc sysdate 1 8 60...
SQLSERVER語句的執行時間
在sql語句調優的時候,大部分都會檢視語句執行時間,究竟sqlserver顯示出來的統計結果是什麼意思?下面看一下例子 比較簡單的語句 1 setstatistics time on 2use pratice 3 go4select from dbo orders 結果 1 2 cpu 時間 0 毫...