我對CUDA來說很新,我對於對象的內存管理有個疑問。我有一個對象函數來將數據加載到設備,並且如果調用另一個對象函數,則執行計算。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__
指針(如__device__ float* dev_data;
)複製數據嗎?
你能試着勾畫出你在代碼中的意思嗎?因爲要理解你在這裏要問的東西並不是很容易理解。 – talonmies
歡迎來到SO。請閱讀此[如何問](http://stackoverflow.com/help/how-to-ask)以改善您的問題。 – thewaywewere