2016-11-14 8 views
0

ポインタの配列を作成してCUDAメモリにコピーする方法を調べていました。私は私にビットを盗聴されて受け入れ答えvoidへのダブルポインタキャストのアドレス**

int ** devicePointersStoredInDeviceMemory; 
cudaMalloc((void**)&devicePointersStoredInDeviceMemory, sizeof(int*)*N); 

でこのポストCUDA Double pointer memory copyが、次の行を見つけました。 ダブルポインタのアドレスを渡してvoid**にキャストする意味はなんですか? &devicePointerStoredInDeviceMemoryint***と同じではないので、void***の代わりにvoid**にキャストするのはなぜですか?

それは動作しますが、なぜ私は理解できません。

+1

注:これは、標準C++で未定義の動作ですが、WindowsのAPIがそれに依存しています。 –

答えて

1

ダブルポインタのアドレスを渡してvoid **にキャストする意味はなんですか? & devicePointerStoredInDeviceMemoryはint ***と同じではないでしょうか?なぜvoid ***の代わりにvoid **にキャストしますか?

cudaMalloc機能は、その最初のパラメータとしてvoid **を取るので、我々はcudaMallocをコールするつもりなら、それは我々が必要とするタイプです。最初のパラメータの目的は、codaMallocに、割り当てたメモリへのポインタをどこに格納するかを指示することです。

あなただけのようにもこれを行うことができます:

void *j; 
cudaMalloc(&j, sizeof(int*)*N); // stores result in j 
int **devicePointersStoredInDeviceMemory = (int **) j; 
+0

ああ、私は今参照してください。だから、 '(void **)'は「あなたに割り当てたい変数のアドレスを教えてください」と解釈できますか?それが 'int *'か 'float **'か 'double *****'かどうかにかかわらず、これは私がそれを感謝したと思うアイデアです – BRabbit27

+2

私は "どこにアドレスを保存するか教えてください私があなたのために割り当てたメモリ "です。この場合、そのメモリに整数へのポインタを保持させたいので、整数へのポインタを保持するメモリへのポインタは 'int **'型です。 –

関連する問題