/***************************************************************************
* BDFn_GPU.cu *
* ------------------- *
* copyright : (C) 2012 by Francisco Naveros *
* email : fnaveros@atc.ugr.es *
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "../../include/integration_method/BDFn_GPU.h"
#include "../../include/integration_method/BDFn_GPU2.h"
#include "../../include/neuron_model/TimeDrivenNeuronModel_GPU2.h"
//Library for CUDA
#include <helper_cuda.h>
const float BDFn_GPU::Coeficient_CPU [7*7]={1.0f,1.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
1.0f,1.0f,0.0f,0.0f,0.0f,0.0f,0.0f,
2.0f/3.0f,4.0f/3.0f,-1.0f/3.0f,0.0f,0.0f,0.0f,0.0f,
6.0f/11.0f,18.0f/11.0f,-9.0f/11.0f,2.0f/11.0f,0.0f,0.0f,0.0f,
12.0f/25.0f,48.0f/25.0f,-36.0f/25.0f,16.0f/25.0f,-3.0f/25.0f,0.0f,0.0f,
60.0f/137.0f,300.0f/137.0f,-300.0f/137.0f,200.0f/137.0f,-75.0f/137.0f,12.0f/137.0f,0.0f,
60.0f/147.0f,360.0f/147.0f,-450.0f/147.0f,400.0f/147.0f,-225.0f/147.0f,72.0f/147.0f,-10.0f/147.0f};
BDFn_GPU::BDFn_GPU(int N_neuronStateVariables, int N_differentialNeuronState, int N_timeDependentNeuronState, int BDFOrder, char * intergrationMethod):IntegrationMethod_GPU(intergrationMethod, N_neuronStateVariables, N_differentialNeuronState, N_timeDependentNeuronState),BDForder(BDFOrder){
}
BDFn_GPU::~BDFn_GPU(){
cudaFree(AuxNeuronState);
cudaFree(AuxNeuronState_p);
cudaFree(AuxNeuronState_p1);
cudaFree(AuxNeuronState_c);
cudaFree(jacnum);
cudaFree(J);
cudaFree(inv_J);
if(BDForder>1){
cudaFree(PreviousNeuronState);
}
cudaFree(D);
cudaFree(state);
cudaFree(AuxNeuronState2);
cudaFree(AuxNeuronState_pos);
cudaFree(AuxNeuronState_neg);
}
__global__ void BDFn_GPU_position(void ** vector, float * element0, float * element1, float * element2, float * element3, float * element4, float * element5, float * element6, float * element7, float * element8, float * element9, int * element10, float * element11, float * element12, float * element13){
vector[0]=element0;
vector[1]=element1;
vector[2]=element2;
vector[3]=element3;
vector[4]=element4;
vector[5]=element5;
vector[6]=element6;
vector[7]=element7;
vector[8]=element8;
vector[9]=element9;
vector[10]=element10;
vector[11]=element11;
vector[12]=element12;
vector[13]=element13;
}
void BDFn_GPU::InitializeMemoryGPU(int N_neurons, int Total_N_thread){
int size=14*sizeof(float *);
cudaMalloc((void **)&Buffer_GPU, size);
cudaMalloc((void**)&AuxNeuronState, N_NeuronStateVariables*Total_N_thread*sizeof(float));
cudaMalloc((void**)&AuxNeuronState_p, N_NeuronStateVariables*Total_N_thread*sizeof(float));
cudaMalloc((void**)&AuxNeuronState_p1, N_NeuronStateVariables*Total_N_thread*sizeof(float));
cudaMalloc((void**)&AuxNeuronState_c, N_NeuronStateVariables*Total_N_thread*sizeof(float));
cudaMalloc((void**)&jacnum, N_DifferentialNeuronState*N_DifferentialNeuronState*Total_N_thread*sizeof(float));
cudaMalloc((void**)&J, N_DifferentialNeuronState*N_DifferentialNeuronState*Total_N_thread*sizeof(float));
cudaMalloc((void**)&inv_J, N_DifferentialNeuronState*N_DifferentialNeuronState*Total_N_thread*sizeof(float));
cudaMalloc((void**)&Coeficient, 7*7*sizeof(float));
cudaMemcpy(Coeficient, Coeficient_CPU, 7*7*sizeof(float), cudaMemcpyHostToDevice);
if(BDForder>1){
cudaMalloc((void**)&PreviousNeuronState, (BDForder-1)*N_neurons*N_DifferentialNeuronState*sizeof(float));
}
cudaMalloc((void**)&D, BDForder*N_neurons*N_DifferentialNeuronState*sizeof(float));
cudaMalloc((void**)&state, N_neurons*sizeof(int));
cudaMemset(state,0,N_neurons*sizeof(int));
cudaMalloc((void**)&AuxNeuronState2, N_NeuronStateVariables*Total_N_thread*sizeof(float));
cudaMalloc((void**)&AuxNeuronState_pos, N_NeuronStateVariables*Total_N_thread*sizeof(float));
cudaMalloc((void**)&AuxNeuronState_neg, N_NeuronStateVariables*Total_N_thread*sizeof(float));
BDFn_GPU_position<<<1,1>>>(Buffer_GPU, AuxNeuronState, AuxNeuronState_p, AuxNeuronState_p1, AuxNeuronState_c, jacnum, J, inv_J, Coeficient, PreviousNeuronState, D, state, AuxNeuronState2, AuxNeuronState_pos, AuxNeuronState_neg);
}