// Comes from:
// https://docs.nvidia.com/cuda/curand/host-api-overview.html#host-api-example

/*
 * This program uses the host CURAND API to generate 100
 * pseudorandom floats.
 */
#include <cuda.h>
#include <curand.h>
#include <stdio.h>
#include <stdlib.h>

#define CUDA_CALL(x)                                                          \
  do {                                                                        \
    if ((x) != cudaSuccess) {                                                 \
      printf("Error at %s:%d\n", __FILE__, __LINE__);                         \
      return EXIT_FAILURE;                                                    \
    }                                                                         \
  } while (0)
#define CURAND_CALL(x)                                                        \
  do {                                                                        \
    if ((x) != CURAND_STATUS_SUCCESS) {                                       \
      printf("Error at %s:%d\n", __FILE__, __LINE__);                         \
      return EXIT_FAILURE;                                                    \
    }                                                                         \
  } while (0)

int curand_main()
{
  size_t n = 100;
  size_t i;
  curandGenerator_t gen;
  float *devData, *hostData;

  /* Allocate n floats on host */
  hostData = (float*)calloc(n, sizeof(float));

  /* Allocate n floats on device */
  CUDA_CALL(cudaMalloc((void**)&devData, n * sizeof(float)));

  /* Create pseudo-random number generator */
  CURAND_CALL(curandCreateGenerator(&gen, CURAND_RNG_PSEUDO_DEFAULT));

  /* Set seed */
  CURAND_CALL(curandSetPseudoRandomGeneratorSeed(gen, 1234ULL));

  /* Generate n floats on device */
  CURAND_CALL(curandGenerateUniform(gen, devData, n));

  /* Copy device memory to host */
  CUDA_CALL(
    cudaMemcpy(hostData, devData, n * sizeof(float), cudaMemcpyDeviceToHost));

  /* Cleanup */
  CURAND_CALL(curandDestroyGenerator(gen));
  CUDA_CALL(cudaFree(devData));
  free(hostData);
  return EXIT_SUCCESS;
}
