2016-03-25 42 views
1

我在CUDA中使用了全局2d數組變量,並試圖對此全局變量使用累加。但是當我重新運行代碼時,它從最後一次運行的值開始。例如,如果值是50,在過去運行下一次運行會顯示100它並不值重置爲0。如何重置CUDA全局變量

__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

這聽起來像你想要的是初始化你分配內存(請注意,這與「重置變量」無關)。爲此,請使用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,像cudaMemsetsets bytes從所提供的int值的LSB。