| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- // Comes from:
- // https://docs.nvidia.com/cuda/curand/host-api-overview.html#host-api-example
- #ifdef _WIN32
- # define EXPORT __declspec(dllexport)
- #else
- # define EXPORT
- #endif
- /*
- * 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)
- EXPORT 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;
- }
|