Estoy tratando de simular un CIR proceso de uso de Matlab y mi GPU para la eficiencia. En el momento me encuentro con algunos problemas de implementación debido a la naturaleza recursiva de la discretización.
El sheme uso actualmente es la simple Euler
$$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\}. $$
Para la adecuada simular en la GPU necesito un poco de ayuda de su función, como lo descrito en esta guía de 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
Que yo definir los parámetros del modelo
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);
Después de que me llame la simulación a través de
V = arrayfun(@simulation_fun,V, W, N, h, kappa_V, V_bar, sigma_V);
y obtener el siguiente error
Error using gpuArray/arrayfun
Indexing is not supported. error at line: 3 .
Sin embargo, si uso
V = simulation_fun(V, W, N, h, kappa_V, V_bar, sigma_V);
funciona, pero la simulación es de aproximadamente 2,5 veces más lento que el sólo uso de la CPU.
¿Alguien sabe cómo implementar correctamente la simulación?