gpt4 book ai didi

c++ - 将 cuda 内存处理包装在一个类中会导致损坏的内存地址

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:32 26 4
gpt4 key购买 nike

为了更轻松地处理主机和设备上的内存,我创建了以下类。理论上,它应该管理从主机到设备的复制,反之亦然。

struct CudaArray
{

int* memoryHost;
int* memoryDevice;

int size;

CudaArray(int datasize) // creates array on host and allocates memory on device with cudaMalloc
{
size = datasize;
memoryHost = new int[size];

for (int i = 0; i < size; i++)
{
memoryHost[i] = 0;
}

cudaMalloc((void**)&memoryDevice, sizeof(int) * size);
}

~CudaArray() // frees memory on device and host
{
delete[] memoryHost;
cudaFree(memoryDevice);
}

void Upload() // upload data from host to device
{
cudaMemcpy(memoryDevice, memoryHost, sizeof(int) * size, cudaMemcpyHostToDevice);
}
void Download() // download data from device to host
{
cudaMemcpy(memoryHost, memoryDevice, sizeof(int) * size, cudaMemcpyDeviceToHost);
}

void Insert(int* src); // copy from src to memoryHost
void Retrieve(int* dest); // copy from memoryHost to dest
};

在内部,一切都很好。但是当我使用我的 CudaArray 的对象时,指针有问题:

CudaArray cuda_ar(1000);
kernel <<<blocks, threads_per_block>>> (cuda_ar.memoryDevice, cuda_ar.size);

通过使用调试器,我设法读取了指针 memoryDe​​vice。在结构内部(例如,当单步执行 Upload() 时,它是 0x01000000。但是在执行内核的地方,memoryDe​​vice 指向 0x00000400(数字是示例)。

我知道 memoryDe​​vice 是一个指向设备内存的指针。有没有办法解释这种行为并为我的问题提供解决方案?

最佳答案

当我运行下面的程序时

#include <cstdio>
struct CudaArray
{

int* memoryHost;
int* memoryDevice;

int size;

CudaArray(int datasize) // creates array on host and allocates memory on device with cudaMalloc
{
size = datasize;
memoryHost = new int[size];

for (int i = 0; i < size; i++)
{
memoryHost[i] = 0;
}

cudaMalloc((void**)&memoryDevice, sizeof(int) * size);
}

~CudaArray() // frees memory on device and host
{
delete[] memoryHost;
cudaFree(memoryDevice);
}

void Upload() // upload data from host to device
{
cudaMemcpy(memoryDevice, memoryHost, sizeof(int) * size, cudaMemcpyHostToDevice);
}
void Download() // download data from device to host
{
cudaMemcpy(memoryHost, memoryDevice, sizeof(int) * size, cudaMemcpyDeviceToHost);
}

};

__global__ void kernel(int *ptr, int n)
{
printf("On Device : %p %d\n", ptr, n);
}

int main(void)
{
CudaArray cuda_ar(1000);
printf("On Host : %p %d\n", cuda_ar.memoryDevice, cuda_ar.size);
kernel<<<1, 1>>>(cuda_ar.memoryDevice, cuda_ar.size);
return 0;
}

我明白了

On Host   : 0x200400000 1000
On Device : 0x200400000 1000

您应该确保您的 CUDA 运行时调用(如 cudaMalloc、cudaMemcpy 和内核启动)都成功返回。您可以在所有 CUDA 运行时调用之后尝试此代码以验证:

if (cudaSuccess != cudaGetLastError())
printf( "Error!\n" );

关于c++ - 将 cuda 内存处理包装在一个类中会导致损坏的内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8928073/

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