2016-03-25 17 views
1

Ich verwendete globale 2d Array-Variable in CUDA, und ich versuchte, kumulative Addition zu dieser globalen Variable zu verwenden. Aber als ich den Code erneut startete, begann er mit dem Wert vom letzten Lauf. Zum Beispiel war 50, wenn der Wert in dem letzten Lauf der nächste Lauf 100 zeigen Sie nicht setzen Sie den Wert auf 0.Wie CUDA globale Variablen zurückgesetzt werden

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

Antwort

1

Es klingt wie das, was Sie wollen, ist der Speicher initialisieren Sie Zuweisen (Beachten Sie, dass das nichts mit dem "Zurücksetzen einer Variablen" zu tun hat. Verwenden Sie dazu cudaMemset2D, um die Bytes in der Speicherzuordnung, die von zurückgegeben werden, zu initialisieren. So Host-API-Sequenz sieht wie folgt aus:

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

Beachten Sie, dass cudaMemset2D, wie cudaMemset, sets bytes vom LSB des int-Wert geliefert.