0

デバイスからホストに約 8650752 バイトをコピーしようとしていますが、スタック オーバーフロー エラーが発生します。驚くべきことに、同じデータをホストからデバイスにコピーできますが、計算後、元に戻すことができません。コードは非常に単純なので、何が悪いのかわかりません

コード:

__global__ 
void kernel(....)
{
    int x=threadIDX.x;

    for (int j=0; j<256; j++)
    {
        for (int i=0; i<256; i++)
        { 
            int index = 256*256*x + 256*j + i;      
            dVOL_in[(x*65536)+(256*j)+i]=index;
        }
    }

}

int main(void)
{
    const int VOL_SIZE = 8650752;                           
    const int VOL_BYTES = VOL_SIZE * sizeof(float);
    float hVOL[VOL_SIZE];
    float * dVOL_in;

    gpuErrchk(cudaMalloc((void**) &dVOL_in, VOL_BYTES));

    // volume data read from some file
    gpuErrchk(cudaMemset(dVOL_in,0,VOL_BYTES));  
    gpuErrchk(cudaMemcpy(dVOL_in,Vol,VOL_BYTES, cudaMemcpyHostToDevice));  //works fine

    kernel<<<1,132>>>(....);
    cudaMemcpy(hVOL, dVOL_in, VOL_BYTES, cudaMemcpyDeviceToHost);  //stack overflow error
}
4

1 に答える 1

4

関数本体でローカル変数として定義されている場合:

int main(void)
{
   const int VOL_SIZE = 8650752;
   float hVOL[VOL_SIZE];

コンパイラはオブジェクトhVolをスタックに割り当てます。しかし、このオブジェクトは最大スタック サイズに収まらないため、このエラーが発生します。このような大きなオブジェクトの場合、メモリを動的に割り当てる必要があります。

   float *hVOL = malloc(sizeof(float) * VOL_SIZE);
于 2013-04-21T04:53:07.167 に答える