0

こんにちは、私は2つの配列をグローバルメモリから共有メモリにコピーしようとしています。グローバル配列の型はdoubleで、全員に32個の要素があります。グリッドは1Dで、ブロックは1Dです。グリッドの寸法は10000で、NumberThreadPerBlockは32です。

__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

手伝って頂けますか?

4

1 に答える 1

1

私が見ることができることから、デバイス ポインター (px、py) に割り当てられたメモリは 32​​sizeof(double) ですが、ブロックの数は 10000 です。デバイス メモリはグローバルであり、すべてのブロックがそれを共有し、共有メモリのみが共有されます。ブロックごとに定義されています。したがって、blockId.x = 1 の場合、無効なメモリ アクセスが発生するはずです。また、カーネルコールでは、d_px、d_py にする必要があります。

于 2013-01-12T02:24:04.853 に答える