【发布时间】:2023-03-24 14:16:01
【问题描述】:
我对 CUDA 很陌生,我有一个关于对象内存管理的问题。我有一个对象函数来将数据加载到设备中,如果调用另一个对象函数,则执行计算。
我已阅读 NVIDIA 编程指南的某些部分和一些 SO 问题,但它们在单个函数中进行数据复制和计算,因此不需要多个函数。
更多规格: 数据被读取一次。我不知道编译时的数据大小,因此我需要动态分配。我当前的设备具有 2.1 的计算能力(将很快更新到 6.1)。
我想在第一个函数中复制数据并在不同的函数中使用数据。例如:
__constant__ int dev_size;
__device__ float* dev_data; //<- not sure about this
/* kernel */
__global__ void computeSomething(float* dev_output)
{
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < dev_size)
{
dev_output[idx] = dev_data[idx]*100; // some computation;
}
}
// function 1
void OBJECT::copyVolumeToGPU(int size, float* data)
{
cudaMalloc(&dev_data, size * sizeof(float));
cudaMemcpy(dev_data, data, size * sizeof(float), cudaMemcpyHostToDevice );
cudaMemcpyToSymbol(dev_size, size, sizeof(int));
}
// function 2
void OBJECT::computeSmthOnDevice(int size)
{
// allocate output array
auto host_output = new float[size];
float* dev_output;
cudaMalloc(&dev_output, size * sizeof(float));
int block = 256;
int grid = ceil(size/block);
computeSomething<<<grid,block>>>(dev_output);
cudaMemcpy(host_output, dev_data, size * sizeof(float), cudaMemcpyDeviceToHost);
/* ... do something with output ... */
delete[] host_output;
cudaFree(dev_output);
}
gpuErrChk 是这样执行的:https://stackoverflow.com/a/14038590/3921660 但在本例中省略了。
我可以使用__device__pointer(如__device__ float* dev_data;)复制数据吗?
【问题讨论】:
-
你能试着勾勒出你在代码中的意思吗?因为很难理解您在这里要问什么。
-
欢迎来到 SO。请阅读此how-to-ask 以改进您的问题。
标签: memory-management cuda gpu