国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++使用cuBLAS加速矩陣乘法運算的實現代碼

C++使用cuBLAS加速矩陣乘法運算的實現代碼

2021-12-30 15:31白水baishui C/C++

這篇文章主要介紹了C++使用cuBLAS加速矩陣乘法運算,將cuBLAS庫的乘法運算進行了封裝,方便了算法調用,具體實現代碼跟隨小編一起看看吧

本博客主要參考cuBLAS 庫 詞條實現,與原文不同的是,本博客:

  1. 將cuBLAS庫的乘法運算進行了封裝,方便了算法調用;
  2. 將原文的結果轉置實現為了不轉置,這樣可以直接使用計算結果;
  3. 測試并更改了乘法參數,解決了原文中更改矩陣大小時報錯的問題。

總的來說,本博客的代碼利用cuBLAS庫實現了兩個矩陣相乘,提高了矩陣乘法的計算速度。

test.cpp

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#include "cuda_runtime.h"
#include "cublas_v2.h"
#include <time.h>
#include <iostream>
 
using namespace std;
 
 
// cuBLAS實現矩陣乘法
int **matMult_cuBLAS(int **A, int **B, int rowSizeA, int colSizeA, int colSizeB, cublasHandle_t cuHandle){
    // 結果矩陣
    int** C = new int*[rowSizeA];
    for(int i = 0; i < rowSizeA; i++){
        C[i] = new int[colSizeB];
    }
    for (int i = 0; i < rowSizeA; i++){
        for (int j = 0; j < colSizeB; j++){
            C[i][j] = 0;
        }
    }
 
    // 在內存中為將要計算的矩陣開辟空間
    float *h_A = (float*)malloc (rowSizeA * colSizeA * sizeof(float));
    float *h_B = (float*)malloc (colSizeA * colSizeB * sizeof(float));
    float *h_C = (float*)malloc (rowSizeA * colSizeB * sizeof(float));
 
    // 初始化計算矩陣h_A和h_B
    for (int i = 0; i < rowSizeA; i++) {
        for (int j = 0; j < colSizeA; j++) {
            h_A[i * colSizeA + j] = (float)A[i][j];
        }
    }
    for (int i = 0; i < colSizeA; i++) {
        for (int j = 0; j < colSizeB; j++) {
            h_B[i * colSizeB + j] = (float)B[i][j];
        }
    }
 
    // 在顯存中為將要計算矩陣與結果矩陣開辟空間
    float *d_A, *d_B, *d_C;
    cudaMalloc (
        (void**)&d_A,    // 指向開辟的空間的指針
        rowSizeA * colSizeA * sizeof(float)    // 需要開辟空間的字節數
    );
    cudaMalloc (
        (void**)&d_B,   
        colSizeA * colSizeB * sizeof(float)   
    );
    cudaMalloc (
        (void**)&d_C,
        rowSizeA * colSizeB * sizeof(float)   
    );
 
    // 將矩陣數據傳遞進顯存中已經開辟好了的空間
    cublasSetVector (
        rowSizeA * colSizeA,    // 要存入顯存的元素個數
        sizeof(float),    // 每個元素大小
        h_A,    // 主機端起始地址
        1,    // 連續元素之間的存儲間隔
        d_A,    // GPU 端起始地址
        1    // 連續元素之間的存儲間隔
    );
    cublasSetVector (colSizeA * colSizeB, sizeof(float), h_B, 1, d_B, 1);
 
    // 傳遞進矩陣相乘函數中的參數,具體含義請參考函數手冊.
    float a=1; float b=0;
    // 矩陣相乘.該函數必然將數組解析成列優先數組
    cublasSgemm (
        cuHandle,    // blas 庫對象
        CUBLAS_OP_T,    // 矩陣 A 屬性參數
        CUBLAS_OP_T,    // 矩陣 B 屬性參數
        rowSizeA,    // A, C 的行數
        colSizeB,    // B, C 的列數
        colSizeA,    // A 的列數和 B 的行數
        &a,    // 運算式的 \alpha 值
        d_A,    // A 在顯存中的地址
        colSizeA,    // lda
        d_B,    // B 在顯存中的地址
        colSizeB,    // ldb
        &b,    // 運算式的 \beta 值
        d_C,    // C 在顯存中的地址(結果矩陣)
        rowSizeA    // ldc
    );
    
    // 從 顯存 中取出運算結果至 內存中去
    cublasGetVector (
        rowSizeA * colSizeB,    //  要取出元素的個數
        sizeof(float),    // 每個元素大小
        d_C,    // GPU 端起始地址
        1,    // 連續元素之間的存儲間隔
        h_C,    // 主機端起始地址
        1    // 連續元素之間的存儲間隔
    );
 
    for (int i = 0; i < rowSizeA; i++) {
        for (int j = 0; j < colSizeB; j++) {
            C[i][j] = (int)h_C[j * rowSizeA + i];
        }
    }
    
    // 清理掉使用過的內存
    free (h_A); free (h_B); free (h_C); cudaFree (d_A);
    cudaFree (d_B); cudaFree (d_C);
 
    return C;
}
 
// 構造一個隨機二維數組(矩陣)
int** uniformMat(int rowSize, int colSize, int minValue, int maxValue) {
    int** mat = new int* [rowSize];
    for (int i = 0; i < rowSize; i++)
        mat[i] = new int[colSize];
 
 
    // srand(1024);
    srand((unsigned)time(NULL));  //隨機數種子采用系統時鐘
    for (int i = 0; i < rowSize; i++) {
        for (int j = 0; j < colSize; j++) {
            mat[i][j] = (int)(rand() % (maxValue - minValue + 1)) + minValue;
        }
    }
 
    return mat;
}
 
int main(void)
{  
    // 創建并初始化 CUBLAS 庫對象
    // 若是CUBLAS對象在主函數中初始化,cuBLAS方法在其他函數中調用,需要將cuHandle傳入該函數,并在該函數內創建status對象
    cublasHandle_t cuHandle;
    cublasStatus_t status = cublasCreate(&cuHandle);
    if (status != CUBLAS_STATUS_SUCCESS)
    {
        if (status == CUBLAS_STATUS_NOT_INITIALIZED) {
            cout << "CUBLAS 對象實例化出錯" << endl;
        }
        getchar ();
        return EXIT_FAILURE;
    }
 
    // 矩陣大小定義
    int rowSizeA = 3; // 矩陣A的行數
    int colSizeA = 4; // 矩陣A的列數和矩陣B的行數
    int colSizeB = 2; // 矩陣B的列數
 
    // 構造一個3行4列的矩陣A,矩陣元素在(0,4)內隨機選取
    int **A = uniformMat(rowSizeA, colSizeA, 0, 4);
    // 構造一個4行2列的矩陣B,矩陣元素在(5,9)內隨機選取
    int **B = uniformMat(colSizeA, colSizeB, 5, 9);
 
    // 輸出矩陣A和B
    cout << "矩陣 A :" << endl;
    for (int i = 0; i < rowSizeA; i++) {
        for (int j = 0; j < colSizeA; j++) {
            cout << A[i][j] << " ";
        }
        cout << endl;
    }
    cout << endl;
 
    cout << "矩陣 B :" << endl;
    for (int i = 0; i < colSizeA; i++) {
        for (int j = 0; j < colSizeB; j++) {
            cout << B[i][j] << " ";
        }
        cout << endl;
    }
    cout << endl;
 
    // 使用cuBLAS進行矩陣乘法運算:C = A * B
    int **C = matMult_cuBLAS(A, B, rowSizeA, colSizeA, colSizeB, cuHandle);
 
    // 輸出矩陣C,即運算結果
    cout << "矩陣 C :" << endl;
    for (int i = 0; i < rowSizeA; i++) {
        for (int j = 0; j < colSizeB; j++) {
            cout << C[i][j] << " ";
        }
        cout << endl;
    }
    cout << endl;
 
    // 釋放 CUBLAS 庫對象
    cublasDestroy (cuHandle);
    return 0;
}

在終端輸入:

nvcc -lcublas test.cpp -o t
./t

運算結果:

矩陣 A :
1 3 2 0
2 1 2 1
4 3 2 4

矩陣 B :
6 8
7 5
7 6
7 6

矩陣 C :
41 35
40 39
87 83

到此這篇關于C++使用cuBLAS加速矩陣乘法運算的文章就介紹到這了,更多相關C++ cuBLAS矩陣加速運算內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/baishuiniyaonulia/article/details/120119380

延伸 · 閱讀

精彩推薦
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 成人精品视频 | 久久精品国产一区二区三区 | 欧美一级欧美三级在线观看 | 久久精品中文 | 久久精品成人 | 粉嫩一区二区三区 | 成人小视频在线看 | 国产毛片av | 欧美日韩激情一区二区三区 | 精品在线不卡 | 日本成人| 欧美不卡在线 | 成人精品国产免费网站 | 国产精品久久国产精品 | 国产精品视频成人 | 欧美黑人一级爽快片淫片高清 | 国产高清一区二区 | 日韩小视频在线观看 | 亚洲视频在线免费观看 | 日韩精品一区在线视频 | 午夜精品在线观看 | 日本精品一区二区三区在线观看视频 | 久久九 | 国产高清在线观看 | av在线日韩 | 欧美不卡视频 | 成人一区二区在线 | 欧美日韩免费一区二区三区 | 亚洲视频 欧美视频 | 日韩激情 | 日韩欧美精品一区二区三区 | 日韩视频一区二区三区 | 国产精品成人3p一区二区三区 | 一级视频免费观看 | 日韩精品三区 | 欧美一区二区三区久久 | 精品国产仑片一区二区三区 | 中文字幕av亚洲精品一部二部 | 极品一区 | 99这里只有精品 | 91av国产视频 |