2013-10-05 82 views
0

我寫使用共享存儲器這樣的CUDA代碼:誤差在CUDA共享存儲器靜態分配

__global__ void matrix_mul_shared(float *ad,float *bd,float *cd,int N) 
{ 
    float pvalue=0; 
    int TILE=blockDim.x; 
    int ty=threadIdx.y; 
    int tx=threadIdx.x; 

    //allocate shared memory per block 
    __shared__ float ads[1][1]; 
    __shared__ float bds[1][1]; 

. 

。 。 }

此代碼有效,但下列代碼失敗;

__global__ void matrix_mul_shared(float *ad,float *bd,float *cd,int N) 
{ 
    float pvalue=0; 
    int TILE=blockDim.x; 
    int ty=threadIdx.y; 
    int tx=threadIdx.x; 

    //allocate shared memory per block 
    __shared__ float ads[TILE][TILE]; 
    __shared__ float bds[TILE][TILE]; 

. 
. 
. 
} 

編譯器期望在我分配共享內存的行處有一些常量。它說(我忘了確切的錯誤,但它是這樣的):

的參數應該是一個常數

我能夠使用printf和打印TILE的價值,它是出來1.爲什麼這個錯誤?

回答

1

我認爲你收到的錯誤是

error: expression must have a constant value 

變量TILE不是由編譯器意味着意義上的常數。編譯器在編譯時詢問已知的共享內存數組的維數。

一個可能的解決方案:

#define TILE 16 

__global__ void matrix_mul_shared(float *ad,float *bd,float *cd,int N) 
{ 
    ... 

    __shared__ float ads[TILE][TILE]; 

    ... 
} 
+0

所以你的意思是在編譯時TILE不是一個常數,但仍blockDimx.x,這還沒有計算爲1? – user25108

+0

@ user25108是的,這裏的問題是'TILE'的值在編譯時是未知的。 – JackOLantern