gpt4 book ai didi

循环内的 CUDA 复制和内核调用

转载 作者:行者123 更新时间:2023-11-30 20:21:59 25 4
gpt4 key购买 nike

所以我正在做一项作业,其中涉及使用 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 的新手,在分配此任务之前只接受了非常简短的速成类(class)。

最佳答案

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

__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 的循环之前调用 copyToDev() ,并在之后调用 copyToHost 。

关于循环内的 CUDA 复制和内核调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41027916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com