所以我正在进行一项涉及使用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的新手,在分配之前只有一个非常简短的速成课程。
答案 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()。