Hi,
I am trying to accelerate some simulation code I have using my GPU. I am trying to do this by first creating a bunch of gpuArrays to hold the relevant variables and then passing these arrays to a function (updateNet) which I want to turn into a mex file using GPU Coder. For different simulations, the gpuArrays will be different sizes but for a particular simulation they will all be the same size. Since GPU Coder does not support variable sized gpuArray inputs I have written a function that takes as input an integer and then specifies that as the size of all of the gpuArray inputs for this call to codegen.
function [] = compile_easySim(N)cfg = coder.gpuConfig('mex');cfg.GpuConfig.CompilerFlags = '--fmad=false';cfg.GenerateReport = true;ARGS = cell(23,1);ARGS{1} = coder.typeof(gpuArray(single(0)),[N 1],[0 0]); % V (membrane Voltage)
ARGS{2} = coder.typeof(gpuArray(single(0)),[N 1],[0 0]); % Gref (refractory conductance)
ARGS{3} = coder.typeof(gpuArray(single(0)),[N 1],[0 0]); % dGref (refractory conductance change on spike)
ARGS{4} = coder.typeof(gpuArray(single(0)),[N 1],[0 0]); % tau_ref (refractory time_constant)
ARGS{5} = coder.typeof(gpuArray(single(0)),[N 1],[0 0]); % Vth (spike threshold)
ARGS{6} = coder.typeof(gpuArray(single(0)),[N 1],[0 0]); % VsynE (excitatory synaptic reversal potential)
ARGS{7} = coder.typeof(gpuArray(single(0)),[N 1],[0 0]); % VsynI (inhibitory synaptic reversal potential)
ARGS{8} = coder.typeof(gpuArray(single(0)),[N 1],[0 0]); % GsynE (total excitatory synaptic conductance)
ARGS{9} = coder.typeof(gpuArray(single(0)),[N 1],[0 0]); % GsynI (total inhibitory synaptic conductance)
ARGS{10} = coder.typeof(gpuArray(single(0)),[N 1], [0 0]); % maxGsynE
ARGS{11} = coder.typeof(gpuArray(single(0)),[N 1], [0 0]); % maxGsynI
ARGS{12} = coder.typeof(gpuArray(single(0)),[N N],[0 0]); % dGsyn (synaptic strength matrix)
ARGS{13} = coder.typeof(gpuArray(single(0)),[N 1],[0 0]); % tau_synE (excitatory synaptic decay time constant)
ARGS{14} = coder.typeof(gpuArray(single(0)),[N 1],[0 0]); % tau_synI (inhibitory synaptic decay time constant)
ARGS{15} = coder.typeof(gpuArray(single(0)),[N 1],[0 0]); % Cm (membrane capacitance)
ARGS{16} = coder.typeof(gpuArray(single(0)),[N 1],[0 0]); % Gl (leak conductance)
ARGS{17} = coder.typeof(gpuArray(single(0)),[N 1],[0 0]); % El (leak reversal potential)
ARGS{18} = coder.typeof(gpuArray(single(0)),[N 1],[0 0]); % Ek
ARGS{19} = coder.typeof(gpuArray(single(0)),[N 1],[0 0]); % dth
ARGS{20} = coder.typeof(gpuArray(single(0)),[N 1],[0 0]); % Iapp
ARGS{21} = coder.typeof(single(0),[1],[0]); % dt
ARGS{22} = coder.typeof(gpuArray(false),[N 1],[0 0]); % ecells
ARGS{23} = coder.typeof(gpuArray(false),[N 1],[0 0]); % icells
codegen updateNet -args ARGS -nargout 5
However, when I do this I get the following error:
Use of CODER.TYPEOF to represent GPU inputs is supported only with GPU Coder.Use help codegen for more information on using this command.
This confuses me since I thought I was using GPU Coder. Does GPU Coder only refer to the app GUI where you must manually specify each input?
For reference the output of coder.checkGpuInstall is:
coder.checkGpuInstallCompatible GPU : PASSED CUDA Environment : PASSED Runtime : PASSED cuFFT : PASSED cuSOLVER : PASSED cuBLAS : PASSED cuDNN Environment : FAILED (Unable to find the 'NVIDIA_CUDNN' environment variable. Set 'NVIDIA_CUDNN' to point to the root directory of a NVIDIA cuDNN installation.)Basic Code Generation : PASSED Basic Code Execution : PASSED ans = struct with fields: gpu: 1 cuda: 1 cudnn: 0 tensorrt: 0 basiccodegen: 1 basiccodeexec: 1 deepcodegen: 0 deepcodeexec: 0 tensorrtdatatype: 0 profiling: 0
The only thing that fails is cuDNN but since I'm not trying to do deep learning this shouldn't cause problems.
Where am I going wrong? Thanks!
Best Answer