CUDA之矩陣乘法——複數
做好矩陣乘法和轉置之後本來開心得不行的!
準備上手做個最基本的波束形成了!
突然發現希爾伯特變換完以後需要進行各種複數的運算…所以臨時補寫了一個複數乘法…
學著學著好像有點感覺了~!還是蠻有意思的。當然前提是能除錯成功。
用一句傅小姐的名言鼓勵一下“只要心甘情願任何事情都會變得簡單!”。
程式碼
__device__ float GetReal(const Matrix A, int row, int col) {
return A.real[row * A.stride + col];
}
__device__ float GetImag(const Matrix A, int row, int col) {
return A.imag [row * A.stride + col];
}
__device__ void SetElement(Matrix A, int row, int col, float valueR, float valueI) {
A.real[row * A.stride + col] = valueR;
A.imag[row * A.stride + col] = valueI;
}
__device__ Matrix GetSubMatrix(Matrix A, int row, int col) {
Matrix Asub;
Asub.width = BLOCK_SIZE;
Asub.height = BLOCK_SIZE;
Asub.stride = A.stride;
Asub.real = &A.real[A.stride * BLOCK_SIZE * row+ BLOCK_SIZE * col];
Asub.imag = &A.imag[A.stride * BLOCK_SIZE * row+ BLOCK_SIZE * col];
return Asub;
}
__global__ void CMatMulKernel(Matrix A, Matrix B, Matrix C) {
int blockRow = blockIdx.y ;
int blockCol = blockIdx.x;
Matrix Csub = GetSubMatrix(C, blockRow, blockCol);
float CvalueR = 0;
float CvalueI = 0;
int row = threadIdx.y;
int col = threadIdx.x;
for (int m = 0; m < (A.width / BLOCK_SIZE); ++m) {
Matrix Asub = GetSubMatrix(A, blockRow, m);
Matrix Bsub = GetSubMatrix(B, m, blockCol);
__shared__ float AsR[BLOCK_SIZE][BLOCK_SIZE];
__shared__ float AsI[BLOCK_SIZE][BLOCK_SIZE];
__shared__ float BsR[BLOCK_SIZE][BLOCK_SIZE];
__shared__ float BsI[BLOCK_SIZE][BLOCK_SIZE];
AsR[row][col] = GetReal(Asub, row, col);
AsI[row][col] = GetImag(Asub, row, col);
BsR[row][col] = GetReal(Bsub, row, col);
BsI[row][col] = GetImag(Bsub, row, col);
__syncthreads();
for (int e = 0; e < BLOCK_SIZE; ++e)
{
CvalueR += AsR[row][e] * BsR[e][col]-AsI[row][e]*BsI[e][col];
CvalueI += AsR[row][e] * BsI[e][col]+AsI[row][e]*BsR[e][col];
}
__syncthreads();
}
SetElement(Csub, row, col, CvalueR,CvalueI);
}
void CMatMul(const Matrix A, const Matrix B, Matrix C) {
Matrix d_A;
d_A.width = d_A.stride = A.width;
d_A.height = A.height;
size_t size = A.width * A.height * sizeof(float);
cudaMalloc((void**)&d_A.real, size);
cudaMalloc((void**)&d_A.imag, size);
cudaMemcpy(d_A.real, A.real, size,
cudaMemcpyHostToDevice);
cudaMemcpy(d_A.imag, A.imag, size,
cudaMemcpyHostToDevice);
Matrix d_B;
d_B.width = d_B.stride = B.width;
d_B.height = B.height;
size = B.width * B.height * sizeof(float);
cudaMalloc((void**)&d_B.real, size);
cudaMalloc((void**)&d_B.imag, size);
cudaMemcpy(d_B.real, B.real, size,
cudaMemcpyHostToDevice);
cudaMemcpy(d_B.imag, B.imag, size,
cudaMemcpyHostToDevice);
Matrix d_C;
d_C.width = d_C.stride = C.width;
d_C.height = C.height;
size = C.width * C.height * sizeof(float);
cudaMalloc((void**)&d_C.real, size);
cudaMalloc((void**)&d_C.imag, size);
dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE);
dim3 dimGrid(B.width / dimBlock.x, A.height / dimBlock.y);
CMatMulKernel<<<dimGrid, dimBlock>>>(d_A, d_B, d_C);
cudaMemcpy(C.real, d_C.real, size,
cudaMemcpyDeviceToHost);
cudaMemcpy(C.imag, d_C.imag, size,
cudaMemcpyDeviceToHost);
cudaFree(d_A.real);
cudaFree(d_A.imag);
cudaFree(d_B.real);
cudaFree(d_B.imag);
cudaFree(d_C.real);
cudaFree(d_C.imag);
}
為什麼這麼久過去了我依然不能上傳圖片。
相關推薦
CUDA之矩陣乘法——複數
做好矩陣乘法和轉置之後本來開心得不行的! 準備上手做個最基本的波束形成了! 突然發現希爾伯特變換完以後需要進行各種複數的運算…所以臨時補寫了一個複數乘法… 學著學著好像有點感覺了~!還是蠻有意思的。當然前提是能除錯成功。 用一句傅小姐的名言鼓勵一下“只要
CUDA之矩陣乘法
我們已經知道了threads/blocks在CUDA端的組織方式,接下來我們學學多維度空間下的多執行緒模型,下面以矩陣乘法為例。 1. 行優先 儲存方式 二維矩陣在記憶體中的儲存方式受到程式語言的影響,主要可以分為兩種:行優先和列優先。對於程式語言諸如C/C++/CUD
CUDA之矩陣乘法——非方陣計算
說明 A矩陣為M * N,B矩陣為N * M 程式碼 #include "device_functions.h" #include "cuda_runtime.h" #include "device_launch_parameters.h" #incl
CUDA之矩陣乘法——globalmemory
CUDA 矩陣乘法 使用global memory 報錯 錯誤 17 error : no instance of overloaded function “cudaMalloc”
線性代數之——矩陣乘法和逆矩陣
1. 矩陣乘法 如果矩陣 \(B\) 的列為 \(b_1, b_2, b_3\),那麼 \(EB\) 的列就是 \(Eb_1, Eb_2, Eb_3\)。 \[\boldsymbol{EB = E[b_1 \quad b_2 \quad b_3] = [Eb_1 \quad Eb_2 \quad Eb_3
CUDA學習--矩陣乘法的並行運算
1. CUDA學習步驟 CPU實現 a*b = c 的矩陣乘法(矩陣尺寸是n*m的,n和m大於1000) 將cpu程式碼移植到cuda。將CPU值傳入GPU,使用cuda計算,與cpu結果對比。 優化思路1:將矩陣分塊進行計算 優化思路2:使用share
Python資料科學之矩陣乘法
背景 Python資料分析離不開矩陣的基礎知識,週末看了一章節的數學基礎知識,重新學習了一下矩陣的乘法知識,線性代數的知識還是十年前上大學時學的,早就忘乾淨了,今日重新整理了一下,其實就是基本的規則記憶,還是能夠理解的。 矩陣乘法定義 百度得到的定義為
java 多執行緒平行計算之矩陣乘法(星星筆記)
用java編寫兩個n階的方陣A和B的相乘程式,結果存放在方陣C中,其中使用Runnable介面實現矩陣的乘法。 方陣A和B的初始值如下:(同時開兩個執行緒) 輸出:c中所有元素之和、程式的執行時間 具體的程式如下: package com.xing.matrix; /
OpenCL之矩陣乘法實現
kernel 在opencl中,一般最優價值的就是kernel,前面寫的配置檔案基本沒有很大的差別,主要是kernel寫法上。其中矩陣運算又是最能體現opencl價值的地方。先上寫的kernel: __kernel void matrix_mult
cuda編程-矩陣乘法(1)
return mac cpu ims iostream oba 簡單的 oid memory 本方法采用簡單的單線程計算每組行和列乘加運算 代碼如下: #include <stdio.h> #include <stdlib.h> #include
機器學習之數學系列(一)矩陣與矩陣乘法
1.對於矩陣的認識應當把它看成是多個向量的排列表或把矩陣看成行向量,該行向量中的每個元素都是一個列向量,即矩陣是複合行向量。如下圖所示。 2.對於下面這個矩陣的乘法有兩種看法: (1)矩陣將向量[b1,b2,b3].T進行了運動變換,這種變換可以是同空間內變換,也可以是不同空間間的變換;
動態規劃之矩陣鏈乘法
對於給定的n個矩陣形成的矩陣鏈M1,M2,M3,......Mn,求計算乘積M1M2M3.....Mn時進行最少次標量相乘的運算順序,這類問題就稱為矩陣鏈乘法問題。 例: 當給定矩陣Mi的維數後,求出計算n個矩陣的乘積M1M2M3....Mn時所需標量相乘運
AI學習之路(19)TensorFlow裡的矩陣乘法
如果對矩陣的知識有點遺忘,有點陌生,有點想不起來,請先看看這個網頁:基礎知識已經補過了,就直接來使用TF的矩陣乘法了。tf.matmul(a, b, transpose_a=False, transpose_b=False, adjoint_a=False, adjoint_b
CUDA程式設計--實現並行矩陣乘法【80行程式碼】
簡述 這裡只寫了方陣之間的乘法,但是本質上都是一樣的。 我測試過100規模的方陣之間的乘法,沒有問題。 程式碼 讀取檔案data.txt 資料格式就是一個數值N,然後來連續的兩個N*N的矩陣。用空格隔開。 #include "cuda
CUDA程式效能分析-矩陣乘法
前言 矩陣乘法非常適合在GPU上並行執行,但是使用GPU並行後能獲得多大的效能提升?本文將通過一些實驗分析CUDA程式的效能。 測試環境 本文使用Dell XPS 8700作為測試機,相關配置如下: . 型號 D
第十五章動態規劃之“矩陣鏈乘法”
裝配線排程與矩陣鏈乘法是很典型的動態規劃的兩個例子。關於這倆例子對於理解動態規劃的作用稍後補上。這個程式的時間複雜度為Ω(n^3),這個可以通過替換法證明。 輸出最優加括號的程式碼對於理解遞迴很有幫助,蹭蹭蹭,先往回跑,路上什麼也不幹,跑到頭再跑回來,把該乾的都幹了,先自頂
演算法導論之矩陣鏈乘法詳解
內容都是是演算法導論上的,僅作為一個閱讀筆記,記錄一下自己閱讀過程中碰到的一些問題。希望能對需要的同學有所幫助! 矩陣鏈乘法是指給定一個n個矩陣的序列(矩陣鏈)< A1, A2, …, An>,我們希望計算它們的乘積 A1A2A3…An
C語言之兩矩陣乘法的實現
首先我們要清楚矩陣乘法實現需要滿足的條件, 矩陣相乘最重要的方法是一般矩陣乘積。它只有在第一個矩陣的列數(column)和第二個矩陣的行數(row)相同時才有意義[1] 。一般單指矩陣乘積時,指的便是一般矩陣乘積。一個m×n的矩陣就是m×n個數排成m行n列的一
CUDA: 矩陣乘法優化
矩陣乘法是有實用價值的程式,我們會使用浮點數。雖然矩陣乘法有點老套,不過因為它相當簡單,而且也可以用來介紹一些有關 CUDA 的有趣性質。 矩陣乘法 為了單純起見,我們這裡以方形的矩陣為例子。基本上,假設有兩個矩陣 A 和 B,則計算 AB = C 的方法如下:for(i
機器學習之線性代數基礎一 矩陣乘法、秩、特徵值、特徵向量的幾何意義
寫篇文章把自己對矩陣的理解記錄一下,有不對的地方歡迎指正。為簡單、直觀、視覺化起見,我們只以簡單的二維和三維空間為例。高維空間也是同樣的道理,只是不能視覺化,只能通過數學公式來證明。 1. 矩陣乘法 矩陣乘法來源於線性方程組的求解,為了方便起見,