This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Linux/TDA2: TIDL usecase on Linux

Part Number: TDA2

Tool/software: Linux

Hi everyone,

I transfered TIDL usecase from RTOS to Linux. I have a problem with execution because results of execution differ on TIDL algorithm which runs on DSP1. I checked input data in TIDL algorithm link and they are same every time so buffers are communicated correctly between links. However, output buffers are usually different with every new execution. Only when I insert in algorithm link code that print large amount  of data (e.g. print all bytes of neural network structure), sometimes I get correct output. My usecase consists of same links as original TIDL usecase on RTOS. Does anyone have any idea what is happening here?

Regards,
Sasa

  • Hi Sasa,
    Could you please let us know which version of SDK & TIDL version you are using ?

    Regards
    Surya
  • Hi Surya,

    I'm using PROCESSOR SDK 3.03 and TIDL 1.0.0.0.

  • Hi,

    TIDL usecase is not been tested on Linux platform.
    Still you can modify the usecase and run only 1 tidl link on eve and 1 on dsp and dump the input of eve and output of dsp for multiple cases assuming you are using the same input files.
    Can you let us know what all changes have you done to port TIDL usecase on linux?

    Regards,
    Anuj
  • Hi Anuj,
    original usecase link chain is: NullSource(IPU1_0) -> Alg_tidlpreproc (A15) -> Alg_tidl_1 (DSP1) -> Merge (IPU1_0) -> Merge (IPU1_0) -> Null (IPU1_0).

    Ported usecase link chain is: NullSource(A15) -> Alg_tidlpreproc (IPU1_0) -> Alg_tidl_1 (DSP1) -> Merge (IPU1_0) -> Merge (IPU1_0) -> Null (A15).
    As linux is running on A15 it was necessary  to use NullSource and Null links on A15 core because of read and write operations with memory card. Regarding this change we had to replace BspOsal function calls with OSA function calls in usecase.We had no changes in tidlPreproc and tidl algorithm. Also, we checked in several ways content which is read from SD card and sent to tidl algorithm plugin. We used CRC on output buffer of tidlPreproc and input buffer of tidl plugin. CRC are always equal and more importantly same with every execution. However, output is always different and with adding or removing Vps_printf calls(for "debugging" purposes) can cause different behavior. For example, if we have a lot of printing on console, usecase sometimes work correctly, but if we remove all of it, it doesn't even write anything to output file.

    I'm sending you tidl usecase files we changed. If you can take a look and tell as if there is some problem we would appreciate that.

    Best regards,
    Sasa

    tidl_uc.tar.gz

  • Hi,

    wt think we narrowed down a problem a little bit. In chains_common_tidl.c file we checked function Chains_tidlFillNetParamsMem function as it is reading neural network parameters from file and write them to shared memory. It appears reading is ok. To make it easier to check parameters, we calculated CRC over those parameters. After that we checked those same parameters on DSP core where they are used for processing input image. We used here CRC again and it appears that we often get different CRC value than in function Chains_tidlFillNetParamsMem. As CRC is calculated over several different buffers which represents parameters of neural network. Interesting is that whenever CRC is wrong, that value is 0 and it is on one or two buffers, but every time it is some different buffer. More interestingly content of those "faulty" buffers are allways the same. I'm sure that CRC function is working fine. You have chains_common_tidl.c file in attachment if it is of some help.

    Regards,
    Sasa

    chains_common_tidl.c
    /******************************************************************************
    Copyright (c) [2012 - 2017] Texas Instruments Incorporated
    
    All rights reserved not granted herein.
    
    Limited License.
    
     Texas Instruments Incorporated grants a world-wide, royalty-free, non-exclusive
     license under copyrights and patents it now or hereafter owns or controls to
     make,  have made, use, import, offer to sell and sell ("Utilize") this software
     subject to the terms herein.  With respect to the foregoing patent license,
     such license is granted  solely to the extent that any such patent is necessary
     to Utilize the software alone.  The patent license shall not apply to any
     combinations which include this software, other than combinations with devices
     manufactured by or for TI ("TI Devices").  No hardware patent is licensed
     hereunder.
    
     Redistributions must preserve existing copyright notices and reproduce this
     license (including the above copyright notice and the disclaimer and
     (if applicable) source code license limitations below) in the documentation
     and/or other materials provided with the distribution
    
     Redistribution and use in binary form, without modification, are permitted
     provided that the following conditions are met:
    
     * No reverse engineering, decompilation, or disassembly of this software
       is permitted with respect to any software provided in binary form.
    
     * Any redistribution and use are licensed by TI for use only with TI Devices.
    
     * Nothing shall obligate TI to provide you with source code for the software
       licensed and provided to you in object code.
    
     If software source code is provided to you, modification and redistribution of
     the source code are permitted provided that the following conditions are met:
    
     * Any redistribution and use of the source code, including any resulting
       derivative works, are licensed by TI for use only with TI Devices.
    
     * Any redistribution and use of any object code compiled from the source code
       and any resulting derivative works, are licensed by TI for use only with TI
       Devices.
    
     Neither the name of Texas Instruments Incorporated nor the names of its
     suppliers may be used to endorse or promote products derived from this software
     without specific prior written permission.
    
     DISCLAIMER.
    
     THIS SOFTWARE IS PROVIDED BY TI AND TI’S LICENSORS "AS IS" AND ANY EXPRESS OR
     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     IN NO EVENT SHALL TI AND TI’S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT,
     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    ******************************************************************************/
    
    /*******************************************************************************
     *  INCLUDE FILES
     *******************************************************************************
     */
    #include <src/hlos/adas/include/chains.h>
    #include <src/hlos/common/chains_common.h>
    #include <src/include/chains_common_tidl.h>
    
    #define INIT 0xffffffff
    #define XOROT 0xffffffff
    
    uint32_t  crctable[256] =
    {
     0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL,
     0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L,
     0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L,
     0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L,
     0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL,
     0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L,
     0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL,
     0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L,
     0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L,
     0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL,
     0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L,
     0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L,
     0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L,
     0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL,
     0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L,
     0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL,
     0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL,
     0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L,
     0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L,
     0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L,
     0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL,
     0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L,
     0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL,
     0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L,
     0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L,
     0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL,
     0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L,
     0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L,
     0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L,
     0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL,
     0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L,
     0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL,
     0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL,
     0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L,
     0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L,
     0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L,
     0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL,
     0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L,
     0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL,
     0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L,
     0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L,
     0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL,
     0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L,
     0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L,
     0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L,
     0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL,
     0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L,
     0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL,
     0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL,
     0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L,
     0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L,
     0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L,
     0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL,
     0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L,
     0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL,
     0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L,
     0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L,
     0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL,
     0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L,
     0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L,
     0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L,
     0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL,
     0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L,
     0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL
    };
    
    
    
    uint32_t crc_normal (uint8_t *blk_adr, uint32_t  blk_len)
    {
        uint32_t crc = INIT;
        while (blk_len--)
           crc = crctable[(crc ^ *blk_adr++) & 0xFFL] ^ (crc >> 8);
        return crc^XOROT;
    }
    
    /******************************************************************************
     *  TIDL Common functions:
     *      The following functions should be in sync with the similar functions
     *      defined in the $(tidl_PATH)\modules\ti_dl\test\src\tidl_tb.c file.
     *          Chains_tidlReadNet <->  tidl_readNet
     *          Chains_tidlAllocNetParamsMem <-> tidl_allocNetParamsMem
     *          Chains_tidlFillNetParamsMem <-> tidl_fillNetParamsMem
     ******************************************************************************/
    
    
    /**
     *******************************************************************************
     *
     * \brief   This function Reset the statCollector registers
     *          SYSTEM_COMMON_CMD_RESET_STAT_COLL send to only IPU1_0 core.
     *
     * \return  SYSTEM_LINK_STATUS_SOK on success
     *******************************************************************************
    */
    Int32 Chains_tidlReadNet(sTIDL_Network_t *net, char *netFile)
    {
        Int32 fp;
        UInt32 readSize;
    
        fp = ChainsCommon_Osal_fileOpen(
                                netFile,
                                CHAINSCOMMON_OSAL_FILEMODE_READ_BIN);
        UTILS_assert(-1 != fp);
    
        ChainsCommon_Osal_fileRead(
                                fp,
                                (UInt8*)net,
                                sizeof(sTIDL_Network_t),
                                &readSize);
        UTILS_assert(readSize == sizeof(sTIDL_Network_t));
    
        ChainsCommon_Osal_fileClose(fp);
    
        return SYSTEM_LINK_STATUS_SOK;
    }
    
    /**
     *******************************************************************************
     *
     * \brief   This function Reset the statCollector registers
     *          SYSTEM_COMMON_CMD_RESET_STAT_COLL send to only IPU1_0 core.
     *
     * \return  SYSTEM_LINK_STATUS_SOK on success
     *******************************************************************************
    */
    Int32 Chains_tidlAllocNetParamsMem(sTIDL_Network_t *net)
    {
        Int32 i;
    
        for(i = 0; i < net->numLayers; i++)
        {
            if((TIDL_ConvolutionLayer == net->TIDLLayers[i].layerType) ||
               (TIDL_Deconv2DLayer == net->TIDLLayers[i].layerType))
            {
                sTIDL_ConvParams_t *conv2dPrms = \
                                                &net->TIDLLayers[i].layerParams.convParams;
                conv2dPrms->weights.bufSize = \
                    net->weightsElementSize * (conv2dPrms->kernelW * conv2dPrms->kernelH *
                    conv2dPrms->numInChannels * conv2dPrms->numOutChannels)
                    /conv2dPrms->numGroups;
                conv2dPrms->weights.ptr = \
                    ChainsCommon_Osal_memAlloc(conv2dPrms->weights.bufSize, 32);
    
                conv2dPrms->bias.bufSize = net->biasElementSize * conv2dPrms->numOutChannels;
                conv2dPrms->bias.ptr = \
                    ChainsCommon_Osal_memAlloc(conv2dPrms->bias.bufSize, 32);
            }
            else if(TIDL_BiasLayer == net->TIDLLayers[i].layerType)
            {
                sTIDL_BiasParams_t *biasPrms = &net->TIDLLayers[i].layerParams.biasParams;
                biasPrms->bias.bufSize = net->biasElementSize * biasPrms->numChannels;
                biasPrms->bias.ptr = \
                    ChainsCommon_Osal_memAlloc(biasPrms->bias.bufSize, 32);
            }
            else if(TIDL_BatchNormLayer == net->TIDLLayers[i].layerType)
            {
                sTIDL_BatchNormParams_t *batchNormPrms = \
                    &net->TIDLLayers[i].layerParams.batchNormParams;
                batchNormPrms->weights.bufSize = \
                     net->weightsElementSize * batchNormPrms->numChannels;
                batchNormPrms->weights.ptr =
                    ChainsCommon_Osal_memAlloc(batchNormPrms->weights.bufSize, 32);
                batchNormPrms->bias.bufSize = \
                    net->biasElementSize * batchNormPrms->numChannels;
                batchNormPrms->bias.ptr =
                    ChainsCommon_Osal_memAlloc(batchNormPrms->bias.bufSize, 32);
    
                batchNormPrms->reluParams.slope.bufSize =
                    net->slopeElementSize * batchNormPrms->numChannels;
                if(TIDL_PRelU == batchNormPrms->reluParams.reluType)
                {
                    batchNormPrms->reluParams.slope.ptr =
                        ChainsCommon_Osal_memAlloc(
                                batchNormPrms->reluParams.slope.bufSize, 32);
                }
            }
            else if(TIDL_InnerProductLayer == net->TIDLLayers[i].layerType)
            {
                sTIDL_InnerProductParams_t *ipPrms = \
                                        &net->TIDLLayers[i].layerParams.innerProductParams;
                ipPrms->bias.bufSize =  net->biasElementSize * ipPrms->numOutNodes;
                ipPrms->bias.ptr = \
                    ChainsCommon_Osal_memAlloc(
                        SystemUtils_align(ipPrms->bias.bufSize, 128), 32);
    
                ipPrms->weights.bufSize = \
                    net->weightsElementSize* ipPrms->numInNodes * ipPrms->numOutNodes;
                ipPrms->weights.ptr = \
                    ChainsCommon_Osal_memAlloc(
                        SystemUtils_align((ipPrms->weights.bufSize + 16 * \
                            net->TIDLLayers[i].layerParams.innerProductParams.numInNodes),
                                1024), 32);
            }
            else if(TIDL_DetectionOutputLayer == net->TIDLLayers[i].layerType)
            {
                sTIDL_DetectOutputParams_t *detectPrms = \
                                 &net->TIDLLayers[i].layerParams.detectOutParams;
                detectPrms->priorBox.bufSize =  detectPrms->priorBoxSize * sizeof(float);
                detectPrms->priorBox.ptr = ChainsCommon_Osal_memAlloc(
                            SystemUtils_align(detectPrms->priorBoxSize *
                                                detectPrms->priorBox.bufSize, 128), 32);
            }
        }
    
        return SYSTEM_LINK_STATUS_SOK;
    }
    
    /**
     *******************************************************************************
     *
     * \brief   This function Reset the statCollector registers
     *          SYSTEM_COMMON_CMD_RESET_STAT_COLL send to only IPU1_0 core.
     *
     * \return  SYSTEM_LINK_STATUS_SOK on success
     *******************************************************************************
    */
    Void Chains_sparseConv2dCoffesS8(Int8 *ptr, Int32 n, UInt8 thr)
    {
        Int32 i0;
    
        for(i0 = 0; i0 < n; i0++)
        {
            if(((UInt8)(rand() & 0xFF)) > thr)
            {
                ptr[i0] =  0;
            }
        }
    }
    
    /**
     *******************************************************************************
     *
     * \brief   This function Reset the statCollector registers
     *          SYSTEM_COMMON_CMD_RESET_STAT_COLL send to only IPU1_0 core.
     *
     * \return  SYSTEM_LINK_STATUS_SOK on success
     *******************************************************************************
    */
    Void Chains_createRandPatternS16(Int16 *ptr, Int16 n, Int16 width, Int16 height,
                                     Int16 pitch, Int32 chOffset)
    {
        Int16 val;
        Int32 i0, i1, i2;
        for(i0 = 0; i0 < n; i0++)
        {
            for(i1 = 0; i1 < height; i1++)
            {
                for(i2 = 0; i2 < width; i2++)
                {
                    val = rand() & 0x7FFF;
                    ptr[i0 * chOffset + i1 * pitch + i2] = (rand() & 1) ? val : -val;
                }
            }
        }
    }
    
    /**
     *******************************************************************************
     *
     * \brief   This function Reset the statCollector registers
     *          SYSTEM_COMMON_CMD_RESET_STAT_COLL send to only IPU1_0 core.
     *
     * \return  SYSTEM_LINK_STATUS_SOK on success
     *******************************************************************************
    */
    Void Chains_createRandPatternS8(Int8 *ptr, Int16 roi, Int16 n,
                                    Int16 width, Int16 height, Int16 pitch,
                                    Int32 chOffset)
    {
        Int16 val;
        Int32   i0, i1, i2, i3;
    
        for(i3 = 0; i3 < roi; i3++)
        {
            for(i0 = 0; i0 < n; i0++)
            {
                for(i1 = 0; i1 < height; i1++)
                {
                    for(i2 = 0; i2 < width; i2++)
                    {
                        val = rand() & 0x7F;
                        ptr[i3 * n * chOffset + i0 * chOffset + i1 * pitch +i2] = \
                            (rand() & 1) ? val : -val;
                    }
                }
            }
        }
    }
    
    /**
     *******************************************************************************
     *
     * \brief   This function Reset the statCollector registers
     *          SYSTEM_COMMON_CMD_RESET_STAT_COLL send to only IPU1_0 core.
     *
     * \return  SYSTEM_LINK_STATUS_SOK on success
     *******************************************************************************
    */
    Int32 Chains_tidlFillNetParamsMem(sTIDL_Network_t *net, char *prmFile)
    {
        Int32 i;
        Int32 fp;
        UInt32 dataSize, readSize;
        fp = ChainsCommon_Osal_fileOpen(
                            prmFile,
                            CHAINSCOMMON_OSAL_FILEMODE_READ_BIN);
        UTILS_assert(-1 != fp);
    
        for(i = 0; i < net->numLayers; i++)
        {
            if((TIDL_ConvolutionLayer == net->TIDLLayers[i].layerType) ||
               (TIDL_Deconv2DLayer == net->TIDLLayers[i].layerType))
            {
                sTIDL_ConvParams_t *conv2dPrms = &net->TIDLLayers[i].layerParams.convParams;
    
                if(RANDOM_INPUT)
                {
                    Chains_createRandPatternS8(
                        (Int8 *)ChainsCommon_Osal_getVirtAddr((UInt32)conv2dPrms->weights.ptr),
                        1,
                        conv2dPrms->numInChannels/conv2dPrms->numGroups,
                        conv2dPrms->numOutChannels,
                        conv2dPrms->kernelW * conv2dPrms->kernelH,
                        conv2dPrms->numOutChannels,
                        conv2dPrms->kernelW * conv2dPrms->kernelW * conv2dPrms->numOutChannels);
    
                    if(NO_ZERO_COEFF_PERCENT < 100)
                    {
                        Chains_sparseConv2dCoffesS8((Int8 *)ChainsCommon_Osal_getVirtAddr((UInt32)conv2dPrms->weights.ptr),
                                    conv2dPrms->weights.bufSize,
                                    NO_ZERO_COEFF_PERCENT * 2.55);
                    }
    
                    if(conv2dPrms->enableBias)
                    {
                        dataSize = conv2dPrms->numOutChannels;
                        Chains_createRandPatternS16((Int16 *)ChainsCommon_Osal_getVirtAddr((UInt32)conv2dPrms->bias.ptr),1,dataSize,1,1,1);
                    }
                    else
                    {
                        memset(
                            (Int8 *)ChainsCommon_Osal_getVirtAddr((UInt32)conv2dPrms->bias.ptr),0,conv2dPrms->numOutChannels * 2);
                    }
                }
                else
                {
                    dataSize = (conv2dPrms->numInChannels * conv2dPrms->numOutChannels *
                        conv2dPrms->kernelW * conv2dPrms->kernelH)/conv2dPrms->numGroups;
    
                    /* Read weights based on its size */
                    if(net->weightsElementSize == 2)
                    {
                        ChainsCommon_Osal_fileRead(
                            fp,
                            (UInt8*)ChainsCommon_Osal_getVirtAddr((UInt32)conv2dPrms->weights.ptr),
                            (dataSize * 2),
                            &readSize);
                            UTILS_assert(readSize == (dataSize * 2));
                    }
                    else
                    {
                        ChainsCommon_Osal_fileRead(
                            fp,
                            (UInt8*)ChainsCommon_Osal_getVirtAddr((UInt32)conv2dPrms->weights.ptr),
                            dataSize,
                            &readSize);
                            UTILS_assert(readSize == dataSize);
                    }
                    UInt8* ptr = (UInt8*)ChainsCommon_Osal_getVirtAddr((UInt32)conv2dPrms->weights.ptr);
                    //int ij = 0;
                    UInt32 bufCrc = crc_normal(ptr, conv2dPrms->weights.bufSize);
                    Vps_printf("Buf crc: %x\n", bufCrc);
                   /* for (ij = 0; ij < conv2dPrms->weights.bufSize; ij++)
                    {
                        Vps_printf("Pos %d - Val %x\n", ij, *(ptr + ij));
                    } */
    
    
                    if(NO_ZERO_COEFF_PERCENT < 100)
                    {
                        Chains_sparseConv2dCoffesS8((Int8 *)ChainsCommon_Osal_getVirtAddr((UInt32)conv2dPrms->weights.ptr),
                            conv2dPrms->weights.bufSize,
                            NO_ZERO_COEFF_PERCENT * 2.55);
                    }
    
                    if(conv2dPrms->enableBias)
                    {
                        dataSize = conv2dPrms->numOutChannels;
                        ChainsCommon_Osal_fileRead(
                            fp,
                            (UInt8*)ChainsCommon_Osal_getVirtAddr((UInt32)conv2dPrms->bias.ptr),
                            (dataSize * 2),
                            &readSize);
                            UTILS_assert(readSize == (dataSize * 2));
                    }
                    else
                    {
                        memset(
                            (Int8 *)ChainsCommon_Osal_getVirtAddr((UInt32)conv2dPrms->bias.ptr),0,conv2dPrms->numOutChannels * 2);
                    }
                }
    
                /* Cache Wb of the buffers */
                dataSize = (conv2dPrms->numInChannels * conv2dPrms->numOutChannels *
                        conv2dPrms->kernelW * conv2dPrms->kernelH)/conv2dPrms->numGroups;
                if(net->weightsElementSize == 2)
                {
                    dataSize *= 2;
                }
                OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)conv2dPrms->weights.ptr),
                               (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)conv2dPrms->weights.ptr) + dataSize));
    
                dataSize = conv2dPrms->numOutChannels;
                OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)conv2dPrms->bias.ptr),
                               (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)conv2dPrms->bias.ptr) + dataSize));
            }
            else if(TIDL_BiasLayer == net->TIDLLayers[i].layerType)
            {
                sTIDL_BiasParams_t *biasPrms =&net->TIDLLayers[i].layerParams.biasParams;
                dataSize = biasPrms->numChannels;
    
                if(RANDOM_INPUT)
                {
                    Chains_createRandPatternS16((Int16 *)ChainsCommon_Osal_getVirtAddr((UInt32)biasPrms->bias.ptr),1,dataSize,1,1,1);
    
                    OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)biasPrms->bias.ptr),
                                   (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)biasPrms->bias.ptr) + dataSize));
                }
                else
                {
                    ChainsCommon_Osal_fileRead(
                        fp,
                        (UInt8*)ChainsCommon_Osal_getVirtAddr((UInt32)biasPrms->bias.ptr),
                        (dataSize * 2),
                        &readSize);
                        UTILS_assert(readSize == (dataSize * 2));
    
                 OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)biasPrms->bias.ptr),
                                 (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)biasPrms->bias.ptr) + dataSize * 2));
                }
            }
            else if(TIDL_BatchNormLayer == net->TIDLLayers[i].layerType)
            {
                sTIDL_BatchNormParams_t *bNPrms = \
                                    &net->TIDLLayers[i].layerParams.batchNormParams;
                dataSize = bNPrms->numChannels;
    
                if(RANDOM_INPUT)
                {
                    Chains_createRandPatternS16((Int16 *)ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->weights.ptr),1,dataSize,1,1,1);
    
                    OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->weights.ptr),
                                   (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->weights.ptr) + dataSize));
                }
                else
                {
                    if(net->weightsElementSize == 2)
                    {
                        ChainsCommon_Osal_fileRead(
                            fp,
                            (UInt8*)ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->weights.ptr),
                            (dataSize * 2),
                            &readSize);
                            UTILS_assert(readSize == (dataSize * 2));
    
                        OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->weights.ptr),
                                       (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->weights.ptr) + dataSize * 2));
                    }
                    else
                    {
                        ChainsCommon_Osal_fileRead(
                            fp,
                            (UInt8*)ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->weights.ptr),
                            dataSize,
                            &readSize);
                            UTILS_assert(readSize == dataSize);
    
                        OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->weights.ptr),
                                       (unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->weights.ptr + dataSize));
                    }
                }
    
                if(RANDOM_INPUT)
                {
                    Chains_createRandPatternS16((Int16 *)ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->bias.ptr), 1,dataSize,1,1, 1);
    
                    OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->bias.ptr),
                                   (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->bias.ptr) + dataSize));
                }
                else
                {
                    ChainsCommon_Osal_fileRead(
                        fp,
                        (UInt8*)ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->bias.ptr),
                        (dataSize * 2),
                        &readSize);
                        UTILS_assert(readSize == (dataSize * 2));
    
                    OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->bias.ptr),
                                   (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->bias.ptr) + dataSize * 2));
                }
    
                if(TIDL_PRelU == bNPrms->reluParams.reluType)
                {
                    if(RANDOM_INPUT)
                    {
                        Chains_createRandPatternS16((Int16 *)ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->reluParams.slope.ptr),1,dataSize,1,1,1);
    
                        OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->reluParams.slope.ptr),
                                       (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->reluParams.slope.ptr) + dataSize));
                    }
                    else
                    {
                        if(net->slopeElementSize == 2)
                        {
                            ChainsCommon_Osal_fileRead(
                                fp,
                                (UInt8*)ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->reluParams.slope.ptr),
                                (dataSize * 2),
                                &readSize);
                                UTILS_assert(readSize == (dataSize * 2));
    
                            OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->reluParams.slope.ptr),
                                           (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->reluParams.slope.ptr) + dataSize * 2));
                        }
                        else
                        {
                            ChainsCommon_Osal_fileRead(
                                fp,
                                (UInt8*)ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->reluParams.slope.ptr),
                                dataSize,
                                &readSize);
                                UTILS_assert(readSize == dataSize);
    
                            OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->reluParams.slope.ptr),
                                           (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)bNPrms->reluParams.slope.ptr) + dataSize));
                        }
                    }
                }
            }
            else if(TIDL_InnerProductLayer == net->TIDLLayers[i].layerType)
            {
                sTIDL_InnerProductParams_t *ipPrms = \
                                 &net->TIDLLayers[i].layerParams.innerProductParams;
                dataSize = ipPrms->numInNodes * ipPrms->numOutNodes;
    
                if(RANDOM_INPUT)
                {
                    Chains_createRandPatternS16((Int16 *)ChainsCommon_Osal_getVirtAddr((UInt32)ipPrms->weights.ptr),1,dataSize,1,1,1);
    
                    OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)ipPrms->weights.ptr),
                                   (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)ipPrms->weights.ptr) + dataSize));
                }
                else
                {
                    /* Read weights based on its size */
                    if(net->weightsElementSize == 2)
                    {
                        ChainsCommon_Osal_fileRead(
                            fp,
                            (UInt8*)ChainsCommon_Osal_getVirtAddr((UInt32)ipPrms->weights.ptr),
                            (dataSize * 2),
                            &readSize);
                            UTILS_assert(readSize == (dataSize * 2));
    
                        OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)ipPrms->weights.ptr),
                                       (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)ipPrms->weights.ptr) + dataSize * 2));
                    }
                    else
                    {
                        ChainsCommon_Osal_fileRead(
                            fp,
                            (UInt8*)ChainsCommon_Osal_getVirtAddr((UInt32)ipPrms->weights.ptr),
                            dataSize,
                            &readSize);
                            UTILS_assert(readSize == dataSize);
    
                        OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)ipPrms->weights.ptr),
                                       (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)ipPrms->weights.ptr) + dataSize));
                    }
                }
    
                dataSize = ipPrms->numOutNodes;
                if(RANDOM_INPUT)
                {
                    Chains_createRandPatternS16((Int16 *)ChainsCommon_Osal_getVirtAddr((UInt32)ipPrms->bias.ptr),1,dataSize,1,1,1);
    
                    OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)ipPrms->bias.ptr),
                                   (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)ipPrms->bias.ptr) + dataSize));
                }
                else
                {
                    ChainsCommon_Osal_fileRead(
                        fp,
                        (UInt8*)ChainsCommon_Osal_getVirtAddr((UInt32)ipPrms->bias.ptr),
                        (dataSize * 2),
                        &readSize);
                        UTILS_assert(readSize == (dataSize * 2));
    
                    OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)ipPrms->bias.ptr),
                                   (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)ipPrms->bias.ptr) + dataSize *2));
                }
            }
            else if(TIDL_DetectionOutputLayer == net->TIDLLayers[i].layerType)
            {
                sTIDL_DetectOutputParams_t *detectPrms = \
                                 &net->TIDLLayers[i].layerParams.detectOutParams;
                dataSize = detectPrms->priorBoxSize;
    
                if(RANDOM_INPUT)
                {
                    Chains_createRandPatternS16((Int16 *)ChainsCommon_Osal_getVirtAddr((UInt32)detectPrms->priorBox.ptr),1,dataSize*4,1,1,1);
    
                    OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)detectPrms->priorBox.ptr),
                                   (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)detectPrms->priorBox.ptr) + dataSize * 4));
                }
                else
                {
                    ChainsCommon_Osal_fileRead(
                        fp,
                        (UInt8*)ChainsCommon_Osal_getVirtAddr((UInt32)detectPrms->priorBox.ptr),
                        (dataSize * 4),
                        &readSize);
                        UTILS_assert(readSize == (dataSize * 4));
    
                    OSA_memCacheWb((unsigned int)ChainsCommon_Osal_getVirtAddr((UInt32)detectPrms->priorBox.ptr),
                                   (unsigned int)(ChainsCommon_Osal_getVirtAddr((UInt32)detectPrms->priorBox.ptr) + dataSize * 4));
                }
            }
        }
    
        ChainsCommon_Osal_fileClose(fp);
    
        /* Cache wb since it is read on EVE and DSP */
        OSA_memCacheWb((unsigned int)net,
                       (unsigned int)(net + sizeof(sTIDL_Network_t)));
    
        return SYSTEM_LINK_STATUS_SOK;
    }
    
    /**
     *******************************************************************************
     *
     * \brief   This function Reset the statCollector registers
     *          SYSTEM_COMMON_CMD_RESET_STAT_COLL send to only IPU1_0 core.
     *
     * \return  SYSTEM_LINK_STATUS_SOK on success
     *******************************************************************************
    */
    Int32 Chains_tidlFreeNetParamsMem(sTIDL_Network_t *net)
    {
        Int32 i;
    
        for(i = 0; i < net->numLayers; i++)
        {
            if((TIDL_ConvolutionLayer == net->TIDLLayers[i].layerType) ||
               (TIDL_Deconv2DLayer == net->TIDLLayers[i].layerType))
            {
                sTIDL_ConvParams_t *conv2dPrms = \
                                                &net->TIDLLayers[i].layerParams.convParams;
                conv2dPrms->weights.bufSize = \
                    net->weightsElementSize * (conv2dPrms->kernelW * conv2dPrms->kernelH *
                    conv2dPrms->numInChannels * conv2dPrms->numOutChannels)
                    /conv2dPrms->numGroups;
                ChainsCommon_Osal_memFree(
                                    conv2dPrms->weights.ptr, conv2dPrms->weights.bufSize);
    
                conv2dPrms->bias.bufSize = net->biasElementSize * conv2dPrms->numOutChannels;
                ChainsCommon_Osal_memFree(
                        conv2dPrms->bias.ptr, conv2dPrms->bias.bufSize);
            }
            else if(TIDL_BiasLayer == net->TIDLLayers[i].layerType)
            {
                sTIDL_BiasParams_t *biasPrms = &net->TIDLLayers[i].layerParams.biasParams;
                biasPrms->bias.bufSize = net->biasElementSize * biasPrms->numChannels;
                ChainsCommon_Osal_memFree(
                        biasPrms->bias.ptr, biasPrms->bias.bufSize);
            }
            else if(TIDL_BatchNormLayer == net->TIDLLayers[i].layerType)
            {
                sTIDL_BatchNormParams_t *batchNormPrms = \
                    &net->TIDLLayers[i].layerParams.batchNormParams;
                batchNormPrms->weights.bufSize = \
                     net->weightsElementSize * batchNormPrms->numChannels;
                ChainsCommon_Osal_memFree(
                        batchNormPrms->weights.ptr, batchNormPrms->weights.bufSize);
    
                batchNormPrms->bias.bufSize = \
                    net->biasElementSize * batchNormPrms->numChannels;
                ChainsCommon_Osal_memFree(
                        batchNormPrms->bias.ptr, batchNormPrms->bias.bufSize);
    
                batchNormPrms->reluParams.slope.bufSize =
                    net->slopeElementSize * batchNormPrms->numChannels;
                if(TIDL_PRelU == batchNormPrms->reluParams.reluType)
                {
                    ChainsCommon_Osal_memFree(
                            batchNormPrms->reluParams.slope.ptr,
                            batchNormPrms->reluParams.slope.bufSize);
                }
            }
            else if(TIDL_InnerProductLayer == net->TIDLLayers[i].layerType)
            {
                sTIDL_InnerProductParams_t *ipPrms = \
                                        &net->TIDLLayers[i].layerParams.innerProductParams;
                ipPrms->bias.bufSize =  net->biasElementSize * ipPrms->numOutNodes;
                ChainsCommon_Osal_memFree(
                        ipPrms->bias.ptr, SystemUtils_align(ipPrms->bias.bufSize, 128));
    
    
                ipPrms->weights.bufSize = \
                    net->weightsElementSize* ipPrms->numInNodes * ipPrms->numOutNodes;
                ChainsCommon_Osal_memFree(
                        ipPrms->weights.ptr,
                        SystemUtils_align((ipPrms->weights.bufSize + 16 * \
                            net->TIDLLayers[i].layerParams.innerProductParams.numInNodes),
                                1024));
            }
        }
    
        return SYSTEM_LINK_STATUS_SOK;
    }
    
    

  • Hi,

    Please 1st check if you are handelling the address translation properly.
    like if you allocates a memory from linux then before sending to any core running bios 1st get its physical address then send it.
    Similarly if any data comes to A15 from any other core then 1st get the virtual address of it then work on that buffer with virtual address.

    Regards,
    Anuj