3

CUDAを使用してニューラルネットワークを作成しようとしています。

私のカーネルは次のようになります:

__global__ void feedForward(float *input, float *output, float **weight) {

//Here the threadId uniquely identifies weight in a neuron
int weightIndex = threadIdx.x;

//Here the blockId uniquely identifies a neuron
int neuronIndex = blockIdx.x;

if(neuronIndex<NO_OF_NEURONS && weightIndex<NO_OF_WEIGHTS)
output[neuronIndex] += weight[neuronIndex][weightIndex]
        * input[weightIndex];
}

出力をホストにコピーして戻すときに、エラーが発生します

行xxでのエラー不特定の起動失敗

xx行目:

CUDA_CHECK_RETURN(cudaMemcpy(h_output, d_Output, output_size, cudaMemcpyDeviceToHost));

私はここで何か間違ったことをしていますか?

ウェイトマトリックスを参照するためにブロックインデックスとスレッドインデックスの両方を使用しているためです。それとも問題は他の場所にありますか?

私は次のようにウェイトマトリックスをオールコーティングしています:

cudaMallocPitch((void**)&d_Weight, &pitch_W,input_size,NO_OF_NEURONS);

私のカーネル呼び出しは次のとおりです。

feedForward<<<NO_OF_NEURONS,NO_OF_WEIGHTS>>>(d_Input,d_Output,d_Weight);

その後、私は呼び出します:cudaThreadSynchronize();

私はCUDAを使ったプログラミングに不慣れです。どんな助けでもいただければ幸いです。

ありがとう

4

3 に答える 3

1

出力コードに問題があります。説明されているエラーは発生しませんが、誤った結果が生成されます。

int neuronIndex = blockIdx.x;

if(neuronIndex<NO_OF_NEURONS && weightIndex<NO_OF_WEIGHTS)
output[neuronIndex] += weight[neuronIndex][weightIndex] * input[weightIndex];

1 つのブロック内のすべてのスレッドが 1 つのメモリ セルに同時に書き込みを行っていることがわかります。したがって、udefined の結果が期待されます。これを回避するには、共有メモリ内のブロック内のすべての値を減らし、グローバル メモリへの 1 回の書き込みを実行することをお勧めします。このようなもの:

__global__ void feedForward(float *input, float *output, float **weight) {

  int weightIndex = threadIdx.x;
  int neuronIndex = blockIdx.x;
  __shared__ float out_reduce[NO_OF_WEIGHTS];

  out_reduce[weightIndex] = 
     (weightIndex<NO_OF_WEIGHTS && neuronIndex<NO_OF_NEURONS) ? 
       weight[neuronIndex][weightIndex] * input[weightIndex]
       : 0.0;
  __syncthreads();

  for (int s = NO_OF_WEIGHTS; s > 0 ; s >>= 1)
  {
    if (weightIndex < s) out_reduce[weightIndex] += out_reduce[weightIndex + s];
    __syncthreads();
  }

  if (weightIndex == 0) output[neuronIndex] += out_reduce[weightIndex]; 
}

リダクション コードを支援するために、小さなカーネルの半分を書き直さなければならないことがわかりました...

于 2013-01-21T21:19:02.683 に答える
1

CUDA を使用して非常に単純な MLP ネットワークを構築します。興味があれば、ここで私のコードを見つけることができます : https://github.com/PirosB3/CudaNeuralNetworks/

ダニエル

于 2014-10-02T23:22:06.860 に答える
0

cudaMallocPitch を使用していますが、変数がどのように初期化されるかを示していません。これがあなたのエラーの原因であると確信しています。cudaMallocPitch はかなりトリッキーです。3 番目のパラメーターはバイト単位である必要がありますが、4 番目のパラメーターはそうではありません。すなわち

int width = 64, height = 64;
float* devPtr;
size_t pitch;
cudaMallocPitch(&device_Ptr, &pitch, width * sizeof(float), height);

あなたの変数input_sizeはバイトですか?そうでない場合は、メモリの割り当てが少なすぎる可能性があります (つまり、64 個の要素を要求していると思いますが、代わりに 64 バイトを取得することになります)、カーネルの範囲外のメモリにアクセスすることになります。 . 私の経験では、「unspecified launch failure」エラーは通常、セグメンテーション違反があることを意味します

于 2013-01-21T18:04:31.657 に答える