蒙特卡羅
如何使用 GPU 和 Matlab 模擬 CIR 過程
我正在嘗試使用 Matlab 和我的 GPU 來模擬 CIR 過程以提高效率。由於離散化的遞歸性質,目前我遇到了一些實現問題。
我目前使用的 sheme 是簡單的歐拉
$$ V_t \approx \max {V_{t-1} + \kappa_V(\bar{V}-V_{t-1})\Delta h + \sigma_V\sqrt{V_{t-1}}\sqrt{\Delta h}\mathcal{N}(0,1),0}. $$ 要在 GPU 上正確模擬,我需要一些幫助功能,如本Matlab 指南中所述
function [ V ] = simulation_fun( V, W, N, h, kappa_V, V_bar, sigma_V) t=1; while t < N % a path has N steps V(:,t+1)=max(V(:,t)+kappa_V*(V_bar-V(:,t))*h + sigma_V*sqrt(V(:,t))*sqrt(h)*W(:,t),0); t=t+1; end end
比我定義模型參數
N=1000; M=1000; % Number of MC simulations h=0.01; kappa_V=1; V_bar=1; sigma_V=0.2; V=gpuArray(ones(M,N)); W=gpuArray.randn(M,N);
之後我通過呼叫模擬
V = arrayfun(@simulation_fun,V, W, N, h, kappa_V, V_bar, sigma_V);
並得到以下錯誤
Error using gpuArray/arrayfun Indexing is not supported. error at line: 3 .
但是,如果我使用
V = simulation_fun(V, W, N, h, kappa_V, V_bar, sigma_V);
它可以工作,但模擬比僅使用 CPU 慢大約 2.5 倍。
有誰知道如何正確實現模擬?
您應該為您的 matlab 程式碼用 CUDA(Nvidia 語言)編寫一些核心函式。Arrayfun 非常嚴格,不合適。查看此連結http://fr.mathworks.com/help/distcomp/run-cuda-or-ptx-code-on-gpu.html了解有關 matlab 和並行計算的更多詳細資訊。
使用 arrayfun 有一些限制。 您可以在此處閱讀限制。
從錯誤來看,您不能像現在這樣使用索引。
您可能必須為 $ V_{t+1} $ 和 $ V_t $ .
我建議您在 Matlab 的網站上找到類似的範例並嘗試複製其功能。這是一篇有關如何使用 Matlab 在 GPU 上編寫二階波動方程的資訊的文章。