/******************************************************************************/ /*! * \file timlCNNConvInitialize.c */ /* Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "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 THE COPYRIGHT * OWNER OR CONTRIBUTORS 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. * ******************************************************************************/ /******************************************************************************* * * INCLUDES * ******************************************************************************/ #include "../api/timl.h" /******************************************************************************/ /*! * \ingroup cnn * \brief Initialize the conv layer * \param[in] layer Conv layer * \return Error code */ /******************************************************************************/ int timlCNNConvInitialize(timlCNNLayer *layer) { timlConvNeuralNetwork *cnn; timlCNNLayer *prev; int dim; int deviceId; int threadId; int err; char *offset; // init err = 0; cnn = layer->cnn; prev = layer->prev; dim = 0; deviceId = layer->cnn->deviceId; threadId = layer->cnn->threadId; // params memory common to level 1, 2, 3 // allocate biasMultiplier if (timlUtilMallocAcc((void**) &(layer->convParams.biasMultiplier), sizeof(float)*layer->row*layer->col)) { return ERROR_CNN_LAYER_ALLOCATION; } timlUtilVectorResetFloat(layer->convParams.biasMultiplier, layer->row*layer->col, 1.0, deviceId, threadId); if (layer->convParams.shared == false) { // allocate prevFeatureMapReshapeIndex, size = (kernelRow*kernelCol) * (row*col) if (timlUtilMallocAcc((void**) &(layer->convParams.prevFeatureMapReshapeIndex), sizeof(int)*layer->convParams.kernelRow*layer->convParams.kernelCol*layer->row*layer->col)) { return ERROR_CNN_LAYER_ALLOCATION; } timlUtilConv2ImageReshapeIndex(layer->convParams.prevFeatureMapReshapeIndex, prev->row, prev->col, layer->convParams.kernelRow, layer->convParams.kernelCol, layer->convParams.padUp, layer->convParams.padDown, layer->convParams.padLeft, layer->convParams.padRight, layer->convParams.strideX, layer->convParams.strideY, layer->convParams.type, deviceId, threadId); // allocate kernel dim = layer->convParams.inputFeatureMapChannel*layer->convParams.outputFeatureMapChannel*layer->convParams.kernelRow*layer->convParams.kernelCol; if (timlUtilMallocAcc((void**) &(layer->convParams.kernel), sizeof(float)*dim)) { return ERROR_CNN_LAYER_ALLOCATION; } // allocate bias if (timlUtilMallocAcc((void**) &(layer->convParams.bias), sizeof(float)*layer->channel)) { return ERROR_CNN_LAYER_ALLOCATION; } } // level 1 if (layer->allocatorLevel == Util_AllocatorLevel1) { // allocate feature map if (timlUtilMallocAcc((void**) &(layer->featureMap), sizeof(float)*layer->maxBatchSize*layer->row*layer->col*layer->channel)) { return ERROR_CNN_LAYER_ALLOCATION; } // allocate feature map delta if (timlUtilMallocAcc((void**) &(layer->delta), sizeof(float)*layer->maxBatchSize*layer->row*layer->col*layer->channel)) { return ERROR_CNN_LAYER_ALLOCATION; } // allocate prev feature map reshape, size = (prev->channel*kernelRow*kernelCol) * (row*col) if (timlUtilMallocAcc((void**) &(layer->convParams.prevFeatureMapReshape), sizeof(float)*layer->convParams.inputFeatureMapChannel*layer->convParams.kernelRow*layer->convParams.kernelCol*layer->row*layer->col)) { return ERROR_CNN_LAYER_ALLOCATION; } // if not shared if (layer->convParams.shared == false) { // allocate kernelInc if (timlUtilMallocAcc((void**) &(layer->convParams.kernelInc), sizeof(float)*dim)) { return ERROR_CNN_LAYER_ALLOCATION; } // allocate kernelGradAccum if (timlUtilMallocAcc((void**) &(layer->convParams.kernelGradAccum), sizeof(float)*dim)) { return ERROR_CNN_LAYER_ALLOCATION; } // allocate biasGradAccum if (timlUtilMallocAcc((void**) &(layer->convParams.biasGradAccum), sizeof(float)*layer->channel)) { return ERROR_CNN_LAYER_ALLOCATION; } // allocate biasInc if (timlUtilMallocAcc((void**) &(layer->convParams.biasInc), sizeof(float)*layer->channel)) { return ERROR_CNN_LAYER_ALLOCATION; } } } // level 2 only if (layer->allocatorLevel == Util_AllocatorLevel2) { // allocate feature map if (timlUtilMallocAcc((void**) &(layer->featureMap), sizeof(float)*layer->maxBatchSize*layer->row*layer->col*layer->channel)) { return ERROR_CNN_LAYER_ALLOCATION; } // allocate prev feature map reshape, size = (prev->channel*kernelRow*kernelCol) * (row*col) if (timlUtilMallocAcc((void**) &(layer->convParams.prevFeatureMapReshape), sizeof(float)*layer->convParams.inputFeatureMapChannel*layer->convParams.kernelRow*layer->convParams.kernelCol*layer->row*layer->col)) { return ERROR_CNN_LAYER_ALLOCATION; } } // level 3 only if (layer->allocatorLevel == Util_AllocatorLevel3) { if (layer->prev->memPoolPos == Util_MemPoolTop) { offset = cnn->memPool + cnn->memPoolSize - layer->forwardMemory; layer->memPoolPos = Util_MemPoolBottom; layer->convParams.prevFeatureMapReshape = offset; offset += sizeof(float)*layer->convParams.inputFeatureMapChannel*layer->convParams.kernelRow*layer->convParams.kernelCol*layer->row*layer->col; layer->featureMap = offset; } else { // allocate at the top offset = cnn->memPool; layer->memPoolPos = Util_MemPoolTop; layer->featureMap = offset; offset += sizeof(float)*layer->maxBatchSize*layer->row*layer->col*layer->channel; layer->convParams.prevFeatureMapReshape = offset; } } return err; }