All Downloads are FREE. Search and download functionalities are using the official Maven repository.

and.6.5.source-code.JCurand Maven / Gradle / Ivy

The newest version!
/*
 * JCurand - Java bindings for CURAND, the NVIDIA CUDA random
 * number generation library, to be used with JCuda
 *
 * Copyright (c) 2010-2012 Marco Hutter - http://www.jcuda.org
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use,
 * copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following
 * conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 */

package jcuda.jcurand;

import jcuda.*;
import jcuda.runtime.cudaStream_t;

/**
 * Java bindings for CURAND, the NVIDIA CUDA random number
 * generation library. 
*
* The documentation is taken from the CURAND header files. */ public class JCurand { /** * The flag that indicates whether the native library has been * loaded */ private static boolean initialized = false; /** * Whether a CudaException should be thrown if a method is about * to return a result code that is not * curandStatus.CURAND_STATUS_SUCCESS */ private static boolean exceptionsEnabled = false; /* Private constructor to prevent instantiation */ private JCurand() { } // Initialize the native library. static { initialize(); } /** * Initializes the native library. Note that this method * does not have to be called explicitly, since it will * be called automatically when this class is loaded. */ public static void initialize() { if (!initialized) { LibUtils.loadLibrary("JCurand"); initialized = true; } } /** * Set the specified log level for the JCurand library.
*
* Currently supported log levels: *
* LOG_QUIET: Never print anything
* LOG_ERROR: Print error messages
* LOG_TRACE: Print a trace of all native function calls
* * @param logLevel The log level to use. */ public static void setLogLevel(LogLevel logLevel) { setLogLevelNative(logLevel.ordinal()); } private static native void setLogLevelNative(int logLevel); /** * Enables or disables exceptions. By default, the methods of this class * only set the {@link curandStatus} from the native methods. * If exceptions are enabled, a CudaException with a detailed error * message will be thrown if a method is about to set a result code * that is not curandStatus.CURAND_STATUS_SUCCESS * * @param enabled Whether exceptions are enabled */ public static void setExceptionsEnabled(boolean enabled) { exceptionsEnabled = enabled; } /** * If the given result is not curandStatus.CURAND_STATUS_SUCCESS * and exceptions have been enabled, this method will throw a * CudaException with an error message that corresponds to the * given result code. Otherwise, the given result is simply * returned. * * @param result The result to check * @return The result that was given as the parameter * @throws CudaException If exceptions have been enabled and * the given result code is not curandStatus.CURAND_STATUS_SUCCESS */ private static int checkResult(int result) { if (exceptionsEnabled && result != curandStatus.CURAND_STATUS_SUCCESS) { throw new CudaException(curandStatus.stringFor(result)); } return result; } //=== Auto-generated part: =============================================== /** *
     * Create new random number generator.
     *
     * Creates a new random number generator of type rng_type
     * and returns it in *generator.
     *
     * Legal values for rng_type are:
     * - CURAND_RNG_PSEUDO_DEFAULT
     * - CURAND_RNG_PSEUDO_XORWOW 
     * - CURAND_RNG_PSEUDO_MRG32K3A
     * - CURAND_RNG_PSEUDO_MTGP32
     * - CURAND_RNG_PSEUDO_MT19937
     * - CURAND_RNG_PSEUDO_PHILOX4_32_10
     * - CURAND_RNG_QUASI_DEFAULT
     * - CURAND_RNG_QUASI_SOBOL32
     * - CURAND_RNG_QUASI_SCRAMBLED_SOBOL32
     * - CURAND_RNG_QUASI_SOBOL64
     * - CURAND_RNG_QUASI_SCRAMBLED_SOBOL64
     * 
     * When rng_type is CURAND_RNG_PSEUDO_DEFAULT, the type chosen
     * is CURAND_RNG_PSEUDO_XORWOW.  
     * When rng_type is CURAND_RNG_QUASI_DEFAULT,
     * the type chosen is CURAND_RNG_QUASI_SOBOL32.
     * 
     * The default values for rng_type = CURAND_RNG_PSEUDO_XORWOW are:
     * - seed = 0
     * - offset = 0
     * - ordering = CURAND_ORDERING_PSEUDO_DEFAULT
     *
     * The default values for rng_type = CURAND_RNG_PSEUDO_MRG32K3A are:
     * - seed = 0
     * - offset = 0
     * - ordering = CURAND_ORDERING_PSEUDO_DEFAULT
     *
     * The default values for rng_type = CURAND_RNG_PSEUDO_MTGP32 are:
     * - seed = 0
     * - offset = 0
     * - ordering = CURAND_ORDERING_PSEUDO_DEFAULT
     * 
     * The default values for \p rng_type = CURAND_RNG_PSEUDO_MT19937 are:
     * - seed = 0
     * - offset = 0
     * - ordering = CURAND_ORDERING_PSEUDO_DEFAULT
     * 
     * The default values for rng_type = CURAND_RNG_PSEUDO_PHILOX4_32_10 are:
     * - seed = 0
     *  - offset = 0
     *  - ordering = CURAND_ORDERING_PSEUDO_DEFAULT
     *
     * The default values for rng_type = CURAND_RNG_QUASI_SOBOL32 are:
     * - dimensions = 1
     * - offset = 0
     * - ordering = CURAND_ORDERING_QUASI_DEFAULT
     *
     * The default values for rng_type = CURAND_RNG_QUASI_SOBOL64 are:
     * - dimensions = 1
     * - offset = 0
     * - ordering = CURAND_ORDERING_QUASI_DEFAULT
     *
     * The default values for rng_type = CURAND_RNG_QUASI_SCRAMBBLED_SOBOL32 are:
     * - dimensions = 1
     * - offset = 0
     * - ordering = CURAND_ORDERING_QUASI_DEFAULT
     *
     * The default values for rng_type = CURAND_RNG_QUASI_SCRAMBLED_SOBOL64 are:
     * - dimensions = 1
     * - offset = 0
     * - ordering = CURAND_ORDERING_QUASI_DEFAULT
     *
     * @param generator - Pointer to generator
     * @param rng_type - Type of generator to create
     *
     * @return
     * 
     * CURAND_STATUS_ALLOCATION_FAILED if memory could not be allocated 
     * CURAND_STATUS_INITIALIZATION_FAILED if there was a problem setting up the GPU 
     * CURAND_STATUS_VERSION_MISMATCH if the header file version does not match the
     *   dynamically linked library version 
     * CURAND_STATUS_TYPE_ERROR if the value for rng_type is invalid 
     * CURAND_STATUS_SUCCESS if generator was created successfully 
     * 
*/ public static int curandCreateGenerator(curandGenerator generator, int rng_type) { return checkResult(curandCreateGeneratorNative(generator, rng_type)); } private native static int curandCreateGeneratorNative(curandGenerator generator, int rng_type); /** *
     * Create new host CPU random number generator.
     *
     * Creates a new host CPU random number generator of type rng_type
     * and returns it in *generator.
     *
     * Legal values for rng_type are:
     * - CURAND_RNG_PSEUDO_DEFAULT
     * - CURAND_RNG_PSEUDO_XORWOW 
     * - CURAND_RNG_PSEUDO_MRG32K3A
     * - CURAND_RNG_PSEUDO_MTGP32
     * - CURAND_RNG_PSEUDO_MT19937
     * - CURAND_RNG_PSEUDO_PHILOX4_32_10
     * - CURAND_RNG_QUASI_DEFAULT
     * - CURAND_RNG_QUASI_SOBOL32
     * 
     * When rng_type is CURAND_RNG_PSEUDO_DEFAULT, the type chosen
     * is CURAND_RNG_PSEUDO_XORWOW.  
     * When rng_type is CURAND_RNG_QUASI_DEFAULT,
     * the type chosen is CURAND_RNG_QUASI_SOBOL32.
     * 
     * The default values for rng_type = CURAND_RNG_PSEUDO_XORWOW are:
     * - seed = 0
     * - offset = 0
     * - ordering = CURAND_ORDERING_PSEUDO_DEFAULT
     *
     * The default values for rng_type = CURAND_RNG_PSEUDO_MRG32K3A are:
     * - seed = 0
     * - offset = 0
     * - ordering = CURAND_ORDERING_PSEUDO_DEFAULT
     *
     * The default values for rng_type = CURAND_RNG_PSEUDO_MTGP32 are:
     * - seed = 0
     * - offset = 0
     * - ordering = CURAND_ORDERING_PSEUDO_DEFAULT
     * 
     * The default values for \p rng_type = CURAND_RNG_PSEUDO_MT19937 are:
     * - seed = 0
     * - offset = 0
     * - ordering = CURAND_ORDERING_PSEUDO_DEFAULT
     * 
     * The default values for rng_type = CURAND_RNG_PSEUDO_PHILOX4_32_10 are:
     * - seed = 0
     * - offset = 0
     * - ordering = CURAND_ORDERING_PSEUDO_DEFAULT
     *
     * The default values for rng_type = CURAND_RNG_QUASI_SOBOL32 are:
     * - dimensions = 1
     * - offset = 0
     * - ordering = CURAND_ORDERING_QUASI_DEFAULT
     *
     * The default values for rng_type = CURAND_RNG_QUASI_SOBOL64 are:
     * - dimensions = 1
     * - offset = 0
     * - ordering = CURAND_ORDERING_QUASI_DEFAULT
     *
     * The default values for rng_type = CURAND_RNG_QUASI_SCRAMBLED_SOBOL32 are:
     * - dimensions = 1
     * - offset = 0
     * - ordering = CURAND_ORDERING_QUASI_DEFAULT
     *
     * The default values for rng_type = CURAND_RNG_QUASI_SCRAMBLED_SOBOL64 are:
     * - dimensions = 1
     * - offset = 0
     * - ordering = CURAND_ORDERING_QUASI_DEFAULT
     *
     * @param generator - Pointer to generator
     * @param rng_type - Type of generator to create
     *
     * @return
     * 
     * CURAND_STATUS_ALLOCATION_FAILED if memory could not be allocated 
     * CURAND_STATUS_INITIALIZATION_FAILED if there was a problem setting up the GPU 
     * CURAND_STATUS_VERSION_MISMATCH if the header file version does not match the
     *   dynamically linked library version 
     * CURAND_STATUS_TYPE_ERROR if the value for rng_type is invalid 
     * CURAND_STATUS_SUCCESS if generator was created successfully 
     * 
*/ public static int curandCreateGeneratorHost(curandGenerator generator, int rng_type) { return checkResult(curandCreateGeneratorHostNative(generator, rng_type)); } private native static int curandCreateGeneratorHostNative(curandGenerator generator, int rng_type); /** *
     * Destroy an existing generator.
     *
     * Destroy an existing generator and free all memory associated with its state.
     *
     * @param generator - Generator to destroy
     *
     * @return
     * 
     * CURAND_STATUS_NOT_INITIALIZED if the generator was never created 
     * CURAND_STATUS_SUCCESS if generator was destroyed successfully 
     * 
*/ public static int curandDestroyGenerator(curandGenerator generator) { return checkResult(curandDestroyGeneratorNative(generator)); } private native static int curandDestroyGeneratorNative(curandGenerator generator); /** *
     * Return the version number of the library.
     *
     * Return in *version the version number of the dynamically linked CURAND
     * library.  The format is the same as CUDART_VERSION from the CUDA Runtime.
     * The only supported configuration is CURAND version equal to CUDA Runtime
     * version.
     *
     * @param version - CURAND library version
     *
     * @return
     * 
     * CURAND_STATUS_SUCCESS if the version number was successfully returned 
     * 
*/ public static int curandGetVersion(int version[]) { return checkResult(curandGetVersionNative(version)); } private native static int curandGetVersionNative(int version[]); /** *
     * Set the current stream for CURAND kernel launches.
     *
     * Set the current stream for CURAND kernel launches.  All library functions
     * will use this stream until set again.
     *
     * @param generator - Generator to modify
     * @param stream - Stream to use or ::NULL for null stream
     *
     * @return
     * 
     * CURAND_STATUS_NOT_INITIALIZED if the generator was never created 
     * CURAND_STATUS_SUCCESS if stream was set successfully 
     * 
*/ public static int curandSetStream(curandGenerator generator, cudaStream_t stream) { return checkResult(curandSetStreamNative(generator, stream)); } private native static int curandSetStreamNative(curandGenerator generator, cudaStream_t stream); /** *
     * Set the seed value of the pseudo-random number generator.  
     * 
     * Set the seed value of the pseudorandom number generator.
     * All values of seed are valid.  Different seeds will produce different sequences.
     * Different seeds will often not be statistically correlated with each other,
     * but some pairs of seed values may generate sequences which are statistically correlated.
     *
     * @param generator - Generator to modify
     * @param seed - Seed value
     * 
     * @return
     * 
     * CURAND_STATUS_NOT_INITIALIZED if the generator was never created 
     * CURAND_STATUS_TYPE_ERROR if the generator is not a pseudorandom number generator 
     * CURAND_STATUS_SUCCESS if generator seed was set successfully 
     * 
*/ public static int curandSetPseudoRandomGeneratorSeed(curandGenerator generator, long seed) { return checkResult(curandSetPseudoRandomGeneratorSeedNative(generator, seed)); } private native static int curandSetPseudoRandomGeneratorSeedNative(curandGenerator generator, long seed); /** *
     * Set the absolute offset of the pseudo or quasirandom number generator.
     *
     * Set the absolute offset of the pseudo or quasirandom number generator.
     *
     * All values of offset are valid.  The offset position is absolute, not 
     * relative to the current position in the sequence.
     *
     * @param generator - Generator to modify
     * @param offset - Absolute offset position
     *
     * @return
     * 
     * CURAND_STATUS_NOT_INITIALIZED if the generator was never created 
     * CURAND_STATUS_SUCCESS if generator offset was set successfully 
     * 
*/ public static int curandSetGeneratorOffset(curandGenerator generator, long offset) { return checkResult(curandSetGeneratorOffsetNative(generator, offset)); } private native static int curandSetGeneratorOffsetNative(curandGenerator generator, long offset); /** *
     * Set the ordering of results of the pseudo or quasirandom number generator.
     *
     * Set the ordering of results of the pseudo or quasirandom number generator.
     *
     * Legal values of order for pseudorandom generators are:
     * - CURAND_ORDERING_PSEUDO_DEFAULT
     * - CURAND_ORDERING_PSEUDO_BEST
     * - CURAND_ORDERING_PSEUDO_SEEDED
     *
     * Legal values of order for quasirandom generators are:
     * - CURAND_ORDERING_QUASI_DEFAULT
     *
     * @param generator - Generator to modify
     * @param order - Ordering of results
     *
     * @return
     * 
     * CURAND_STATUS_NOT_INITIALIZED if the generator was never created 
     * CURAND_STATUS_OUT_OF_RANGE if the ordering is not valid 
     * CURAND_STATUS_SUCCESS if generator ordering was set successfully 
     * 
*/ public static int curandSetGeneratorOrdering(curandGenerator generator, int order) { return checkResult(curandSetGeneratorOrderingNative(generator, order)); } private native static int curandSetGeneratorOrderingNative(curandGenerator generator, int order); /** *
     * Set the number of dimensions.
     *
     * Set the number of dimensions to be generated by the quasirandom number
     * generator.
     * 
     * Legal values for num_dimensions are 1 to 20000.
     * 
     * @param generator - Generator to modify
     * @param num_dimensions - Number of dimensions
     *
     * @return
     * 
     * CURAND_STATUS_NOT_INITIALIZED if the generator was never created 
     * CURAND_STATUS_OUT_OF_RANGE if num_dimensions is not valid 
     * CURAND_STATUS_TYPE_ERROR if the generator is not a quasirandom number generator 
     * CURAND_STATUS_SUCCESS if generator ordering was set successfully 
     * 
*/ public static int curandSetQuasiRandomGeneratorDimensions(curandGenerator generator, int num_dimensions) { return checkResult(curandSetQuasiRandomGeneratorDimensionsNative(generator, num_dimensions)); } private native static int curandSetQuasiRandomGeneratorDimensionsNative(curandGenerator generator, int num_dimensions); /** *
     * Generate 32-bit pseudo or quasirandom numbers.
     *
     * Use generator to generate num 32-bit results into the device memory at
     * outputPtr.  The device memory must have been previously allocated and be
     * large enough to hold all the results.  Launches are done with the stream
     * set using ::curandSetStream(), or the null stream if no stream has been set.
     *
     * Results are 32-bit values with every bit random.
     *
     * @param generator - Generator to use
     * @param outputPtr - Pointer to device memory to store CUDA-generated results, or
     *                 Pointer to host memory to store CPU-generated results
     * @param num - Number of random 32-bit values to generate
     *
     * @return
     * 
     * CURAND_STATUS_NOT_INITIALIZED if the generator was never created 
     * CURAND_STATUS_PREEXISTING_FAILURE if there was an existing error from 
     *     a previous kernel launch 
     * CURAND_STATUS_LENGTH_NOT_MULTIPLE if the number of output samples is
     *    not a multiple of the quasirandom dimension 
     * CURAND_STATUS_LAUNCH_FAILURE if the kernel launch failed for any reason 
     * CURAND_STATUS_SUCCESS if the results were generated successfully 
     * 
*/ public static int curandGenerate(curandGenerator generator, Pointer outputPtr, long num) { return checkResult(curandGenerateNative(generator, outputPtr, num)); } private native static int curandGenerateNative(curandGenerator generator, Pointer outputPtr, long num); /** *
     * Generate 64-bit quasirandom numbers.
     *
     * Use generator to generate num 64-bit results into the device memory at
     * outputPtr.  The device memory must have been previously allocated and be
     * large enough to hold all the results.  Launches are done with the stream
     * set using ::curandSetStream(), or the null stream if no stream has been set.
     *
     * Results are 64-bit values with every bit random.
     *
     * @param generator - Generator to use
     * @param outputPtr - Pointer to device memory to store CUDA-generated results, or
     *                 Pointer to host memory to store CPU-generated results
     * @param num - Number of random 64-bit values to generate
     *
     * @return
     * 
     * CURAND_STATUS_NOT_INITIALIZED if the generator was never created 
     * CURAND_STATUS_PREEXISTING_FAILURE if there was an existing error from 
     *     a previous kernel launch 
     * CURAND_STATUS_LENGTH_NOT_MULTIPLE if the number of output samples is
     *    not a multiple of the quasirandom dimension 
     * CURAND_STATUS_LAUNCH_FAILURE if the kernel launch failed for any reason 
     * CURAND_STATUS_SUCCESS if the results were generated successfully 
     * 
*/ public static int curandGenerateLongLong(curandGenerator generator, Pointer outputPtr, long num) { return checkResult(curandGenerateLongLongNative(generator, outputPtr, num)); } private native static int curandGenerateLongLongNative(curandGenerator generator, Pointer outputPtr, long num); /** *
     * Generate uniformly distributed floats.
     *
     * Use generator to generate num float results into the device memory at
     * outputPtr.  The device memory must have been previously allocated and be
     * large enough to hold all the results.  Launches are done with the stream
     * set using ::curandSetStream(), or the null stream if no stream has been set.
     *
     * Results are 32-bit floating point values between 0.0f and 1.0f,
     * excluding 0.0f and including 1.0f.
     *
     * @param generator - Generator to use
     * @param outputPtr - Pointer to device memory to store CUDA-generated results, or
     *                 Pointer to host memory to store CPU-generated results
     * @param num - Number of floats to generate
     *
     * @return
     * 
     * CURAND_STATUS_NOT_INITIALIZED if the generator was never created 
     * CURAND_STATUS_PREEXISTING_FAILURE if there was an existing error from
     *    a previous kernel launch 
     * CURAND_STATUS_LAUNCH_FAILURE if the kernel launch failed for any reason 
     * CURAND_STATUS_LENGTH_NOT_MULTIPLE if the number of output samples is
     *    not a multiple of the quasirandom dimension 
     * CURAND_STATUS_SUCCESS if the results were generated successfully 
     * 
*/ public static int curandGenerateUniform(curandGenerator generator, Pointer outputPtr, long num) { return checkResult(curandGenerateUniformNative(generator, outputPtr, num)); } private native static int curandGenerateUniformNative(curandGenerator generator, Pointer outputPtr, long num); /** *
     * Generate uniformly distributed doubles.
     *
     * Use generator to generate num double results into the device memory at
     * outputPtr.  The device memory must have been previously allocated and be
     * large enough to hold all the results.  Launches are done with the stream
     * set using ::curandSetStream(), or the null stream if no stream has been set.
     *
     * Results are 64-bit double precision floating point values between 
     * 0.0 and 1.0, excluding 0.0 and including 1.0.
     *
     * @param generator - Generator to use
     * @param outputPtr - Pointer to device memory to store CUDA-generated results, or
     *                 Pointer to host memory to store CPU-generated results
     * @param num - Number of doubles to generate
     *
     * @return
     * 
     * CURAND_STATUS_NOT_INITIALIZED if the generator was never created 
     * CURAND_STATUS_PREEXISTING_FAILURE if there was an existing error from
     *    a previous kernel launch 
     * CURAND_STATUS_LAUNCH_FAILURE if the kernel launch failed for any reason 
     * CURAND_STATUS_LENGTH_NOT_MULTIPLE if the number of output samples is
     *    not a multiple of the quasirandom dimension 
     * CURAND_STATUS_DOUBLE_PRECISION_REQUIRED if the GPU does not support double precision 
     * CURAND_STATUS_SUCCESS if the results were generated successfully 
     * 
*/ public static int curandGenerateUniformDouble(curandGenerator generator, Pointer outputPtr, long num) { return checkResult(curandGenerateUniformDoubleNative(generator, outputPtr, num)); } private native static int curandGenerateUniformDoubleNative(curandGenerator generator, Pointer outputPtr, long num); /** *
     * Generate normally distributed floats.
     *
     * Use generator to generate num float results into the device memory at
     * outputPtr.  The device memory must have been previously allocated and be
     * large enough to hold all the results.  Launches are done with the stream
     * set using ::curandSetStream(), or the null stream if no stream has been set.
     *
     * Results are 32-bit floating point values with mean mean and standard
     * deviation stddev.
     *
     * Normally distributed results are generated from pseudorandom generators
     * with a Box-Muller transform, and so require num to be even.
     * Quasirandom generators use an inverse cumulative distribution 
     * function to preserve dimensionality.
     *
     * There may be slight numerical differences between results generated
     * on the GPU with generators created with ::curandCreateGenerator()
     * and results calculated on the CPU with generators created with
     * ::curandCreateGeneratorHost().  These differences arise because of
     * differences in results for transcendental functions.  In addition,
     * future versions of CURAND may use newer versions of the CUDA math
     * library, so different versions of CURAND may give slightly different
     * numerical values.
     *
     * @param generator - Generator to use
     * @param outputPtr - Pointer to device memory to store CUDA-generated results, or
     *                 Pointer to host memory to store CPU-generated results
     * @param n - Number of floats to generate
     * @param mean - Mean of normal distribution
     * @param stddev - Standard deviation of normal distribution
     *
     * @return
     * 
     * CURAND_STATUS_NOT_INITIALIZED if the generator was never created 
     * CURAND_STATUS_PREEXISTING_FAILURE if there was an existing error from
     *    a previous kernel launch 
     * CURAND_STATUS_LAUNCH_FAILURE if the kernel launch failed for any reason 
     * CURAND_STATUS_LENGTH_NOT_MULTIPLE if the number of output samples is
     *    not a multiple of the quasirandom dimension, or is not a multiple
     *    of two for pseudorandom generators 
     * CURAND_STATUS_SUCCESS if the results were generated successfully 
     * 
*/ public static int curandGenerateNormal(curandGenerator generator, Pointer outputPtr, long n, float mean, float stddev) { return checkResult(curandGenerateNormalNative(generator, outputPtr, n, mean, stddev)); } private native static int curandGenerateNormalNative(curandGenerator generator, Pointer outputPtr, long n, float mean, float stddev); /** *
     * Generate normally distributed doubles.
     *
     * Use generator to generate num double results into the device memory at
     * outputPtr.  The device memory must have been previously allocated and be
     * large enough to hold all the results.  Launches are done with the stream
     * set using ::curandSetStream(), or the null stream if no stream has been set.
     *
     * Results are 64-bit floating point values with mean mean and standard
     * deviation stddev.
     *
     * Normally distributed results are generated from pseudorandom generators
     * with a Box-Muller transform, and so require num to be even.
     * Quasirandom generators use an inverse cumulative distribution 
     * function to preserve dimensionality.
     *
     * There may be slight numerical differences between results generated
     * on the GPU with generators created with ::curandCreateGenerator()
     * and results calculated on the CPU with generators created with
     * ::curandCreateGeneratorHost().  These differences arise because of
     * differences in results for transcendental functions.  In addition,
     * future versions of CURAND may use newer versions of the CUDA math
     * library, so different versions of CURAND may give slightly different
     * numerical values.
     *
     * @param generator - Generator to use
     * @param outputPtr - Pointer to device memory to store CUDA-generated results, or
     *                 Pointer to host memory to store CPU-generated results
     * @param n - Number of doubles to generate
     * @param mean - Mean of normal distribution
     * @param stddev - Standard deviation of normal distribution
     *
     * @return
     * 
     * CURAND_STATUS_NOT_INITIALIZED if the generator was never created 
     * CURAND_STATUS_PREEXISTING_FAILURE if there was an existing error from
     *    a previous kernel launch 
     * CURAND_STATUS_LAUNCH_FAILURE if the kernel launch failed for any reason 
     * CURAND_STATUS_LENGTH_NOT_MULTIPLE if the number of output samples is
     *    not a multiple of the quasirandom dimension, or is not a multiple
     *    of two for pseudorandom generators 
     * CURAND_STATUS_DOUBLE_PRECISION_REQUIRED if the GPU does not support double precision 
     * CURAND_STATUS_SUCCESS if the results were generated successfully 
     * 
*/ public static int curandGenerateNormalDouble(curandGenerator generator, Pointer outputPtr, long n, double mean, double stddev) { return checkResult(curandGenerateNormalDoubleNative(generator, outputPtr, n, mean, stddev)); } private native static int curandGenerateNormalDoubleNative(curandGenerator generator, Pointer outputPtr, long n, double mean, double stddev); /** *
     * Generate log-normally distributed floats.
     *
     * Use generator to generate num float results into the device memory at
     * outputPtr.  The device memory must have been previously allocated and be
     * large enough to hold all the results.  Launches are done with the stream
     * set using ::curandSetStream(), or the null stream if no stream has been set.
     *
     * Results are 32-bit floating point values with log-normal distribution based on
     * an associated normal distribution with mean mean and standard deviation stddev.
     *
     * Normally distributed results are generated from pseudorandom generators
     * with a Box-Muller transform, and so require num to be even.
     * Quasirandom generators use an inverse cumulative distribution 
     * function to preserve dimensionality. 
     * The normally distributed results are transformed into log-normal distribution.
     *
     * There may be slight numerical differences between results generated
     * on the GPU with generators created with ::curandCreateGenerator()
     * and results calculated on the CPU with generators created with
     * ::curandCreateGeneratorHost().  These differences arise because of
     * differences in results for transcendental functions.  In addition,
     * future versions of CURAND may use newer versions of the CUDA math
     * library, so different versions of CURAND may give slightly different
     * numerical values.
     *
     * @param generator - Generator to use
     * @param outputPtr - Pointer to device memory to store CUDA-generated results, or
     *                 Pointer to host memory to store CPU-generated results
     * @param n - Number of floats to generate
     * @param mean - Mean of associated normal distribution
     * @param stddev - Standard deviation of associated normal distribution
     *
     * @return
     * 
     * CURAND_STATUS_NOT_INITIALIZED if the generator was never created 
     * CURAND_STATUS_PREEXISTING_FAILURE if there was an existing error from
     *    a previous kernel launch 
     * CURAND_STATUS_LAUNCH_FAILURE if the kernel launch failed for any reason 
     * CURAND_STATUS_LENGTH_NOT_MULTIPLE if the number of output samples is
     *    not a multiple of the quasirandom dimension, or is not a multiple
     *    of two for pseudorandom generators 
     * CURAND_STATUS_SUCCESS if the results were generated successfully 
     * 
*/ public static int curandGenerateLogNormal(curandGenerator generator, Pointer outputPtr, long n, float mean, float stddev) { return checkResult(curandGenerateLogNormalNative(generator, outputPtr, n, mean, stddev)); } private native static int curandGenerateLogNormalNative(curandGenerator generator, Pointer outputPtr, long n, float mean, float stddev); /** *
     * Generate log-normally distributed doubles.
     *
     * Use generator to generate num double results into the device memory at
     * outputPtr.  The device memory must have been previously allocated and be
     * large enough to hold all the results.  Launches are done with the stream
     * set using ::curandSetStream(), or the null stream if no stream has been set.
     *
     * Results are 64-bit floating point values with log-normal distribution based on
     * an associated normal distribution with mean mean and standard deviation stddev.
     *
     * Normally distributed results are generated from pseudorandom generators
     * with a Box-Muller transform, and so require num to be even.
     * Quasirandom generators use an inverse cumulative distribution 
     * function to preserve dimensionality.
     * The normally distributed results are transformed into log-normal distribution.
     *
     * There may be slight numerical differences between results generated
     * on the GPU with generators created with ::curandCreateGenerator()
     * and results calculated on the CPU with generators created with
     * ::curandCreateGeneratorHost().  These differences arise because of
     * differences in results for transcendental functions.  In addition,
     * future versions of CURAND may use newer versions of the CUDA math
     * library, so different versions of CURAND may give slightly different
     * numerical values.
     *
     * @param generator - Generator to use
     * @param outputPtr - Pointer to device memory to store CUDA-generated results, or
     *                 Pointer to host memory to store CPU-generated results
     * @param n - Number of doubles to generate
     * @param mean - Mean of normal distribution
     * @param stddev - Standard deviation of normal distribution
     *
     * @return
     * 
     * CURAND_STATUS_NOT_INITIALIZED if the generator was never created 
     * CURAND_STATUS_PREEXISTING_FAILURE if there was an existing error from
     *    a previous kernel launch 
     * CURAND_STATUS_LAUNCH_FAILURE if the kernel launch failed for any reason 
     * CURAND_STATUS_LENGTH_NOT_MULTIPLE if the number of output samples is
     *    not a multiple of the quasirandom dimension, or is not a multiple
     *    of two for pseudorandom generators 
     * CURAND_STATUS_DOUBLE_PRECISION_REQUIRED if the GPU does not support double precision 
     * CURAND_STATUS_SUCCESS if the results were generated successfully 
     * 
*/ public static int curandGenerateLogNormalDouble(curandGenerator generator, Pointer outputPtr, long n, double mean, double stddev) { return checkResult(curandGenerateLogNormalDoubleNative(generator, outputPtr, n, mean, stddev)); } private native static int curandGenerateLogNormalDoubleNative(curandGenerator generator, Pointer outputPtr, long n, double mean, double stddev); /** *
     * Construct the histogram array for a Poisson distribution.
     *
     * Construct the histogram array for the Poisson distribution with lambda lambda.
     * For lambda greater than 2000, an approximation with a normal distribution is used.
     *
     * @param lambda - lambda for the Poisson distribution
     * @param discrete_distribution - pointer to the histogram in device memory
     *
     * @return
     * - CURAND_STATUS_ALLOCATION_FAILED if memory could not be allocated 
     * - CURAND_STATUS_DOUBLE_PRECISION_REQUIRED if the GPU does not support double precision 
     * - CURAND_STATUS_INITIALIZATION_FAILED if there was a problem setting up the GPU 
     * - CURAND_STATUS_PREEXISTING_FAILURE if there was an existing error from
     *    a previous kernel launch 
     * - CURAND_STATUS_OUT_OF_RANGE if lambda is non-positive or greater than 400,000 
     * - CURAND_STATUS_SUCCESS if the histogram were generated successfully 
     * 
* (Note: This function actually belongs to the device API of CURAND, * and may not be used sensibly from Java) */ public static int curandCreatePoissonDistribution(double lambda, curandDiscreteDistribution discrete_distribution) { return checkResult(curandCreatePoissonDistributionNative(lambda, discrete_distribution)); } private static native int curandCreatePoissonDistributionNative(double lambda, curandDiscreteDistribution discrete_distribution); /** *
     * Destroy the histogram array for a discrete distribution (e.g. Poisson).
     *
     * Destroy the histogram array for a discrete distribution created by curandCreatePoissonDistribution.
     *
     * @param discrete_distribution - pointer to device memory where the histogram is stored
     * @return
     * - CURAND_STATUS_NOT_INITIALIZED if the histogram was never created
     * - CURAND_STATUS_SUCCESS if the histogram was destroyed successfully
     * 
* (Note: This function actually belongs to the device API of CURAND, * and may not be used sensibly from Java) */ public static int curandDestroyDistribution(curandDiscreteDistribution discrete_distribution) { return checkResult(curandDestroyDistributionNative(discrete_distribution)); } private static native int curandDestroyDistributionNative(curandDiscreteDistribution discrete_distribution); /** *
     * Generate Poisson-distributed unsigned ints.
     *
     * Use generator to generate n unsigned int results into device memory at
     * outputPtr.  The device memory must have been previously allocated and must be
     * large enough to hold all the results.  Launches are done with the stream
     * set using ::curandSetStream(), or the null stream if no stream has been set.
     *
     * Results are 32-bit unsigned int point values with Poisson distribution, 
     * with lambda lambda.
     *
     * @param generator - Generator to use
     * @param outputPtr - Pointer to device memory to store CUDA-generated results, or
     *                 Pointer to host memory to store CPU-generated results
     * @param n - Number of unsigned ints to generate
     * @param lambda - lambda for the Poisson distribution
     *
     * @return
     * - CURAND_STATUS_NOT_INITIALIZED if the generator was never created 
     * - CURAND_STATUS_PREEXISTING_FAILURE if there was an existing error from
     *    a previous kernel launch 
     * - CURAND_STATUS_LAUNCH_FAILURE if the kernel launch failed for any reason 
     * - CURAND_STATUS_LENGTH_NOT_MULTIPLE if the number of output samples is
     *    not a multiple of the quasirandom dimension
     * - CURAND_STATUS_DOUBLE_PRECISION_REQUIRED if the GPU or sm does not support double precision 
     * - CURAND_STATUS_OUT_OF_RANGE if lambda is non-positive or greater than 400,000 
     * - CURAND_STATUS_SUCCESS if the results were generated successfully 
     * 
*/ public static int curandGeneratePoisson(curandGenerator generator, Pointer outputPtr, long n, double lambda) { return checkResult(curandGeneratePoissonNative(generator, outputPtr, n, lambda)); } private static native int curandGeneratePoissonNative(curandGenerator generator, Pointer outputPtr, long n, double lambda); /** *
     * Setup starting states.
     *
     * Generate the starting state of the generator.  This function is
     * automatically called by generation functions such as
     * ::curandGenerate() and ::curandGenerateUniform().
     * It can be called manually for performance testing reasons to separate
     * timings for starting state generation and random number generation.
     *
     * @param generator - Generator to update
     *
     * @return
     * 
     * CURAND_STATUS_NOT_INITIALIZED if the generator was never created 
     * CURAND_STATUS_PREEXISTING_FAILURE if there was an existing error from 
     *     a previous kernel launch 
     * CURAND_STATUS_LAUNCH_FAILURE if the kernel launch failed for any reason 
     * CURAND_STATUS_SUCCESS if the seeds were generated successfully 
     * 
*/ public static int curandGenerateSeeds(curandGenerator generator) { return checkResult(curandGenerateSeedsNative(generator)); } private native static int curandGenerateSeedsNative(curandGenerator generator); /** *
     * Get direction vectors for 32-bit quasirandom number generation.
     *
     * Get a pointer to an array of direction vectors that can be used
     * for quasirandom number generation.  The resulting pointer will
     * reference an array of direction vectors in host memory.
     *
     * The array contains vectors for many dimensions.  Each dimension
     * has 32 vectors.  Each individual vector is an unsigned int.
     *
     * Legal values for set are:
     * - CURAND_DIRECTION_VECTORS_32_JOEKUO6 (20,000 dimensions)
     * - CURAND_SCRAMBLED_DIRECTION_VECTORS_32_JOEKUO6 (20,000 dimensions)
     *
     * @param vectors - Address of pointer in which to return direction vectors
     * @param set - Which set of direction vectors to use
     *
     * @return
     * 
     * CURAND_STATUS_OUT_OF_RANGE if the choice of set is invalid 
     * CURAND_STATUS_SUCCESS if the pointer was set successfully 
     * 
*/ public static int curandGetDirectionVectors32(int[][][] vectors, int set) { return checkResult(curandGetDirectionVectors32Native(vectors, set)); } private native static int curandGetDirectionVectors32Native(int[][][] vectors, int set); /** *
     * Get scramble constants for 32-bit scrambled Sobol' .
     *
     * Get a pointer to an array of scramble constants that can be used
     * for quasirandom number generation.  The resulting pointer will
     * reference an array of unsinged ints in host memory.
     *
     * The array contains constants for many dimensions.  Each dimension
     * has a single unsigned int constant.
     *
     * @param constants - Address of pointer in which to return scramble constants
     *
     * @return
     * 
     * CURAND_STATUS_SUCCESS if the pointer was set successfully 
     * 
*/ public static int curandGetScrambleConstants32(int[][] constants) { return checkResult(curandGetScrambleConstants32Native(constants)); } private native static int curandGetScrambleConstants32Native(int[][] constants); /** *
     * Get direction vectors for 64-bit quasirandom number generation.
     *
     * Get a pointer to an array of direction vectors that can be used
     * for quasirandom number generation.  The resulting pointer will
     * reference an array of direction vectors in host memory.
     *
     * The array contains vectors for many dimensions.  Each dimension
     * has 64 vectors.  Each individual vector is an unsigned long long.
     *
     * Legal values for set are:
     * - CURAND_DIRECTION_VECTORS_64_JOEKUO6 (20,000 dimensions)
     * - CURAND_SCRAMBLED_DIRECTION_VECTORS_64_JOEKUO6 (20,000 dimensions)
     *
     * @param vectors - Address of pointer in which to return direction vectors
     * @param set - Which set of direction vectors to use
     *
     * @return
     * 
     * CURAND_STATUS_OUT_OF_RANGE if the choice of set is invalid 
     * CURAND_STATUS_SUCCESS if the pointer was set successfully 
     * 
*/ public static int curandGetDirectionVectors64(long[][][] vectors, int set) { return checkResult(curandGetDirectionVectors64Native(vectors, set)); } private native static int curandGetDirectionVectors64Native(long[][][] vectors, int set); /** *
     * Get scramble constants for 64-bit scrambled Sobol' .
     *
     * Get a pointer to an array of scramble constants that can be used
     * for quasirandom number generation.  The resulting pointer will
     * reference an array of unsinged long longs in host memory.
     *
     * The array contains constants for many dimensions.  Each dimension
     * has a single unsigned long long constant.
     *
     * @param constants - Address of pointer in which to return scramble constants
     *
     * @return
     * 
     * CURAND_STATUS_SUCCESS if the pointer was set successfully 
     * 
*/ public static int curandGetScrambleConstants64(long[][] constants) { return checkResult(curandGetScrambleConstants64Native(constants)); } private native static int curandGetScrambleConstants64Native(long[][] constants); }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy