0

以下のサンプル問題:

#include <iostream>

using namespace std;
__device__ __constant__ float* data;

template<class T> void allocOnly(T* deviceDest, size_t numElem)
{
    cudaError_t errCode = cudaMalloc((void**)&deviceDest, numElem*sizeof(T));
    if(errCode != cudaSuccess) 
        cout << "Got error with code " << errCode << endl;
}

int main()
{
    float* test(0);
    allocOnly<float>(test,10);
    cout << "test = " << test << endl;

    float* test2(0);    
    cudaError_t errCode = cudaMalloc((void**)&test2, 10*sizeof(float));
    if(errCode != cudaSuccess) 
        cout << "Got error with code " << errCode << endl;
    cout << "test2 = " << test2 << endl;

    return 0;
}

でコンパイルnvcc test.cu -o testBin

戻り値

test = 0
test2 = 0x310100

テンプレート関数を介して呼び出されたときに test が変更されないのはなぜですか? cudaMalloc は、新しく割り当てられたデバイスメモリへのポインターになるように変更することになっています!

4

1 に答える 1

3

cudaMalloc関数内で関数にローカルallocOnlyな引数にメモリが割り当てられているため、ポインタは変更されていません。次のように、メモリを割り当てるように関数を変更できます。deviceTestallocOnlyallocOnly

template<class T> void allocOnly(T** deviceDest, size_t numElem)
{
    cudaError_t errCode = cudaMalloc((void**)deviceDest, numElem*sizeof(T));
    if(errCode != cudaSuccess) 
        cout << "Got error with code " << errCode << endl;
}

主な機能の内部:

int main()
{
    float* test(0);
    allocOnly<float>(&test,10);
    cout << "test = " << test << endl;
    .
    .
    .

}
于 2013-02-05T19:46:05.097 に答える