2016-12-07 41 views
-2

因此,我正在進行一項分配工作,涉及使用CUDA在C中進行編碼。我寫了一個函數和一個工作的內核(產生正確的結果)。不過,我期待着提高速度。循環內的CUDA副本和內核調用

這是內核:

__global__ void update_c(const double *d_u, double *d_u_new, const int nx, const double k) 
{ 
    int i = blockDim.x * blockIdx.x + threadIdx.x; 

    if (i < nx-1 && i > 0) 
    { 
     d_u_new[i] = d_u[i] + k*(d_u[i+1] + d_u[i-1] -2*d_u[i]); 
    } 
} 

,這是功能:

void update() { 

    cudaMemcpy(d_u, u, size, cudaMemcpyHostToDevice); 
    cudaMemcpy(d_u_new, u_new, size, cudaMemcpyHostToDevice); 
    update_c<<<blocksPerGrid, threadsPerBlock>>>(d_u, d_u_new, nx, k); 
    cudaMemcpy(u, d_u, size, cudaMemcpyDeviceToHost); 
    cudaMemcpy(u_new, d_u_new, size, cudaMemcpyDeviceToHost); 

    double *tmp = u_new; u_new = u; u = tmp; 
} 

我明白,一旦複製d_u和d_u_new將留在設備上,所以我並不需要複製它們每一次。我的問題是,如何重寫這個變量來反覆使用變量,並且只在程序的開始和結束處複製內存?我是CUDA的新成員,在分配之前只有一個非常簡短的速成課程。

+0

我們需要看看調用'update()'的代碼才能真正知道。你能添加更多的上下文嗎? –

回答

0

我能夠通過創建來解決它下面:

__global__ void update_c(const double *d_u, double *d_u_new, const int nx, const double k) 
{ 
    int i = blockDim.x * blockIdx.x + threadIdx.x; 

    if (i < nx-1 && i > 0) 
    { 
     d_u_new[i] = d_u[i] + k*(d_u[i+1] + d_u[i-1] -2*d_u[i]); 
    } 
} 

void copyToDev(){ 
    cudaMemcpy(d_u, u, size, cudaMemcpyHostToDevice); 
    cudaMemcpy(d_u_new, u_new, size, cudaMemcpyHostToDevice); 
} 

void copyToHost(){ 
    cudaMemcpy(u, d_u, size, cudaMemcpyDeviceToHost); 
    cudaMemcpy(u_new, d_u_new, size, cudaMemcpyDeviceToHost); 
} 

/* updates u for next time step. */ 
void update() { 

    update_c<<<blocksPerGrid, threadsPerBlock>>>(d_u, d_u_new, nx, k); 
    double *tmp = d_u_new; d_u_new = d_u; d_u = tmp; 
} 

我,經過調用更新和copyToHost循環之前調用copyToDev()。