1

デバイスとホスト コードの間で共有され、デバイスとホストのポインターを共有メモリに内部的に格納するポインター型を定義したいと思います。実際に返すポインタをコンパイル時に決定したい:

#define F inline __host__ __device__

class SharedMemory;
/**
 * 
 * Can only be set by allocating shared memory.
 */
template<typename T>
class SharedMemoryPtr {
public:
    SharedMemoryPtr() : hptr(0), dptr(0) {}

    //F ~ SharedMemoryPtr() {cudaFreeHost(hptr);} // Should be freed explicitly (?)

    // TODO: Don't allow copying/overwriting (at least not without freeing memory...)

    F T& operator() () {
#ifdef __CUDACC__
        return *dptr;
#else
        return *hptr;
#endif
    };

    F T* operator-> () {
#ifdef __CUDACC__
        return dptr;
#else
        return hptr;
#endif
    };

    F T& operator * () {
#ifdef __CUDACC__
        return *dptr;
#else
        return *hptr;
#endif
    };

    F T& operator[] (__int64 i) const {
#ifdef __CUDACC__
        return *(dptr + i);
#else
        return *(hptr + i);
#endif
    };

    friend SharedMemory;

    // TODO: Make obsolete (possible?)

    T * getHptr() {return hptr;} 
    T * getDptr() {return dptr;}

private:

    T *hptr, *dptr;
};

class SharedMemory {
public:
    template<typename T>
    static SharedMemoryPtr<T> allocate(int count = 1) {
        assert(count > 0);

        SharedMemoryPtr<T> sptr;

        cutilSafeCall(
            cudaHostAlloc(&sptr.hptr, sizeof(T) * count, cudaHostAllocMapped));
        assert(sptr.hptr);
        cutilSafeCall(
            cudaHostGetDevicePointer(&sptr.dptr, sptr.hptr, 0));
        assert(sptr.dptr);

        return sptr;
    }
};

__CUDACC__これは、cpp ファイル (定義されていない場所) または .h ファイル (__CUDACC__関数が cu ファイル内の関数によって使用されている場合にのみ定義されている場所)のいずれかのコードでこれらのポインターを使用する限り、正常に機能します。ただし、.cu ファイルの__host__関数では、.cu ファイルを取得しdevptrます。明らかに、.cu ファイルは nvcc によってのみ処理されます。nvcc がたまたま処理するすべてのものだけでなく、 __global__and関数に対してのみ定義されている他のプリプロセッサ マクロはありますか? __device__または、コードを分離する必要がありますか?

4

1 に答える 1

7

__CUDA_ARCH__は、デバイス コードに対してのみ実在します。それを使用して、デバイス コードの動作を指定できます。このマクロは、実際にデバイス コードの計算機能を取得します (2.0 の場合は 200 など)。

于 2012-05-06T07:30:32.470 に答える