2016-03-25 7 views
1

CUDA'da global 2d dizi değişkenini kullandım ve bu global değişkene kümülatif eklemeyi kullanmaya çalıştım. Ama kodu yeniden çalıştırdığımda, son çalışmadaki değerde başladı. Örneğin, değer sonraki çalıştırma (eğer tahsis edilir hafızayı başlatmak için It istediğini gibi geliyor 0.CUDA global değişkenleri nasıl sıfırlanır

__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; 
} 

cevap

1

değer sıfırlanmaz 100. edilir gösterecek son dönemde 50 eğer oldu Not "bir değişken yeniden boyutlandırma" gibi bir şey değildir. Bunu yapmak için cudaMallocPitch tarafından döndürülen bellek ayırmasında baytları başlatmak için cudaMemset2D kullanın. Yani ev sahibi API dizisi şuna benzer:

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)); 

Not cudaMemset2D o LSB verilen int değerinin gelen cudaMemset, sets bytes gibi.