ロバートの答えに追加しますが、最初に繰り返しますが、これは C API であり、参照をサポートしていないことを意味します。これにより、 function 内のポインターの値 (指されているものだけでなく) を変更できます。ロバート・クロヴェラによる答えはこれを説明しました。void
また、C も関数のオーバーロードをサポートしていないため、そうする必要があることに注意してください。
さらに、C++プログラム内でC APIを使用する場合(ただし、これについては述べていません)、そのような関数をテンプレートでラップするのが一般的です。例えば、
template<typename T>
cudaError_t cudaAlloc(T*& d_p, size_t elements)
{
return cudaMalloc((void**)&d_p, elements * sizeof(T));
}
上記のcudaAlloc
関数を呼び出す方法には、次の 2 つの違いがあります。
&
呼び出し時にアドレス取得演算子 ( ) を使用したり、型にキャストしたりせずに、デバイス ポインターを直接渡しますvoid
。
- 2 番目の引数
elements
は、バイト数ではなく要素数になりました。オペレーターはこれsizeof
を容易にします。これは間違いなくより直感的に要素を指定でき、バイトを気にする必要はありません。
例えば:
float *d = nullptr; // floats, 4 bytes per elements
size_t N = 100; // 100 elements
cudaError_t err = cudaAlloc(d,N); // modifies d, input is not bytes
if (err != cudaSuccess)
std::cerr << "Unable to allocate device memory" << std::endl;