私はCUDAで加速されたニューラルネットワークシミュレータでカーネルを使用するためにいくつかのネストされた構造体をデバイスメモリにコピーしようとしています。このコードへのリンクと実行されますが、それはいくつかの例外とCUDAのエラーがスローされます。最後の(cudaMemcpy(&ダミーながらネストされた構造体のメンバーをCUDAデバイスのメモリ空間にコピーするにはどうすればよいですか?
typedef struct rdLayer
{
long NeuronQty ;
long DendriteQty ;
cuDoubleComplex *gpuWeights ;
cuDoubleComplex *gpuZOutputs ;
cuDoubleComplex *gpuDeltas ;
cuDoubleComplex *gpuUnWeights ;
} rdLayer;
typedef struct rdNetwork
{
long SectorQty;
double K_DIV_TWO_PI;
double two_pi_div_sect_qty;
cuDoubleComplex *gpuSectorBdry;
long LayerQty;
rdLayer *rLayer;
} rdNetwork;
struct rdLearningSet
{
long EvalMode ;
long SampleQty ;
long InputQty ;
long OutputQty ;
long ContOutputs ;
long SampleIdxReq ;
cuDoubleComplex *gpuXInputs ;
cuDoubleComplex *gpuDOutputs ;
cuDoubleComplex *gpuYOutputs ;
double *gpudSE1024 ;
cuDoubleComplex *gpuOutScalar ;
};
[...]
struct rdLearningSet * rdLearn;
struct rdNetwork * rdNet;
[...]
cudaMalloc(&rdNet, sizeof(rdNetwork));
cudaMalloc(&rdLearn, sizeof(rdLearningSet));
[...]
cuDoubleComplex * dummy;
struct rdLayer rdlSource, * rdldummy;
[...]
//rdLayer *rLayer;
cudaMalloc(&rdldummy, sizeof(rdLayer)*rSes.rNet->LayerQty);
cudaMemcpy(&rdNet->rLayer, &rdldummy, sizeof(rdLayer*), cudaMemcpyHostToDevice);
for (int L=1; L<rSes.rNet->LayerQty; L++){
// construct layer to be copied
rdlSource.NeuronQty=rSes.rNet->rLayer[L].iNeuronQty
rdlSource.DendriteQty=rSes.rNet->rLayer[L].iDendriteQty
cudaMalloc(&rdlSource.gpuWeights, sizeof(cuDoubleComplex) * (rSes.rNet->rLayer[L].DendriteQty+1) * (rSes.rNet->rLayer[L].NeuronQty+1))
mCheckCudaWorked
cudaMalloc(&rdlSource.gpuZOutputs, sizeof(cuDoubleComplex) * (rSes.rNet->rLayer[L].DendriteQty+1) * (rSes.rNet->rLayer[L].NeuronQty+1))
mCheckCudaWorked
cudaMalloc(&rdlSource.gpuDeltas, sizeof(cuDoubleComplex) * (rSes.rNet->rLayer[L].iDendriteQty+1) * (rSes.rNet->rLayer[L].iNeuronQty+1))
mCheckCudaWorked
cudaMalloc(&rdlSource.gpuUnWeights, sizeof(cuDoubleComplex) * (rSes.rNet->rLayer[L].iDendriteQty+1) * (rSes.rNet->rLayer[L].iNeuronQty+1))
mCheckCudaWorked
//copy layer sructure to Device mem
cudaMemcpyToSymbol("rdNet->rLayer", &rdlSource, sizeof(rdLayer), sizeof(rdLayer) * L, cudaMemcpyHostToDevice);/*! 2D neuron cx weight matrix on GPU */
mCheckCudaWorked
}
[...]
cudaMalloc(&dummy, sizeof(cuDoubleComplex) * (rSes.rLearn->SampleQty) * (rSes.rLearn->InputQty+1)); /*! 2D complex input tuples in GPU. */
cudaMemcpy(&rdLearn->gpuXInputs, &dummy, sizeof(cuDoubleComplex*), cudaMemcpyHostToDevice);
cudaMemcpy(&dummy, &rSes.rLearn->gpuXInputs, sizeof(cuDoubleComplex) * (rSes.rLearn->SampleQty) * (rSes.rLearn->InputQty+1), cudaMemcpyHostToDevice);
mCheckCudaWorked
cudaMalloc(&dummy, sizeof(cuDoubleComplex) * (rSes.rLearn->SampleQty) * (rSes.rLearn->OutputQty+1)); /*! 2D desired complex outputs in GPU. */
cudaMemcpy(&rdLearn->gpuDOutputs, &dummy, sizeof(cuDoubleComplex*), cudaMemcpyHostToDevice);
cudaMemcpy(&dummy, &rSes.rLearn->gpuDOutputs, sizeof(cuDoubleComplex) * (rSes.rLearn->SampleQty) * (rSes.rLearn->OutputQty+1), cudaMemcpyHostToDevice);
mCheckCudaWorked
[...]
は残念ながら、cudaMemcpyToSymbolコールは、mCheckCudaWorkedマクロは、「無効なデバイスのシンボル」であると言うことを、エラーを返します、& rSes.rLearn-> gpuDOutputs ...)とサードから最後(cudaMemcpy(&ダミー、& rSes.rLearn-> gpuXInputs ...)cudaMemcpyは "無効な引数" の復帰を呼び出します。
私がでていますこれらの項目をデバイスメモリにコピーして、カーネルコードからアドレス可能にするための進め方についての喪失。&ダミーd & rdldummyは、割り当てられたメモリが待っているデバイスのメモリアドレスへのポインタとして積極的に返されています。これらのポインタをデバイスメモリに書き込むことはできますが、メンバー値の大部分を同位の割り当て。助けて?彼らはデバイスメモリへの有効なポインタをしているようにgpuXInputs
よう
これは私が試みていることです。私はrdLearningSet構造体のための十分なデバイスメモリをcudaMallocし、そのポインタをrdLEarnに格納します。次に、私は多くの入力座標を保持するのに十分なデバイスメモリをcudaMallocし、そのポインタをデバイスのメモリ位置rdLrean-> gpuXInputsに格納します。これは正しく動作するようです。しかし、私がrdLearn-> gpuXInputsとして格納されているポインタの宛先に、そのコーデネイトセットのブロックをコピーしようとすると、移動しません! – jwilson75503
rdlSourceは、コピー先の複製構造を作成する場所です。 構造体のポインタ型をどこで混合するのかわかりませんが、それを指摘できますか? – jwilson75503
これらのコードフレームワークだけでは簡単にデバッグすることはできません - 小さな問題が発生するまでは、「分割と征服」のアプローチをとることをお勧めします。 –