Довольно простой вопрос, но я не могу заставить его работать ...
У меня есть такая структура:
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.
Где я должен поместить эту структуру? Как я могу связать это и мой основной?