2016-12-07 12 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()を呼び出します。

関連する問題