看板 C_and_CPP 關於我們 聯絡資訊
主要是你寫的 Matrix_Point_Multiplication_SM 有問題 你用for loop的功能是為了什麼? 能夠只執行一次的動作應該不需要重複執行好幾次吧 我把 Matrix_Point_Multiplication_SM 改成如下 呼叫的時候用 Matrix_Point_Multiplication_SM<<<blocks, threads, BLOCK_SIZE*BLOCK_SIZE*2*sizeof(float)>>>( d_input1, d_input2, d_output_s ); // ------------------- 用 share memory ------------------- // __global__ void Matrix_Point_Multiplication_SM( float *Ma, float *Nb, float *Pc ) { __shared__ float Msm[ BLOCK_SIZE ][ BLOCK_SIZE ]; __shared__ float Nsm[ BLOCK_SIZE ][ BLOCK_SIZE ]; int ty = threadIdx.y; int tx = threadIdx.x; int row = blockIdx.y * BLOCK_SIZE ; int col = blockIdx.x * BLOCK_SIZE ; if( (row+ty < NNy) && (col+tx < NNx) ) { // 矩陣搬移Share memory Msm[ ty ][ tx ] = Ma[ (row+ty)*NNx + (col+tx) ]; Nsm[ ty ][ tx ] = Nb[ (row+ty)*NNx + (col+tx) ]; // 矩陣運算Share memory Pc[ (row+ty)*NNx + (col+tx) ] = Msm[ ty ][ tx ] * Nsm[ ty ][ tx ]; } } -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.120.44.12
aada:我是從矩陣乘法改過來的, 少考慮了會重複的問題 03/18 03:02
aada:為什麼block_size*block_size之後要乘2呢 03/18 03:09
lgen7604:因為有Msm和Nsm啊 03/18 03:12
hardcover:和在excution configuration指定s.m.大小應該無關 03/18 03:14
lgen7604:我記得使用到s.m.但呼叫kernel時沒有加入size參數的話 03/18 03:18
lgen7604:可能會有無法預期的錯誤 03/18 03:19
hardcover:可以說一下是哪裡說的嗎? programming guide 有講指定 03/18 03:21
hardcover:第三個參數的時機吧? 好像是你沒定大小的時候? 03/18 03:22
lgen7604:學長之前做實驗碰到的Bug 我翻過programming guide是沒有 03/18 03:24
lgen7604:提到使用s.m.但是沒加參數會怎麼樣 03/18 03:25
hardcover:如果有指定大小,正常應該是不是加才對 03/18 03:30
lgen7604:找好久 終於找到了 Appendix.B.12 沒有寫的話預設的 03/18 03:35
lgen7604:shared memory size是0 03/18 03:35
hardcover:嗯,是dynamic allocate時用的,所以是runtime指定大小 03/18 03:38
hardcover:原來的code已經在compile time指定大小了,所有有兩份? 03/18 03:39
hardcover:好像也沒有,因為沒有宣告? (extern __shared__ xxx) 03/18 03:40