0

CUDA を使用して、main() とは異なる関数から GPU ごとに 1 つずつ、異なる配列にメモリを割り当てたいのですが、ポインター演算に関して何かを見逃していたに違いありません。ここで私が考えたのは、

void InitThisMemory(int***, int N, int Nout, size_t* pitch, int height, int width); // This function's purpose is to initialize A and the pitch

int main(void){
   int** A;
   int N = 10; 
   int NOut = 2;
   int height = 2, width = 2;
   size_t pitch;
   InitThisMemory(&A, N, NOut, &pitch, height, width);
   return 0;
}

InitThisMemory(int ***A, int N, int Nout, size_t* pitch, int height, int width){
  int i;
  *A = (int**)malloc(Nout * sizeof(int*));
  for(i = 0;i < Nout;i++){
      cudaSetDevice(i);
      cudaMallocPitch((void**)&(*A[i]), &(*pitch), width, height);
  }
}

免責事項: 私の実際のコードではありませんが、これでエラーが再現されるはずです。どこかで変数の割り当てを逃した場合はお知らせください。

問題は算数にあると思うのはなぜですか。単純に、これが非常にうまく機能するからですNout = 1(つまり、私は 1 つのデバイスしか使用していないということです)。

何か案は?

4

1 に答える 1

2

(void**)&(*A[i])あなたのバグはの代わりに書いていると思いますが(void **) (&(*A)[i])、次のようにリファクタリングすることをお勧めします:

  1. ローカルの int ** 変数を使用してmalloc()戻り値を保持します。
  2. への呼び出しでそのローカルを使用しますcudaMallocPitch()
  3. すべての呼び出しが成功 した場合にのみ、malloc()戻り値を返します。cudaMallocPitch()

これらのことを行うと、cudaMallocPitch()呼び出しの 1 つが失敗した場合に正しいクリーンアップ コードを記述するのが簡単になり、すべてが成功しない限りパスバックを伝達する必要がなくなります。

于 2012-09-18T23:15:45.277 に答える