该问题来自社区帖: https://bbs.csdn.net/topics/618536835.
结构体中有数组,结构体传入GPU后在核函数中分配了数组内存(new),给数组传入了数据
怎么把数据带回CPU端
结构体中有数组,结构体传入GPU后在核函数中分配了数组内存(new),给数组传入了数据
怎么把数据带回CPU端
引自免费微信小程序:皆我百晓生
要在CUDA编程中将GPU上的数据回传到CPU,你需要遵循以下步骤:
cudaMemcpy
函数从GPU复制数据到CPU。首先,确保你在CUDA环境中正确设置了设备上下文。这里是一个示例,展示了如何在C++中实现这个过程:
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
// 假设这是你的结构体定义
struct MyStruct {
int size;
float* array;
};
__global__ void kernelFunction(MyStruct* gpuStruct) {
// 在这里分配内存并填充数据
int index = threadIdx.x + blockIdx.x * blockDim.x;
if (index < gpuStruct->size) {
gpuStruct->array[index] = index * 0.5f;
}
}
int main() {
// 设定结构体大小(这里假设为10)
const int structSize = 10;
// CPU端的结构体实例
MyStruct cpuStruct;
cpuStruct.size = structSize;
// 分配CPU端的数组内存
cpuStruct.array = new float[structSize];
// GPU端的结构体实例
MyStruct* gpuStruct;
cudaMalloc(&gpuStruct, sizeof(MyStruct));
// 将CPU端的结构体复制到GPU
cudaMemcpy(gpuStruct, &cpuStruct, sizeof(MyStruct), cudaMemcpyHostToDevice);
// 启动核函数,例如在一个块中执行10个线程
dim3 blockSize(10);
dim3 gridSize(1);
kernelFunction<<<gridSize, blockSize>>>(gpuStruct);
// 从GPU的数组复制数据到CPU的数组
cudaMemcpy(cpuStruct.array, gpuStruct->array, structSize * sizeof(float), cudaMemcpyDeviceToHost);
// 清理资源
delete[] cpuStruct.array;
cudaFree(gpuStruct);
// 检查错误
cudaDeviceSynchronize();
cudaError_t err = cudaGetLastError();
if (err != cudaSuccess) {
printf("Error: %s\n", cudaGetErrorString(err));
return -1;
}
// 打印CPU端的数据作为验证
for (int i = 0; i < structSize; ++i) {
printf("CPU data at index %d: %f\n", i, cpuStruct.array[i]);
}
return 0;
}
这段代码首先在CPU上定义了一个结构体实例,并分配了数组内存。然后,在GPU上也创建了一个结构体实例,并通过cudaMemcpy
将其内容从CPU复制过去。接下来,我们启动一个简单的核函数,它在每个线程中为数组赋值。核函数执行完毕后,我们将GPU上的数组数据复制回CPU,最后释放内存并检查是否有任何CUDA错误。