問題:cuda子矩陣
我有4個矩陣(64x64)的單精度數字。需要做的計算,如:
R = A * sin(B) + C * cos(D)
想法:
加快計算使用共享內存。由於每個線程塊都有(在我的GPU的情況下)16KB共享內存,浮點大小爲4,因此可以在共享內存中存儲4000個浮點數。所以每個矩陣使用1000個元素,每個維度31個元素。
所以每個矩陣在768,16 16子矩陣(16×16)被devided。
dim3 dimBlock(16, 16, 1)
dim3 dimGrid(4, 4, 1)
內核:
int Tx = threadIdx.x;
int Ty = threadIdx.y;
int Bx = blockIdx.x;
int By = blockIdx.y;
int idx = Bx * blockDim.x + Tx;
int idy = By * blockDim.y + Ty;
__shared__ float s_A[16*16];
__shared__ float s_B[16*16];
__shared__ float s_C[16*16];
__shared__ float s_D[16*16];
// I am not sure how to write this part
s_A[(Tx * blockDim.x + Ty + By) + Bx] = A[idx * 64 + idy];
s_B[(Tx * blockDim.x + Ty + By) + Bx] = B[idx * 64 + idy];
s_C[(Tx * blockDim.x + Ty + By) + Bx] = C[idx * 64 + idy];
s_D[(Tx * blockDim.x + Ty + By) + Bx] = D[idx * 64 + idy];
R[idx * 64 + idy] = s_A[(Tx * blockDim.x + Ty + By) + Bx] * sin(s_B[(Tx * blockDim.x + Ty + By) + Bx]) + s_C[(Tx * blockDim.x + Ty + By) + Bx] * cos(s_D[(Tx * blockDim.x + Ty + By) + Bx]);
如何devide原矩陣submatrixs所以每塊都有自己的小矩陣4,計算它們。
當你寫'cos(D)'時,你是指D的矩陣餘弦還是D的所有元素的餘弦?這兩件事情非常不同。 – talonmies 2012-03-29 09:55:29
SRY, 餘弦所有元素的d- – user1281071 2012-03-29 10:10:43