矩陣乘法在不同平台上的執行時間

2021-10-09 03:47:20 字數 3838 閱讀 7922

出於對平行計算的興趣,我嘗試了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 毫...