Как использовать структуру с функциями CUDA в моей основной функции (они находятся в разных файлах)?Как их связать?Использование VS2008 - PullRequest
0 голосов
/ 23 ноября 2010

Довольно простой вопрос, но я не могу заставить его работать ...

У меня есть такая структура:

struct Rand48 
{
    // strided iteration constants (48-bit, distributed on 2x 24-bit)
    uint2 A, C;
    // CUDA array -- random numbers for all threads
    uint2 *state;
    // random number for a single thread (used by CUDA device functions only)
    uint2 state0;

    // magic constants for rand48
    static const unsigned long long a = 0x5DEECE66DLL, c = 0xB;

    void init(int nThreads, int seed) {
        uint2* seeds = new uint2[ nThreads ];

        cudaMalloc((void**) &state, sizeof(uint2)*nThreads);

        // calculate strided iteration constants
        unsigned long long A, C;
        A = 1LL; C = 0LL;
        for (unsigned int i = 0; i < (unsigned int)nThreads; ++i) {
            C += A*c;
            A *= a;
        }
        this->A.x = A & 0xFFFFFFLL;
        this->A.y = (A >> 24) & 0xFFFFFFLL;
        this->C.x = C & 0xFFFFFFLL;
        this->C.y = (C >> 24) & 0xFFFFFFLL;

        // prepare first nThreads random numbers from seed
        unsigned long long x = (((unsigned long long)seed) << 16) | 0x330E;
        for (unsigned int i = 0; i < (unsigned int)nThreads; ++i) {
            x = a*x + c;
            seeds[i].x = x & 0xFFFFFFLL;
            seeds[i].y = (x >> 24) & 0xFFFFFFLL;
        }

        cudaMemcpy(state, seeds, sizeof(uint2)*nThreads, cudaMemcpyHostToDevice);

        delete[] seeds;
    }

    void destroy() {
        cudaFree((void*) state);
    }
};

Он имеет некоторые функции cuda, такие как cudamalloc, и некоторый обычный код хоста c.

Как я могу сделать эту работу? Как:

Если я помещу этот код в файл .cu, VS скомпилирует его, используя nvcc. Но тогда у меня не будет объявления структуры в моем файле main.cpp (включая .cu, вероятно, также не будет работать). Если я положу это в файл .h, VS пожалуется, что я не объявил int2 и все остальное CUDA.

Где я должен поместить эту структуру? Как я могу связать это и мой основной?

1 Ответ

0 голосов
/ 24 ноября 2010

Существует как минимум три способа решения проблемы.

Первый - использовать nvcc для компиляции main.cpp, если вы можете.

C ++ - этоиспользуйте шаблон «указатель на реализацию» (pImpl).По сути, вы разделите класс Rand48 на две части: открытые методы остаются в Rand48, а единственным не входящим в метод элементом является прямое объявление для указателя на Impl.Таким образом, вы можете поместить класс Rand48 в .h. Затем вы можете поместить специфичный для CUDA код в Rand48::Impl, который не связан с самим телом класса Rand48.

Способ C состоит в пересылкеобъявить сам класс Rand48 (а не Rand48::Impl), а также объявить функции, не являющиеся членами, которые принимают Rand48*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...