2

(void **)&x と (void *)x の違いは何ですか? 私はあなたにいくつかのコードを提供します、私を助けてください。

float *xd;
int size=width*width*size(float);
cudaMalloc((void **)&x,size); 1
cudaMalloc((void *)x,size);   2
cudaMalloc(&x,size);          3
cudaMalloc(*x,size);          4

cudaFree(xd);

違いを知りたいだけです。

cudaMalloc() 関数の最初のパラメーターは、割り当て後に割り当てられたオブジェクトを指す必要があるポインター変数のアドレスです。関数は汎用ポインター値を想定しているため、ポインター変数のアドレスは (void **) にキャストする必要があります。メモリ割り当て関数は、特定のタイプのオブジェクトに限定されない汎用関数です。このアドレスにより、cudaMalloc() 関数は、割り当てられたオブジェクトのアドレスをポインター変数に書き込むことができます。3 cudaMalloc() 関数の 2 番目のパラメーターは、割り当てられるオブジェクトのサイズをバイト単位で指定します。この 2 番目のパラメーターの使用法は、C の malloc() 関数のサイズ パラメーターと一致しています。

4

2 に答える 2

6

それらはほぼ完全に異なります。

これ:

(void **)&x

のアドレスをx取得し、に変換しvoid**ます(ポインタからポインタへvoid)。

これ:

(void *)x

の値を取り、xそれをに変換しvoid*ます。

これらは両方ともポインタですが、メモリ内のまったく異なる場所を指しており(x独自のアドレスが含まれている場合を除く)、タイプも異なります。

また、コードを表示したい場合は、実際にコンパイルされるコードを表示すると便利です。実際のソースコードをコピーして貼り付けます。再入力しないでください。xあなたは私たちに( ?xdのタイプミスxです)の宣言を示しておらずsize(float)、構文エラーです(あなたは?を意味しましたsizeof(float)か?)。

于 2012-08-13T03:30:36.043 に答える
3

よく書く理由をよりよく理解するために、次のことを考慮してください。cudaMalloc(void**)&var

cudaMallocGPU にメモリを割り当てます。それが参照するメモリタイプはvoid*、データタイプを実際には気にしないためです。

割り当てたメモリ内のアドレスを取得したら、cudaMalloc何らかの方法でそれを呼び出し元に返す必要があります。ただし、すべての CUDA API 関数はエラー コード (または成功コード) を返し、追加の返されたデータはパラメーター参照によって返される必要があります。

C言語には参照渡しがないため、実際には、関数が結果を格納する変数へのポインターを渡す必要があります。ポインタ値を格納したいので、ポインタからポインタへ渡す必要があります。したがって、void**タイプします。

同様の方法で malloc をカプセル化したい場合は、次のように記述します。

void myMalloc(void** ret, size_t size) {
    void* mem = malloc(size);
    *ret = mem;
}

に渡す(void**)&varと、関数は---変数を指すようにmyMalloc、の値を上書きできます。varretvar

これでわかりやすくなりましたか?

于 2012-08-13T11:00:42.603 に答える