GPU Parallelization: Kernel for Value Function Iteration

조회 수: 4 (최근 30일)
toto habab
toto habab 2019년 11월 28일
편집: Walter Roberson 2025년 8월 15일
Dear all,
I'd like to write a matlab function that does Value Function Iteration on GPU.
What I have in mind is very similar to this code written in Julia:
I'm really struggling in writing the kernel for the GPU.
In the Julia-Code, doing so looks like this:
# Write kernel for GPU manually:
gpu_call(grid, (grid, V, policy, z, P, Float32(alpha), Float32(beta), Float32(delta), Float32(sigma), UInt32(SIZE_GRID), UInt32(SIZE_Z)))
do state, grid, V, policy, z, P, alpha, beta, delta, sigma, SIZE_GRID, SIZE_Z
# Each kernel executes for one value of the capital grid:
idx = @linearidx grid
What would be the equivalent functions in matlab for
gpu_call( )
and
__ = @linearidx __
The only thing similair to gpu_call that I found was:
KERN = parallel.gpu.CUDAKernel(PTXFILE,CPROTO)
But this requires code based on C for CUDA or OpenCL, if I understand it correctly. I am unable to deal with such code.
I have the parallel computing toolkit installed.
My very rough sketch of the function (without the part I don't get) looks like this:
function [V,pol] = VFI_own_gpu_attempt(alpha,beta,delta,eta,z_grid,k_grid,pi_z,tol)
size_k_grid = size(k_grid,1);
size_z_grid = length(z_grid);
k_grid_G = gpuArray(k_grid);
z_grid_G = gpuArray(z_grid);
pi_z_G = gpuArray(pi_z);
V0 = ones(size_k_grid,size_z_grid,'gpuArrays');
V = ones(size_k_grid,size_z_grid,'gpuArrays');
pol = zeros(size_k_grid,size_z_grid,'gpuArrays');
while abs(V-V0)>tol
V0 = V;
% write kernel
%gpu_call(...)
% each kernel executes for one value of the capital grid
%idx = @linearidx grid
for i_z = 1:size_z_grid
F = -Inf;
pol_i = uint(1)
for i_k = 1_size_k_grid
c = z_grid_G(i_z)*k_grid_G(idx)^alpha + (1-delta)*k_grid_G(idx) - k_grid_G(i_k)M
if c>0
F0 = ((c)^(1-eta)-1)/(1-eta)
for j = 1:size_z_grid
F1 = F0 + beta*pi_z_G(i_z,j)*V(i_k,j);
end
end
if F1 > F
F = F1;
pol_i = uint64(i_k);
end
end
V(idx,i_z) = F;
pol(idx,i_z) = pol_i;
end
Thanks for any help, tips or advice! :)

답변 (1개)

Alessandro
Alessandro 2025년 8월 15일
편집: Walter Roberson 2025년 8월 15일
You can try using the VFI toolkit, which uses gpu parallelization in Matlab.

카테고리

Help CenterFile Exchange에서 Fractals에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by