2

コードを短くするために、次のテンプレートを宣言しました。

template <typename T>
void allocateGPUSpace(T* ptr, int size){

    cudaMalloc((void**)&ptr,size * sizeof(T));
}

さらに、次のようにテンプレートを使用します。

float* alphaWiMinusOne;

allocateGPUSpace<float>( alphaWiMinusOne,numUnigrams);

ただし、コードをコンパイルすると、VS 2008 で警告が表示されます

 warning: variable "alphaWiMinusOne" is used before its value is set

uninitialized local variable 'alphaWiMinusOne' used

cuda は C++ のテンプレートを理解できませんか? まあ、それはnvidiaにとって必須のことです

4

1 に答える 1

7

まず、その警告はCUDAからではなく、ホストコンパイラ(プラットフォームに応じてMicrosoftのC ++コンパイラまたはGCC)から発生し、完全に有効な警告です。ここで行ったのと同じ間違いを犯しました。このコードは、参照ではなく値で操作するためのポインターを渡しているため、期待どおりに機能しません。コードは次のようになります。

template <typename T> 
void allocateGPUSpace(T ** ptr, int size){   
    cudaMalloc((void**)ptr, size * sizeof(T)); 
} 

そしてこのような呼び出し:

float * alphaWiMinusOne;
allocateGPUSpace<float>(&alphaWiMinusOne, numUnigrams);

多分

template <typename T> 
T * allocateGPUSpace(int size){
    T * ptr;   
    cudaMalloc((void**)&ptr, size * sizeof(T));
    return ptr;
} 

その後

float * alphaWiMinusOne = allocateGPUSpace<float>(numUnigrams);

どちらかを使用すると、コンパイラの警告がなくなり、コードが機能します。スタイルのメモとして、それはエラーチェックを含まないかなり近視眼的なヘルパー関数の設計になります.......

于 2012-07-19T06:47:03.967 に答える