Files
2025-04-02 21:44:17 -07:00

211 lines
7.7 KiB
C

/*
* Copyright 2010-2014 NVIDIA Corporation. All rights reserved.
*
* NOTICE TO LICENSEE:
*
* This source code and/or documentation ("Licensed Deliverables") are
* subject to NVIDIA intellectual property rights under U.S. and
* international Copyright laws.
*
* These Licensed Deliverables contained herein is PROPRIETARY and
* CONFIDENTIAL to NVIDIA and is being provided under the terms and
* conditions of a form of NVIDIA software license agreement by and
* between NVIDIA and Licensee ("License Agreement") or electronically
* accepted by Licensee. Notwithstanding any terms or conditions to
* the contrary in the License Agreement, reproduction or disclosure
* of the Licensed Deliverables to any third party without the express
* written consent of NVIDIA is prohibited.
*
* NOTWITHSTANDING ANY TERMS OR CONDITIONS TO THE CONTRARY IN THE
* LICENSE AGREEMENT, NVIDIA MAKES NO REPRESENTATION ABOUT THE
* SUITABILITY OF THESE LICENSED DELIVERABLES FOR ANY PURPOSE. IT IS
* PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND.
* NVIDIA DISCLAIMS ALL WARRANTIES WITH REGARD TO THESE LICENSED
* DELIVERABLES, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY,
* NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
* NOTWITHSTANDING ANY TERMS OR CONDITIONS TO THE CONTRARY IN THE
* LICENSE AGREEMENT, IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY
* SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY
* DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
* WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
* OF THESE LICENSED DELIVERABLES.
*
* U.S. Government End Users. These Licensed Deliverables are a
* "commercial item" as that term is defined at 48 C.F.R. 2.101 (OCT
* 1995), consisting of "commercial computer software" and "commercial
* computer software documentation" as such terms are used in 48
* C.F.R. 12.212 (SEPT 1995) and is provided to the U.S. Government
* only as a commercial end item. Consistent with 48 C.F.R.12.212 and
* 48 C.F.R. 227.7202-1 through 227.7202-4 (JUNE 1995), all
* U.S. Government End Users acquire the Licensed Deliverables with
* only those rights set forth herein.
*
* Any use of the Licensed Deliverables in individual and commercial
* software must include, in the user documentation and internal
* comments to the code, the above Disclaimer and U.S. Government End
* Users Notice.
*/
#ifndef CURAND_MTGP32_H
#define CURAND_MTGP32_H
/*
* @file curand_mtgp32.h
*
* @brief Mersenne Twister for Graphic Processors (mtgp32), which
* generates 32-bit unsigned integers and single precision floating
* point numbers based on IEEE 754 format.
*
* @author Mutsuo Saito (Hiroshima University)
* @author Makoto Matsumoto (Hiroshima University)
*
*/
/*
* Copyright (c) 2009, 2010 Mutsuo Saito, Makoto Matsumoto and Hiroshima
* University. All rights reserved.
* Copyright (c) 2011 Mutsuo Saito, Makoto Matsumoto, Hiroshima
* University and University of Tokyo. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of the Hiroshima University nor the names of
* its contributors may be used to endorse or promote products
* derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#define MTGPDC_MEXP 11213
#define MTGPDC_N 351
#define MTGPDC_FLOOR_2P 256
#define MTGPDC_CEIL_2P 512
#define MTGPDC_PARAM_TABLE mtgp32dc_params_fast_11213
#define MTGP32_STATE_SIZE 1024
#define MTGP32_STATE_MASK 1023
#define CURAND_NUM_MTGP32_PARAMS 200
#define MEXP 11213
#define THREAD_NUM MTGPDC_FLOOR_2P
#define LARGE_SIZE (THREAD_NUM * 3)
#define TBL_SIZE 16
/**
* \addtogroup DEVICE Device API
*
* @{
*/
/*
* \struct MTGP32_PARAMS_FAST_T
* MTGP32 parameters.
* Some element is redundant to keep structure simple.
*
* \b pos is a pick up position which is selected to have good
* performance on graphic processors. 3 < \b pos < Q, where Q is a
* maximum number such that the size of status array - Q is a power of
* 2. For example, when \b mexp is 44497, size of 32-bit status array
* is 696, and Q is 184, then \b pos is between 4 and 183. This means
* 512 parallel calculations is allowed when \b mexp is 44497.
*
* \b poly_sha1 is SHA1 digest of the characteristic polynomial of
* state transition function. SHA1 is calculated based on printing
* form of the polynomial. This is important when we use parameters
* generated by the dynamic creator which
*
* \b mask This is a mask to make the dimension of state space have
* just Mersenne Prime. This is redundant.
*/
struct mtgp32_params_fast;
struct mtgp32_params_fast {
int mexp; /*< Mersenne exponent. This is redundant. */
int pos; /*< pick up position. */
int sh1; /*< shift value 1. 0 < sh1 < 32. */
int sh2; /*< shift value 2. 0 < sh2 < 32. */
unsigned int tbl[16]; /*< a small matrix. */
unsigned int tmp_tbl[16]; /*< a small matrix for tempering. */
unsigned int flt_tmp_tbl[16]; /*< a small matrix for tempering and
converting to float. */
unsigned int mask; /*< This is a mask for state space */
unsigned char poly_sha1[21]; /*< SHA1 digest */
};
/** \cond UNHIDE_TYPEDEFS */
typedef struct mtgp32_params_fast mtgp32_params_fast_t;
/** \endcond */
/*
* Generator Parameters.
*/
struct mtgp32_kernel_params;
struct mtgp32_kernel_params {
unsigned int pos_tbl[CURAND_NUM_MTGP32_PARAMS];
unsigned int param_tbl[CURAND_NUM_MTGP32_PARAMS][TBL_SIZE];
unsigned int temper_tbl[CURAND_NUM_MTGP32_PARAMS][TBL_SIZE];
unsigned int single_temper_tbl[CURAND_NUM_MTGP32_PARAMS][TBL_SIZE];
unsigned int sh1_tbl[CURAND_NUM_MTGP32_PARAMS];
unsigned int sh2_tbl[CURAND_NUM_MTGP32_PARAMS];
unsigned int mask[1];
};
/** \cond UNHIDE_TYPEDEFS */
typedef struct mtgp32_kernel_params mtgp32_kernel_params_t;
/** \endcond */
/*
* kernel I/O
* This structure must be initialized before first use.
*/
/* MTGP (Mersenne Twister) RNG */
/* This generator uses the Mersenne Twister algorithm of
* http://arxiv.org/abs/1005.4973v2
* Has period 2^11213.
*/
/**
* CURAND MTGP32 state
*/
struct curandStateMtgp32;
struct curandStateMtgp32 {
unsigned int s[MTGP32_STATE_SIZE];
int offset;
int pIdx;
mtgp32_kernel_params_t * k;
};
/*
* CURAND MTGP32 state
*/
/** \cond UNHIDE_TYPEDEFS */
typedef struct curandStateMtgp32 curandStateMtgp32_t;
/** \endcond */
/** @} */
#endif