Skip to content
Snippets Groups Projects
Jikan.cu 1.96 KiB
Newer Older
  • Learn to ignore specific revisions
  • 数学の武士's avatar
    数学の武士 committed
    #include <sys/time.h>
    #include <cuda.h>
    #include <cuda_runtime.h>
    #include "Jikan.h"
    #include "Jikan-config.h"
    
    #ifdef INCLUDE_OPEN_MP
        #include "omp.h"
    #endif
    
    using namespace std;
    
    void Jikan::cuda_Jikan_start(const string& name)
    {
    #ifdef INCLUDE_OPEN_MP
        #pragma omp master
        {
    #endif
        bool ExistFlag;
        ExistFlag = this->ifContains(name);
    
        if(ExistFlag == false)
        {
            (this->Events)[name] = EventData(name);
            this->EventType["CUDA events"].insert(name);
            (this->Events)[name].ifCUDA = 1;
    
            cudaEventCreate(&(((this->Events)[name]).gpu_start));
            cudaEventCreate(&(((this->Events)[name]).gpu_end));
        }
        
        (this->Events)[name].ifStart = true;
    	cudaEventRecord ((this->Events)[name].gpu_start);
    #ifdef INCLUDE_OPEN_MP
        }
    #endif
    }
    
    void Jikan::cuda_Jikan_end(const string& name)
    {
    #ifdef INCLUDE_OPEN_MP
        #pragma omp master
        {
    #endif
        bool ExistFlag, ifStart;
        ExistFlag = this->ifContains(name);
        ifStart = (this->Events)[name].ifStart;
    
        if((!ExistFlag) || (!ifStart))
            return;
    
        float GPUtime = 0.0;
    
        cudaEventRecord((this->Events)[name].gpu_end);
    	cudaEventSynchronize((this->Events)[name].gpu_end);
        cudaEventElapsedTime(&GPUtime, (this->Events)[name].gpu_start, (this->Events)[name].gpu_end); //milliseconds 
    
        GPUtime *= 1e-3;
        (this->Events)[name].elapsed_time += GPUtime;
        (this->Events)[name].count ++;
    
    #ifdef SAVE_TIME_SERIES
        (this->Events)[name].time_series.push_back(GPUtime);
    #endif
    
        (this->Events)[name].ifStart = false;
    
    #ifdef INCLUDE_OPEN_MP
        }
    #endif
    }
    
    void Jikan::FreeCudaEvents()
    {
    #ifdef INCLUDE_OPEN_MP
        #pragma omp master
        {
    #endif
    
        map<string, EventData>::iterator it;
        for (it = this->Events.begin(); it!=this->Events.end(); ++it)
        {
            if((it->second).ifCUDA == 1)
            { 
                cudaEventDestroy((it->second).gpu_start);
                cudaEventDestroy((it->second).gpu_end);
            }
        }
    
    #ifdef INCLUDE_OPEN_MP
        }
    #endif
    }