#include <sys/time.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include "JikanDepths.h"

#ifdef INCLUDE_OPEN_MP
    #include "omp.h"
#endif

using namespace std;

#ifdef INCLUDE_GPU_TIMER
    void Jikan::StartCUDASync(const string& name)
    {
    	cudaEventRecord ((this->Events)[name].gpu_start);
    }

    void Jikan::EndCUDASync(const string& name)
    {
        cudaEventRecord((this->Events)[name].gpu_end);
    	cudaEventSynchronize((this->Events)[name].gpu_end);
    }

void Jikan::CUDAGetTime(const string& name, const int cont_mode_t)
{
    float GPUtime = 0.0;
    cudaEventElapsedTime(&GPUtime, (this->Events)[name].gpu_start, (this->Events)[name].gpu_end );
    GPUtime *= 1e-3;
    (this->Events)[name].elapsed_time += GPUtime;
    (this->Events)[name].ContiniousTime += GPUtime;

    if(cont_mode_t == 0)
    {
        (this->Events)[name].count ++;
    }

    #ifdef SAVE_TIME_SERIES
        if(cont_mode_t == 0)
        { 
            (this->Events)[name].time_series.push_back((this->Events)[name].ContiniousTime);
            (this->Events)[name].ContiniousTime = 0.0;
        }
    #endif
}