gpt4 book ai didi

Cuda 2D内存分配和复制问题

转载 作者:行者123 更新时间:2023-11-30 18:07:16 25 4
gpt4 key购买 nike

   int **F;
int **dev_pF;
size_t *pitchF;
void init_cuda_mem(int mF,int mT,int nF,int nT){

cudaMallocPitch((void **)dev_pF,pitchF,(nF + 2*nT -2)*sizeof(int),mF + 2*mT -2);
cudaMemcpy2D((void *)dev_pF,*pitchF,(void *)pF,*pitchF,(nF + 2*nT -2)*sizeof(int),mF + 2*mT -2,cudaMemcpyHostToDevice);
}

大家好

在上面的代码片段中,我尝试使用 cudaMallocPitch 分配一个 2D 数组

然后使用 cudaMemcpy2D 将该数组从主机复制到设备

不幸的是它崩溃了,我认为错误是(我认为)在cudaMemcpy2D

有人可以帮我找到它吗

最佳答案

我认为问题在于您对指针和指向指针的指针的理解是错误的。

你可能应该做一些类似的事情:

int *dev_pF;
size_t pitchF;

void init_cuda_mem(int mF,int mT,int nF,int nT) {
cudaMallocPitch((void **)&dev_pF, &pitchF,(nF + 2*nT -2)*sizeof(int),mF + 2*mT -2);
cudaMemcpy2D((void *)dev_pF,pitchF,(void *)pF, pitchF,(nF + 2*nT -2)*sizeof(int),mF + 2*mT -2,cudaMemcpyHostToDevice);
}

请注意,您现在在 cudaMallocPitch 调用中获取变量的地址,然后在第二次调用中直接使用它们,这是不同的。

在您的原始代码中,您首先要求 cudaMalloc 将指针存储在 dec_pF 恰好指向的任何内存中,并将大小存储在itchF 指向的任何内存中。这两者都是统一的,所以那里可能会发生灾难。在第二次调用中,您将 dev_pF 从指针转换为指向常规指针的指针,因此您告诉 memcpy 从存储指针的位置开始复制内存,而不是从存储分配的内存的位置开始。由于指向指针的指针和大小最初都是统一的,所以几乎任何事情都可能发生。

此外,您正在使用我在原始代码中看不到的 pF 指针,请确保它已正确初始化。

关于Cuda 2D内存分配和复制问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4757656/

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