/*************************************** Auteur : Pierre Aubert Mail : aubertp7@gmail.com Licence : CeCILL-C ****************************************/ #include "micro_benchmark.h" #include "temporary_alloc.h" #include "intrinsics_propagation.h" ///Get the number of nanoseconds per elements /** @param nbElement : number of elements of the tables */ void evaluateGrayScott(size_t nbElement){ size_t nbRow(nbElement*PLIB_VECTOR_SIZE_FLOAT); size_t nbCol(nbElement*PLIB_VECTOR_SIZE_FLOAT*2lu); nbElement = nbRow*nbCol; PTensor tmpInU, tmpInV, tmpOutU, tmpOutV; float *tmpU1 = NULL, *tmpU2 = NULL, *tmpV1 = NULL, *tmpV2 = NULL; allocate_temporary(tmpU1, tmpU2, tmpV1, tmpV2, tmpInU, tmpInV, tmpOutU, tmpOutV, nbRow, nbCol); float diffudionRateU(0.1f), diffusionRateV(0.05f); float killRate(0.054f), feedRate(0.014f), dt(1.0f); long nbStencilRow(3l), nbStencilCol(3l); float matDeltaSquare[] = {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}; //Let's convert these temporaries into intrinsics temporaries PTensor tmpVecInU(AllocMode::ALIGNED), tmpVecInV(AllocMode::ALIGNED), tmpVecOutU(AllocMode::ALIGNED), tmpVecOutV(AllocMode::ALIGNED); tmpVecInU.fromScalToVecNeigbhour(tmpInU, PLIB_VECTOR_SIZE_FLOAT); tmpVecInV.fromScalToVecNeigbhour(tmpInV, PLIB_VECTOR_SIZE_FLOAT); tmpVecOutU.fromScalToVecNeigbhour(tmpOutU, PLIB_VECTOR_SIZE_FLOAT); tmpVecOutV.fromScalToVecNeigbhour(tmpOutV, PLIB_VECTOR_SIZE_FLOAT); PTensor vecMatDeltaSquare(AllocMode::ALIGNED, nbStencilRow, nbStencilCol*PLIB_VECTOR_SIZE_FLOAT); reshuffle_broadcastTensor(vecMatDeltaSquare.getData(), matDeltaSquare, nbStencilRow, nbStencilCol, 0lu, PLIB_VECTOR_SIZE_FLOAT); tmpU1 = tmpVecInU.getData(); tmpU2 = tmpVecInV.getData(); tmpV1 = tmpVecOutU.getData(); tmpV2 = tmpVecOutV.getData(); float * ptrVecMatStencil = vecMatDeltaSquare.getData(); size_t nbVecRow(tmpVecInV.getFullNbRow()), nbVecCol(tmpVecInV.getNbCol()); micro_benchmarkAutoNsPrint("evaluate GrayScott reaction, intrinsics", nbElement, grayscott_propagation, tmpU2, tmpV2, tmpU1, tmpV1, nbVecRow, nbVecCol, ptrVecMatStencil, nbStencilRow, nbStencilCol, diffudionRateU, diffusionRateV, feedRate, killRate, dt); } int main(int argc, char** argv){ return micro_benchmarkParseArg(argc, argv, evaluateGrayScott); }