2011-10-10 8 views
1

私は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よう

答えて

0

フィールドは、cudaMallocで割り当てられたメモリでポイントする必要があります。

通常は、割り当てにmallocなどを使用するデータ構造のホストバージョンが必要です。次に、cudaMallocによって割り当てられたデバイス上のこれらのデータ構造のミラーが必要です。これらのデータ構造内のポインタは、正しい種類のメモリを指し示す必要があります。ミックスとマッチはできません。

+0

これは私が試みていることです。私はrdLearningSet構造体のための十分なデバイスメモリをcudaMallocし、そのポインタをrdLEarnに格納します。次に、私は多くの入力座標を保持するのに十分なデバイスメモリをcudaMallocし、そのポインタをデバイスのメモリ位置rdLrean-> gpuXInputsに格納します。これは正しく動作するようです。しかし、私がrdLearn-> gpuXInputsとして格納されているポインタの宛先に、そのコーデネイトセットのブロックをコピーしようとすると、移動しません! – jwilson75503

+0

rdlSourceは、コピー先の複製構造を作成する場所です。 構造体のポインタ型をどこで混合するのかわかりませんが、それを指摘できますか? – jwilson75503

+0

これらのコードフレームワークだけでは簡単にデバッグすることはできません - 小さな問題が発生するまでは、「分割と征服」のアプローチをとることをお勧めします。 –

関連する問題