3 votos

Cómo simular un CIR proceso de uso de GPU y Matlab

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?

2voto

MikeF Puntos 11

Usted debe escribir algunas funciones del kernel en CUDA (Nvidia idioma) para el código de matlab. Arrayfun es bastante restrictiva y no es apropiado. Mira este link http://fr.mathworks.com/help/distcomp/run-cuda-or-ptx-code-on-gpu.html para obtener más detalles acerca de matlab y la computación en paralelo.

1voto

Stefan Puntos 11

Hay algunas restricciones para el uso de arrayfun. Usted puede leer las restricciones aquí.

A juzgar por el error, no se pueden utilizar los índices de la manera que son.

Usted probablemente tendrá que crear separado de la GPU matrices de $ V_{t+1} $ y $V_t$.

Le sugiero que encontrar ejemplos similares en Matlab del sitio web y tratar de replicar su funcionalidad. Aquí está un artículo con información sobre cómo programar el segundo orden de la ecuación de onda en una GPU con Matlab.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X