Skip to content

Instantly share code, notes, and snippets.

@dangkhoasdc
Created October 15, 2018 10:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dangkhoasdc/5d8fe43d24d510063011b9d5aff64f96 to your computer and use it in GitHub Desktop.
Save dangkhoasdc/5d8fe43d24d510063011b9d5aff64f96 to your computer and use it in GitHub Desktop.
/* This program uses the host CURAND API to generate 100
* pseudorandom floats.
*
* Code taken verbatim from CURAND library documentation.
*/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <cuda.h>
#include <curand.h>
#include <chrono>
#include <thread>
#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 main(int argc, char *argv[])
{
size_t n = 1;
size_t i;
curandGenerator_t gen;
std::cout << "Create the curand generator" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(20));
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));
/* 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));
/* Show result */
for(i = 0; i < n; i++) {
printf("%1.4f ", hostData[i]);
}
printf("\n");
/* Cleanup */
CURAND_CALL(curandDestroyGenerator(gen));
CUDA_CALL(cudaFree(devData));
free(hostData);
return EXIT_SUCCESS;
}
@dangkhoasdc
Copy link
Author

To compile:

/usr/local/cuda/bin/nvcc demo_curand.cpp -lcurand -std=c++11

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment