2016-03-25 31 views
1

CUDAでグローバル2次元配列変数を使用しましたが、このグローバル変数に累積加算を使用しようとしました。しかし、コードを再実行すると、最後の実行からの値で開始しました。たとえば、値は次のランは、(あなたが配分されているメモリを初期化するために、それはあなたが望むように聞こえる0CUDAグローバル変数をリセットする方法

__device__ double *d_t; 
__device__ size_t d_gridPitch; 

__global__ void kernelFunc() 
{ 
    int i = blockIdx.x * blockDim.x + threadIdx.x 
    double* rowt = (double*)((char *)d_t + i * d_gridPitch); 
    rowt[0] = rowt[0] + 50000; 

    printf("%.0f, ",rowt[0]); 
} 


int main() 
{ 
    int size = 16; 
    size_t d_pitchLoc; 
    double *d_tLoc; 

    cudaMallocPitch((void**)&d_tLoc, &d_pitchLoc, size * sizeof(double), size); 
    cudaMemcpyToSymbol(d_gridPitch, &d_pitchLoc, sizeof(int)); 
    cudaMemcpyToSymbol(d_t, & d_tLoc, sizeof(d_tLoc)); 

    kernelFunc<<<1,size>>>(); 
    cudaDeviceReset(); 

    return 0; 
} 

答えて

1

に値をリセットしない100をされて表示されるでしょう、最後のランで50の場合でした「変数のリセット」のようなものではないことに注意してください)。そのためにはcudaMemset2Dを使用して、cudaMallocPitchによって返されたメモリ割り当て内のバイトを初期化します。だからあなたのホストAPIのシーケンスは次のようになります。

int size = 16; 
size_t d_pitchLoc; 
double *d_tLoc; 

cudaMallocPitch((void**)&d_tLoc, &d_pitchLoc, size * sizeof(double), size); 
cudaMemset2D(d_tLoc, d_pitchLoc, 0, size * sizeof(double), size); 

cudaMemcpyToSymbol(d_gridPitch, &d_pitchLoc, sizeof(int)); 
cudaMemcpyToSymbol(d_t, & d_tLoc, sizeof(d_tLoc)); 

注意、cudaMemset2DそのLSB供給int型の値のからcudaMemsetsets bytesのような。

関連する問題