Ich versuche, die CuRand-Bibliothek in CUDA zu verwenden. Ich versuche einfach eine zufällige Integer pro Thread zu generieren. Im Folgenden finden Sie meine Ergebnisse (Offenbar nicht sehr zufällig):Generate Random Number innerhalb Cuda Kernel
84
84
84
84
84
5
Bitte überprüfen Sie mir meinen Code und sagen, was mache ich falsch, ich versuche mein Haar herausziehen, um herauszufinden, warum dies nicht funktioniert ...
#include <stdio.h>
#include <stdlib.h>
#include <cuda.h>
#include <curand.h>
#include <curand_kernel.h>
__device__ float generate(curandState* globalState, int ind)
{
//int ind = threadIdx.x;
curandState localState = globalState[ind];
float RANDOM = curand_uniform(&localState);
globalState[ind] = localState;
return RANDOM;
}
__global__ void setup_kernel (curandState * state, unsigned long seed)
{
int id = threadIdx.x;
curand_init (seed, id, 0, &state[id]);
}
__global__ void addToCount(int N, int *y, curandState* globalState)
{
int id = threadIdx.x + blockIdx.x * blockDim.x;
while (id < N)
{
int number = generate(globalState, id) * 1000000;
printf("%i\n", number);
atomicAdd(&(y[0]), number);
id += blockDim.x * gridDim.x;
}
}
int main(void)
{
int N = 5;
int *y, *d_y;
y = (int*)malloc(N*sizeof(int));
cudaMalloc(&d_y, N * sizeof(int));
cudaMemcpy(d_y, y, N * sizeof(int), cudaMemcpyHostToDevice);
curandState* devStates;
cudaMalloc (&devStates, N * sizeof(curandState));
addToCount<<<2, 5>>>(N, d_y, devStates);
cudaMemcpy(y, d_y, N*sizeof(int), cudaMemcpyDeviceToHost);
printf("%i\n", *y);
}
vielleicht sollten Sie die 'setup_kernel' nennen, die Sie geschrieben haben, bevor Sie den' addToCount' Kernel Aufruf? –
Korrekte Fehlerprüfung und Verwendung eines Debuggers würde ebenfalls helfen – Drop