亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? montecarlo_kernel.cuh

?? 采用GPU通用計算API(CUDA)實現蒙特卡羅方程。
?? CUH
字號:
/*
 * Copyright 1993-2007 NVIDIA Corporation.  All rights reserved.
 *
 * NOTICE TO USER:
 *
 * This source code is subject to NVIDIA ownership rights under U.S. and
 * international Copyright laws.  Users and possessors of this source code
 * are hereby granted a nonexclusive, royalty-free license to use this code
 * in individual and commercial software.
 *
 * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE
 * CODE FOR ANY PURPOSE.  IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR
 * IMPLIED WARRANTY OF ANY KIND.  NVIDIA DISCLAIMS ALL WARRANTIES WITH
 * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
 * 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 THIS SOURCE CODE.
 *
 * U.S. Government End Users.   This source code is 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
 * source code with only those rights set forth herein.
 *
 * Any use of this source code 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 MONTECARLO_KERNEL_CUH
#define MONTECARLO_KERNEL_CUH



////////////////////////////////////////////////////////////////////////////////
// Global types
////////////////////////////////////////////////////////////////////////////////
#include <stdlib.h>
#include <stdio.h>
#include <cutil.h>
#include "realtype.h"
#include "MonteCarlo_common.h"



////////////////////////////////////////////////////////////////////////////////
// Helper reduction template
// Please see the "reduction" CUDA SDK sample for more information
////////////////////////////////////////////////////////////////////////////////
#include "MonteCarlo_reduction.cuh"



////////////////////////////////////////////////////////////////////////////////
// Internal GPU-side data structures
////////////////////////////////////////////////////////////////////////////////
#define MAX_OPTIONS 2048

//Preprocessed input option data
typedef struct{
    real S;
    real X;
    real MuByT;
    real VBySqrtT;
} __TOptionData;
static __device__ __constant__ __TOptionData d_OptionData[MAX_OPTIONS];

//GPU outputs before CPU postprocessing
typedef struct{
    real Expected;
    real Confidence;
} __TOptionValue;
static __device__ __TOptionValue d_CallValue[MAX_OPTIONS];



////////////////////////////////////////////////////////////////////////////////
// Overloaded shortcut payoff functions for different precision modes
////////////////////////////////////////////////////////////////////////////////
#ifndef DOUBLE_PRECISION
__device__ inline float endCallValue(float S, float X, float r, float MuByT, float VBySqrtT){
    float callValue = S * __expf(MuByT + VBySqrtT * r) - X;
    return (callValue > 0) ? callValue : 0;
}
#else
__device__ inline double endCallValue(double S, double X, double r, double MuByT, double VBySqrtT){
    double callValue = S * exp(MuByT + VBySqrtT * r) - X;
    return (callValue > 0) ? callValue : 0;
}
#endif


////////////////////////////////////////////////////////////////////////////////
// This kernel computes partial integrals over all paths using a multiple thread
// blocks per option. It is used when a single thread block per option would not
// be enough to keep the GPU busy. Execution of this kernel is followed by
// MonteCarloReduce() to get the complete integral for each option.
////////////////////////////////////////////////////////////////////////////////
#define THREAD_N 256

static __global__ void MonteCarloKernel(
    __TOptionValue *d_Buffer,
    float *d_Samples,
    int pathN
){
    const int optionIndex = blockIdx.y;

    const real        S = d_OptionData[optionIndex].S;
    const real        X = d_OptionData[optionIndex].X;
    const real    MuByT = d_OptionData[optionIndex].MuByT;
    const real VBySqrtT = d_OptionData[optionIndex].VBySqrtT;

    //One thread per partial integral
    const int   iSum = blockIdx.x * blockDim.x + threadIdx.x;
    const int accumN = blockDim.x * gridDim.x;

    //Cycle through the entire samples array:
    //derive end stock price for each path
    //accumulate into intermediate global memory array
    __TOptionValue sumCall = {0, 0};
    for(int i = iSum; i < pathN; i += accumN){
        real              r = d_Samples[i];
        real      callValue = endCallValue(S, X, r, MuByT, VBySqrtT);
        sumCall.Expected   += callValue;
        sumCall.Confidence += callValue * callValue;
    }
    d_Buffer[optionIndex * accumN + iSum] = sumCall;
}



////////////////////////////////////////////////////////////////////////////////
// This kernel computes the integral over all paths using a single thread block
// per option. It is fastest when the number of thread blocks times the work per
// block is high enough to keep the GPU busy. When this is not the case, using
// more blocks per option is faster, so we use MonteCarloKernel() plus
// MonteCarloReduce() instead.
////////////////////////////////////////////////////////////////////////////////
static __global__ void MonteCarloOneBlockPerOption(
    float *d_Samples,
    int pathN
){
    const int SUM_N = THREAD_N;
    __shared__ real s_SumCall[SUM_N];
    __shared__ real s_Sum2Call[SUM_N];

    const int optionIndex = blockIdx.x;
    const real        S = d_OptionData[optionIndex].S;
    const real        X = d_OptionData[optionIndex].X;
    const real    MuByT = d_OptionData[optionIndex].MuByT;
    const real VBySqrtT = d_OptionData[optionIndex].VBySqrtT;

    //Cycle through the entire samples array:
    //derive end stock price for each path
    //accumulate partial integrals into intermediate shared memory buffer
    for(int iSum = threadIdx.x; iSum < SUM_N; iSum += blockDim.x){
        __TOptionValue sumCall = {0, 0};
        for(int i = iSum; i < pathN; i += SUM_N){
            real              r = d_Samples[i];
            real      callValue = endCallValue(S, X, r, MuByT, VBySqrtT);
            sumCall.Expected   += callValue;
            sumCall.Confidence += callValue * callValue;
        }
        s_SumCall[iSum]  = sumCall.Expected;
        s_Sum2Call[iSum] = sumCall.Confidence;
    }

    //Reduce shared memory accumulators
    //and write final result to global memory
    sumReduce<real, SUM_N, THREAD_N>(s_SumCall, s_Sum2Call);
    if(threadIdx.x == 0){
        __TOptionValue t = {s_SumCall[0], s_Sum2Call[0]};
        d_CallValue[optionIndex] = t;
    }
}



////////////////////////////////////////////////////////////////////////////////
//Finalizing reduction for MonteCarloKernel1()
//Final reduction for each per-option accumulator output
////////////////////////////////////////////////////////////////////////////////
static __global__ void MonteCarloReduce(
    __TOptionValue *d_Buffer,
    int accumN
){
    const int SUM_N = THREAD_N;
    __shared__ real s_SumCall[SUM_N];
    __shared__ real s_Sum2Call[SUM_N];
    __TOptionValue *d_SumBase = &d_Buffer[blockIdx.x * accumN];

    //Reduce global memory accumulators array for current option
    //to a set fitting into shared memory
    for(int iSum = threadIdx.x; iSum < SUM_N; iSum += blockDim.x){
        __TOptionValue sumCall = {0, 0};
        for(int pos = iSum; pos < accumN; pos += SUM_N){
            __TOptionValue    t = d_SumBase[pos];
            sumCall.Expected   += t.Expected;
            sumCall.Confidence += t.Confidence;
        }
        s_SumCall[iSum]  = sumCall.Expected;
        s_Sum2Call[iSum] = sumCall.Confidence;
    }

    //Reduce shared memory accumulators
    //and write final result to global memory
    sumReduce<real, SUM_N, THREAD_N>(s_SumCall, s_Sum2Call);
    if(threadIdx.x == 0){
        __TOptionValue t = {s_SumCall[0], s_Sum2Call[0]};
        d_CallValue[blockIdx.x] = t;
    }
}



////////////////////////////////////////////////////////////////////////////////
// Host-side interface to GPU Monte Carlo
////////////////////////////////////////////////////////////////////////////////
//Allocate internal device memory
static void initMonteCarloGPU(TOptionPlan *plan){
    const int doMultiBlock = (plan->pathN / plan->optionCount) >= 8192;
    if(doMultiBlock){
        const int blocksPerOption = (plan->optionCount < 16) ? 64 : 16;
        const int          accumN = THREAD_N * blocksPerOption;
        CUDA_SAFE_CALL( cudaMalloc(
            (void **)&plan->d_Buffer,
            accumN * plan->optionCount * sizeof(__TOptionValue)
        ) );
    }
}

//Deallocate internal device memory
static void closeMonteCarloGPU(TOptionPlan *plan){
    const int doMultiBlock = (plan->pathN / plan->optionCount) >= 8192;
    if(doMultiBlock) CUDA_SAFE_CALL( cudaFree(plan->d_Buffer) );
}

//Main computations
static void MonteCarloGPU(TOptionPlan *plan){
    __TOptionData h_OptionData[MAX_OPTIONS];
    __TOptionValue h_CallValue[MAX_OPTIONS];

    if(plan->optionCount <= 0 || plan->optionCount > MAX_OPTIONS){
        printf("MonteCarloGPU(): bad option count.\n");
        return;
    }

    for(int i = 0; i < plan->optionCount; i++){
        const double           T = plan->optionData[i].T;
        const double           R = plan->optionData[i].R;
        const double           V = plan->optionData[i].V;
        const double       MuByT = (R - 0.5 * V * V) * T;
        const double    VBySqrtT = V * sqrt(T);
        h_OptionData[i].S        = (real)plan->optionData[i].S;
        h_OptionData[i].X        = (real)plan->optionData[i].X;
        h_OptionData[i].MuByT    = (real)MuByT;
        h_OptionData[i].VBySqrtT = (real)VBySqrtT;
    }

    CUDA_SAFE_CALL( cudaMemcpyToSymbol(
        d_OptionData,
        h_OptionData,
        plan->optionCount * sizeof(__TOptionData)
    ) );

    const int doMultiBlock = (plan->pathN / plan->optionCount) >= 8192;
    if(doMultiBlock){
        const int blocksPerOption = (plan->optionCount < 16) ? 64 : 16;
        const int          accumN = THREAD_N * blocksPerOption;
        const dim3 gridMain(blocksPerOption, plan->optionCount);
        MonteCarloKernel<<<gridMain, THREAD_N>>>(
            (__TOptionValue *)plan->d_Buffer,
            plan->d_Samples,
            plan->pathN
        );
        CUT_CHECK_ERROR("MonteCarloKernel() execution failed\n");
        MonteCarloReduce<<<plan->optionCount, THREAD_N>>>(
            (__TOptionValue *)plan->d_Buffer,
            accumN
        );
        CUT_CHECK_ERROR("MonteCarloReduce() execution failed\n");
    }else{
        MonteCarloOneBlockPerOption<<<plan->optionCount, THREAD_N>>>(
            plan->d_Samples,
            plan->pathN
        );
        CUT_CHECK_ERROR("MonteCarloOneBlockPerOption() execution failed\n");
    }
    CUDA_SAFE_CALL( cudaMemcpyFromSymbol(
        h_CallValue,
        d_CallValue,
        plan->optionCount * sizeof(__TOptionValue)
    ) );

    for(int i = 0; i < plan->optionCount; i++){
        const double    RT = plan->optionData[i].R * plan->optionData[i].T;
        const double   sum = h_CallValue[i].Expected;
        const double  sum2 = h_CallValue[i].Confidence;
        const double pathN = plan->pathN;
        //Derive average from the total sum and discount by riskfree rate 
        plan->callValue[i].Expected = (float)(exp(-RT) * sum / pathN);
        //Standart deviation
        double stdDev = sqrt((pathN * sum2 - sum * sum)/ (pathN * (pathN - 1)));
        //Confidence width; in 95% of all cases theoretical value lies within these borders
        plan->callValue[i].Confidence = (float)(exp(-RT) * 1.96 * stdDev / sqrt(pathN));
    }
}



#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
轻轻草成人在线| 欧美日韩一区在线观看| 在线视频欧美精品| 精品日韩av一区二区| 综合精品久久久| 麻豆久久一区二区| 欧美三级日韩三级国产三级| 国产欧美视频在线观看| 日韩—二三区免费观看av| 99国产精品视频免费观看| 久久综合色婷婷| 日韩电影一区二区三区四区| 色综合亚洲欧洲| 国产精品免费av| 国产剧情在线观看一区二区| 正在播放一区二区| 亚洲在线视频一区| 91丨九色porny丨蝌蚪| 国产亚洲精品资源在线26u| 免费在线观看日韩欧美| 欧美天堂亚洲电影院在线播放| 国产精品免费人成网站| 九九久久精品视频| 日韩午夜激情免费电影| 日韩国产一区二| 欧美精品粉嫩高潮一区二区| 狠狠狠色丁香婷婷综合久久五月| 在线免费一区三区| 一区二区免费在线播放| 99re亚洲国产精品| 成人欧美一区二区三区视频网页| 国产精品18久久久久久久久| 久久久青草青青国产亚洲免观| 老司机精品视频一区二区三区| 欧美日韩国产bt| 午夜精品久久久久久不卡8050| 色哟哟精品一区| 亚洲精品国产第一综合99久久| 99久久精品免费| 亚洲蜜臀av乱码久久精品蜜桃| 91视频免费看| 婷婷夜色潮精品综合在线| 欧美另类久久久品| 精品制服美女丁香| 久久综合九色综合欧美98| 激情五月婷婷综合网| 久久婷婷国产综合精品青草| 国产高清不卡一区二区| 国产精品国产三级国产普通话99| 99久久免费国产| 亚洲一区中文日韩| 欧美一区二区播放| 国产一区二区三区在线看麻豆| 亚洲国产成人一区二区三区| 99re8在线精品视频免费播放| 一区二区在线看| 678五月天丁香亚洲综合网| 久久精品国产成人一区二区三区| 欧美国产一区在线| 在线免费视频一区二区| 久久99精品久久久| 国产精品美女www爽爽爽| 色哟哟国产精品| 奇米888四色在线精品| 国产日韩欧美不卡| 色狠狠综合天天综合综合| 日日夜夜免费精品| 国产日韩欧美电影| 欧美日韩国产乱码电影| 国产精品996| 亚洲国产成人高清精品| 久久综合久久99| 在线一区二区视频| 久久成人久久鬼色| 亚洲免费av在线| 精品国产乱码久久| 欧洲人成人精品| 国产精品亚洲人在线观看| 亚洲一区在线观看免费| 久久亚区不卡日本| 欧美三级电影网站| 成人av网站免费| 麻豆精品一区二区av白丝在线| 亚洲欧洲精品天堂一级| 日韩三级视频中文字幕| 91国偷自产一区二区三区成为亚洲经典 | 国产大陆a不卡| 亚洲一区二区3| 国产精品久久久久久久蜜臀| 日韩欧美中文一区二区| 色综合久久久网| 国产91精品久久久久久久网曝门| 日韩高清在线观看| 亚洲激情男女视频| 亚洲国产激情av| 久久欧美一区二区| 日韩免费观看2025年上映的电影| 欧美性猛片aaaaaaa做受| 成人午夜av影视| 九九精品视频在线看| 日韩av中文在线观看| 亚洲午夜羞羞片| 一区二区三区四区视频精品免费 | 久久久久国产精品麻豆ai换脸| 欧美一卡二卡在线观看| 精品视频免费看| 色94色欧美sute亚洲13| 91美女精品福利| 91亚洲国产成人精品一区二区三 | 日本一区二区三级电影在线观看 | 国产精品自产自拍| 国内欧美视频一区二区 | 精品一区二区三区免费播放| 日本欧美韩国一区三区| 日本在线不卡视频| 免费在线观看精品| 另类调教123区| 国产精品综合一区二区| 成人听书哪个软件好| www.日韩精品| 91美女蜜桃在线| 欧美日韩免费高清一区色橹橹 | 日韩一区二区三区精品视频| 91精品国产91久久综合桃花| 制服视频三区第一页精品| 欧美xxxxx牲另类人与| 亚洲精品一区二区三区香蕉| 国产网红主播福利一区二区| 中文字幕不卡在线观看| 亚洲欧美二区三区| 亚洲二区在线视频| 蜜桃在线一区二区三区| 国产一区91精品张津瑜| av不卡在线播放| 欧美日韩你懂得| www久久精品| 久久国产精品色| 国产一区二区按摩在线观看| 成人免费观看视频| 欧美午夜精品一区二区三区| 制服丝袜国产精品| 国产精品青草久久| 亚洲成av人片| 国产精品一区二区在线观看不卡| 丁香一区二区三区| 欧美性感一区二区三区| 日韩欧美电影一区| ㊣最新国产の精品bt伙计久久| 一个色综合av| 韩国一区二区三区| 91丨九色丨尤物| 日韩午夜精品视频| 亚洲视频资源在线| 久久99国产精品久久| 99久久综合狠狠综合久久| 欧美精品乱码久久久久久按摩 | 欧美色图第一页| 久久伊人蜜桃av一区二区| 一区二区三区日韩欧美| 精品一区二区免费在线观看| 91原创在线视频| 久久久美女毛片| 亚洲自拍偷拍av| 国产99久久精品| 日韩欧美国产三级| 亚洲第一av色| 99这里只有久久精品视频| 日韩一区二区麻豆国产| 亚洲黄色av一区| 国产 欧美在线| 精品嫩草影院久久| 天天操天天干天天综合网| 成人av免费在线| 精品国产人成亚洲区| 亚洲成人在线免费| 91色在线porny| 国产精品污网站| 韩国三级在线一区| 日韩一区二区三区电影在线观看 | 久久精品这里都是精品| 午夜久久福利影院| 日本久久电影网| 中文字幕五月欧美| 大美女一区二区三区| 日韩欧美一级二级三级| 亚洲h动漫在线| 在线国产亚洲欧美| 久久99精品视频| 欧美日韩一区二区不卡| 一区二区成人在线| 91影视在线播放| 亚洲女人的天堂| 91蝌蚪porny成人天涯| 国产精品毛片大码女人| 国产精品88av| 久久亚洲欧美国产精品乐播| 久久99久久精品欧美| 精品国产乱码久久久久久蜜臀 | 亚洲精品高清在线观看| 91在线视频免费观看|