gpt4 book ai didi

使用 CUDA 复制结构内的指针数组

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

我希望将指针数组从一个结构复制到另一个结构。结构如下所示:

typedef struct COORD3D
{
int x,y,z;
}
COORD3D;

typedef struct structName
{
double *volume;
COORD3D size;
// .. some other vars
}
structName;

我希望在一个函数中执行此操作,在该函数中传入结构体的空实例的地址以及包含我希望复制的数据的结构体的地址。目前我通过以下方式连续执行此操作:

void foo(structName *dest, structName *source)
{

// .. some other work

int size = source->size.x * source->size.y * source->size.z;
dest->volume = (double*)malloc(size*sizeof(double));

int i;
for(i=0;i<size;i++)
dest->volume[i] = source->volume[i];
}

我想在 CUDA 中执行此操作以加快进程(因为数组非常大 [~1200 万个元素]。

我尝试了以下方法,尽管代码编译并运行,但我得到存储在数组中的错误结果(似乎是非常大的随机数)

void foo(structName *dest, structName *source)
{
// .. some other work

int size = source->size.x * source->size.y * source->size.z;
dest->volume = (double*)malloc(size*sizeof(double));

// Device Pointers
double *DEVICE_SOURCE, *DEVICE_DEST;

// Declare memory on GPU
cudaMalloc(&DEVICE_DEST,size);
cudaMalloc(&DEVICE_SOURCE,size);

// Copy Source to GPU
cudaMemcpy(DEVICE_SOURCE,source->volume,size,
cudaMemcpyHostToDevice);

// Setup Blocks/Grids
dim3 dimGrid(ceil(source->size.x/10.0),
ceil(source->size.y/10.0),
ceil(source->size.z/10.0));
dim3 dimBlock(10,10,10);

// Run CUDA Kernel
copyVol<<<dimGrid,dimBlock>>> (DEVICE_SOURCE,
DEVICE_DEST,
source->size.x,
source->size.y,
source->size.z);

// Copy Constructed Array back to Host
cudaMemcpy(dest->volume,DEVICE_DEST,size,
cudaMemcpyDeviceToHost);

}

内核看起来像这样:

__global__ void copyVol(double *source, double *dest,
int x, int y, int z)
{
int posX = blockIdx.x * blockDim.x + threadIdx.x;
int posY = blockIdx.y * blockDim.y + threadIdx.y;
int posZ = blockIdx.z * blockDim.z + threadIdx.z;

if (posX < x && posY < y && posZ < z)
{
dest[posX+(posY*x)+(posZ*y*x)] =
source[posX+(posY*x)+(posZ*y*x)];
}
}

谁能告诉我哪里出错了?

最佳答案

我冒着回答错误的风险,但是您是否遗漏了数据类型的大小?

cudaMalloc(&DEVICE_DEST,size);

应该是

cudaMalloc(&DEVICE_DEST,size*sizeof(double));

还有

cudaMemcpy(DEVICE_SOURCE,source->volume,size, cudaMemcpyHostToDevice);

应该是

cudaMemcpy(DEVICE_SOURCE,source->volume,size*sizeof(double), cudaMemcpyHostToDevice);

等等。

关于使用 CUDA 复制结构内的指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29459877/

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