2013-01-11 131 views
0

hy,我試圖從全局內存複製2個數組到共享內存: 全局數組類型是雙倍的,每個人都有32個元素。 網格是1D,塊是1D。網格尺寸爲10000和NumberThreadPerBlock是32cuda從全局內存複製數組到共享內存

__global__ void kernel_0(double px[], double py[], int N) 
{ 
int ii, 

    jj,tid; 
    tid=blockIdx.x*blockDim.x + threadIdx.x; 
    __shared__ double s_px[256]; 
    __shared__ double s_py[256]; 
    __shared__ double s[256]; 

s_px[threadIdx.x]=px[tid]; 
s_py[threadIdx.x]=py[tid]; 
s[threadIdx.x]=py[tid]; 
__syncthreads(); 
} 


int main (int argc, char *argv[]){ 
    double *px, *py , *x, *y, PI, step, *d_x, *d_y,*d_px, *d_py,sharedMemSize; 
    int N, Nx, ii; 
    PI = 4*atan(1.0); 
    Nx = 10000; 
    N = 32; 

    px = (double *) malloc(N*sizeof(double)); 
    py = (double *) malloc(N*sizeof(double)); 

    // lookup table: sin // from 0 to PI 
    step = 1.0/(N-1); 
    for (ii = 0; ii < N; ii++){ 
     px[ii] = ii*step*PI; 
     py[ii] = sin(px[ii]); 
    } 

    cudaMalloc((void **) &d_px, N*sizeof(double)); 
    cudaMalloc((void **) &d_py, N*sizeof(double));   

    cudaMemcpy(d_px, px, N*sizeof(double), cudaMemcpyHostToDevice); 
    cudaMemcpy(d_py, py, N*sizeof(double), cudaMemcpyHostToDevice); 

    dim3 dimGrid(Nx); 
    dim3 dimBlock(N,1,1); 
    kernel_0<<< dimGrid, dimBlock>>>(px, py, N); 

} 

它編譯,但CUDA-memmcheck告訴我很多錯誤:

========= Invalid __global__ read of size 8 
=========  at 0x00000058 in kernel_0 
=========  by thread (31,0,0) in block (6,0,0) 
=========  Address 0x11e0db38 is out of bounds 
========= 
========= ERROR SUMMARY: 96 errors 

你能幫助我嗎?

+2

這個內核不會像這裏顯示的那樣運行。請發佈您正在使用的實際內核。 –

+0

請同時包含您對全局數組和內核調用的分配。如果你發佈一個完整的,簡單的,可編輯的例子來證明這個問題,那麼這可能是最好的選擇。 –

+0

我敢打賭'tid'正被用在'px'或'py'的其中一個讀取中,但是你必須顯示你的* actual *代碼來確認它。 – talonmies

回答

1

從我所看到的,分配給設備指針(px,py)的內存是32 * sizeof(double),但是您擁有的塊數是10000.設備內存是全局的,所有塊都共享它,只爲每個塊定義共享內存。因此,對於blockId.x = 1,您應該獲得無效的內存訪問權限。而且,在內核調用中,它應該是d_px,d_py。