Skip to content
Snippets Groups Projects
tnlMIC.h 4.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • Vít Hanousek's avatar
    Vít Hanousek committed
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    
    /* 
     * File:   tnlMIC.h
     * Author: hanouvit
     *
     * Created on 18. dubna 2016, 12:38
     */
    
    #include <iostream>
    #include <core/tnlString.h>
    #include <core/tnlDevice.h>
    #include <core/tnlDevice_Callable.h>
    
    #include <string.h>
    
    Vít Hanousek's avatar
    Vít Hanousek committed
    
    
    #ifndef TNLMIC_H
    #define TNLMIC_H
    
    #define ALLOC alloc_if(1) //naalokuj promenou na zacatku offload  bloku -- default
    #define FREE free_if(1) // smaz promenou na konci offload bloku -- default
    #define RETAIN free_if(0) //nesmaz promenou na konci bloku
    #define REUSE alloc_if(0) //nealokuj proměnnou na zacatku
    
    
    //useful if you have an adress to MIC memory
    template< typename Type >
    struct satanHider{
        Type *pointer;
    };
    
    
    template <unsigned int VELIKOST>
    struct satanstruct{
    	uint8_t data[VELIKOST];
    };
    
    #define TNLMICSTRUCT(bb,typ) satanstruct<sizeof(typ)> s ## bb; \
                                 memcpy((void*)& s ## bb,(void*)& bb,sizeof(typ));
    #define TNLMICSTRUCTOFF(bb,typ) s ## bb
    #define TNLMICSTRUCTUSE(bb,typ) typ * kernel ## bb = (typ*) &s ## bb;
    #define TNLMICSTRUCTALLOC(bb,typ) typ * kernel ## bb = (typ*) malloc (sizeof(typ)); \
                                    memcpy((void*)kernel ## bb,(void*) & s ## bb, sizeof(typ));
    
    
    #define TNLMICHIDE(bb,typ) uint8_t * u ## bb=(uint8_t *)&bb; \
                               satanHider<typ> kernel ## bb;
    #define TNLMICHIDEALLOCOFF(bb,typ) in(u ## bb:length(sizeof(typ))) out(kernel ## bb)
    #define TNLMICHIDEALLOC(bb,typ) kernel ## bb.pointer=(typ*)malloc(sizeof(typ)); \
                                    memcpy((void*)kernel ## bb.pointer,(void*)u ## bb,sizeof(typ));
    #define TNLMICHIDEFREEOFF(bb,typ) in(kernel ## bb)
    #define TNLMICHIDEFREE(bb,typ) free((void*)kernel ## bb.pointer);
    
    Vít Hanousek's avatar
    Vít Hanousek committed
    
    class tnlMIC
    {
       public:
    
           
            enum { DeviceType = tnlMICDevice };
            
            
    
    Vít Hanousek's avatar
    Vít Hanousek committed
           //useful debuging -- but produce warning
           __device_callable__ static inline void CheckMIC(void)
           {
                #ifdef __MIC__
                        std::cout<<"ON MIC"<<std::endl;
                #else
                        std::cout<<"ON CPU" <<std::endl;
                #endif
            }
           
           
            static tnlString getDeviceType()
            {
                return tnlString( "tnlMIC" );
            }
    
             __device_callable__ static inline tnlDeviceEnum getDevice()
             {
                 return tnlMICDevice;
             }
    
             
             //useful function to pass object in mělký copy onto MIC. To adress the object use the base adress of object
            //this function use MIC adress translation tables.
            
            /*template <typename TYP>
            static
            TYP * passToDevice(TYP &objektCPU)
            {
                    uint8_t * uk=(uint8_t *)&objektCPU; 
                    satanHider<TYP> ret;
                    
                    #pragma offload target(mic) in(uk:length(sizeof(TYP)) ALLOC RETAIN) out(ret)
                    {
                        ret.pointer=(TYP*)&uk;
                    }
                    return ret.pointer;
            }
             
            template <typename TYP>
            static
            void freeFromDevice(TYP *objektCPU)
            {
                    #pragma offload target(mic) in(objektCPU:length(0) REUSE FREE)
                    {
                    }
            }
    
             */
             
            template <typename TYP>
            static
            TYP * passToDevice(TYP &objektCPU)
            {
                    uint8_t * uk=(uint8_t *)&objektCPU; 
                    satanHider<TYP> ret;
                    
                    #pragma offload target(mic) in(uk:length(sizeof(TYP))) out(ret)
                    {
                        ret.pointer=(TYP*)malloc(sizeof(TYP));
                        memcpy((void*)ret.pointer,(void*)uk,sizeof(TYP));
                    }
                    return ret.pointer;
    
                    
                    cout << "Někdo mně volá :-D" <<endl;
    
            }
            
            template <typename TYP>
            static
            void freeFromDevice(TYP *objektMIC)
            {
                satanHider<TYP> ptr;
                ptr.pointer=objektMIC;
                #pragma offload target(mic) in(ptr)
                {
                    free((void*)ptr.pointer);
                }
            }
    
    Vít Hanousek's avatar
    Vít Hanousek committed
    #endif /* TNLMIC_H */