循环内的CUDA拷贝和内核调用

时间:2016-12-07 21:43:46

标签: c cuda

所以我正在进行一项涉及使用CUDA在C中编码的任务。我编写了一个函数和一个有效的内核(产生正确的结果)。但是,我希望提高速度。

这是内核:

__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的新手,在分配之前只有一个非常简短的速成课程。

1 个答案:

答案 0 :(得分:1)

我能够通过创建以下内容来修复它:

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

我在调用update和copyToHost的循环之前调用copyToDev()。