私はCUDAにはかなり新しく、オブジェクトのメモリ管理に関する質問があります。私はデバイスにデータをロードするオブジェクト関数を持っていて、別のオブジェクト関数が呼び出されると計算が実行されます。異なる機能でのcudaデバイス変数の割り当てと使用
私はNVIDIAプログラミングガイドのいくつかの部分を読んでいますが、いくつかのSOの質問をしていますが、データのコピーとコンピューティングは単一の機能であり、複数の機能は必要ありません。
さらに仕様: データは1回読み込まれます。コンパイル時にデータサイズがわからないので、動的割り当てが必要です。現在のデバイスのコンピューティング機能は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
ようこそ。あなたの質問を改善するためのこの[how-to-ask](http://stackoverflow.com/help/how-to-ask)をお読みください。 – thewaywewere