cuda中用cublas庫做矩陣乘法

2021-09-08 20:32:48 字數 1804 閱讀 4223

這裡矩陣c=a*b,原始文件給的公式是c=alpha*a*b+beta*c,所以這裡alpha=1,beta=0。

主要使用cublassgemm這個函式,這個函式的第二個引數有三種型別,這裡cublas_op_n求出來矩陣結果是按行排列,所以不需要轉置了。

如果用cublas_op_t引數求得的結果是按列排列,做成c形式的矩陣應該還需要轉置一下,並且後面跟的引數也不太一樣,這個引數我就沒再嘗試了。

**如下:

#include "

cuda_runtime.h

"#include

"cublas_v2.h

"#include

#include

#include

#include

using

namespace

std;

intmain()

cout

<

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

cout

<

float *d_a, *d_b, *d_c,*d_ct;

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);

for (int i = 0; i < m*k; i++)

cudafree(d_a);

cudafree(d_b);

cudafree(d_c);

free

(h_a);

free

(h_b);

free

(h_c);

return0;

}

結果:

CUDA庫的cmake寫法

cmake minimum required version 3.8 fatal error project cmake and cuda languages cxx cuda add library particles static randomize.cpp randomize.h partic...

CUDA動態庫封裝以及呼叫

參考 通過將cuda相關計算操作放在庫中,方便在專案中呼叫,省去了每次編譯cu檔案的麻煩,也便於整合到其他平台上。一 封裝cuda動態庫 主要步驟 修改自定義方式 設定cu檔案項型別為cdua cc 新增依賴庫cudart.lib.1 建立乙個動態庫,這裡建的庫是x86的,也可以更改為x64.2 新...

CUDA動態庫封裝以及呼叫

cuda動態庫封裝以及呼叫 參考 通過將cuda相關計算操作放在庫中,方便在專案中呼叫,省去了每次編譯cu檔案的麻煩,也便於整合到其他平台上。一 封裝cuda動態庫 主要步驟 修改自定義方式 設定cu檔案項型別為cdua cc 新增依賴庫cudart.lib.1 建立乙個動態庫,這裡建的庫是x86的...