#include #include #include #include #include "sys.h" #include "npu.h" // #include "types/vmm_api.h" #include "common.h" #define MAX_MDL_IN_NUM (3) #define MAX_MDL_OUT_NUM (3) #define MAX_PATH_LEN (1024) typedef struct{ char path[MAX_PATH_LEN]; uint32_t width; uint32_t height; E_TY_PixelFormat fmt; }stImage; typedef struct{ char mdlPath[MAX_PATH_LEN]; stImage inImageVec[MAX_MDL_IN_NUM]; uint32_t inImgNum; char *outPath; }stNpuOP; static void printMdlDesc(T_TY_ModelDesc *desc){ INFO_LOG("model desc: version:%s", desc->info.version); INFO_LOG("model desc: compile:%s", desc->info.compileDate); INFO_LOG("model desc: input number:%d", desc->ioDesc.inputNum); uint32_t idx=0; for(;idxioDesc.inputNum; idx++){ INFO_LOG("input blob#%d", idx); printBlob(&desc->ioDesc.in[idx]); } INFO_LOG("model desc: output number:%d", desc->ioDesc.outputNum); idx=0; for(; idxioDesc.outputNum; idx++){ INFO_LOG("output blob#%d", idx); printBlob(&desc->ioDesc.out[idx]); } } static uint32_t getMdlInputNum(T_TY_ModelDesc *desc){ return desc->ioDesc.inputNum; } static uint32_t getMdlOutputNum(T_TY_ModelDesc *desc){ return desc->ioDesc.outputNum; } static void freeTaskInOutBuf(T_TY_TaskInput inVec[], uint32_t inNum, T_TY_TaskOutput outVec[], uint32_t outNum){ uint32_t i=0; for(; iioDesc.inputNum == npuOp->inImgNum); assert(desc->ioDesc.inputNum == inNum); assert(desc->ioDesc.outputNum== outNum); uint32_t idx=0; for(; idxioDesc.inputNum; idx++){ T_TY_TaskInput *ptrTyIn = &inVec[idx]; stImage *ptrImg = &npuOp->inImageVec[idx]; T_TY_BlobDesc *ptrBlobDesc = &desc->ioDesc.in[idx]; ptrTyIn->descIn = *ptrBlobDesc; if(ptrTyIn->descIn.type == E_TY_BLOB_DATA){ ptrTyIn->dataIn.size = getBlobSize(ptrBlobDesc); }else if(ptrTyIn->descIn.type == E_TY_BLOB_IMAGE_WITH_PRE_PROC){ ptrTyIn->descIn.type = E_TY_BLOB_IMAGE; ptrTyIn->descIn.img.picFormat = ptrImg->fmt; ptrTyIn->descIn.img.picWidth = ptrImg->width; ptrTyIn->descIn.img.picHeight = ptrImg->height; ptrTyIn->descIn.img.picWidthStride = ptrTyIn->descIn.img.picWidth; //根据图片实际stride填写 ptrTyIn->descIn.img.picHeightStride= ptrTyIn->descIn.img.picHeight; //根据图片实际stride填写 ptrTyIn->descIn.img.roi.x = 0; ptrTyIn->descIn.img.roi.y = 0; ptrTyIn->descIn.img.roi.width = ptrTyIn->descIn.img.picWidth; ptrTyIn->descIn.img.roi.height= ptrTyIn->descIn.img.picHeight; ptrTyIn->dataIn.size = getImageSize(ptrTyIn->descIn.img.picWidth, ptrTyIn->descIn.img.picHeight, ptrTyIn->descIn.img.picFormat); }else{ assert(0); //TBD,暂时没有原始模型输入Image的情况 } mallocMem((void**)&ptrTyIn->dataIn.virAddr, &ptrTyIn->dataIn.phyAddr, ptrTyIn->dataIn.size, 8, E_TY_MEM_VMM_CACHED); readFile(&ptrTyIn->dataIn, ptrImg->path); flushVmmMem(ptrTyIn->dataIn.virAddr, ptrTyIn->dataIn.phyAddr, ptrTyIn->dataIn.size); } idx=0; for(; idxioDesc.outputNum; idx++){ T_TY_TaskOutput *out = &outVec[idx]; out->dataOut.size = getBlobSize(&desc->ioDesc.out[idx]); mallocMem((void**)&out->dataOut.virAddr, &out->dataOut.phyAddr, out->dataOut.size, 8, E_TY_MEM_VMM_CACHED); flushVmmMem(out->dataOut.virAddr, out->dataOut.phyAddr, out->dataOut.size); } } static int32_t getFileLine(char *path, int32_t lineIdx, char line[]){ line[0] = '\0'; FILE *fp = fopen(path, "r"); if(NULL == fp){ ERROR_LOG("open file error, path:%s", path); return -1; } int32_t idx=0; char tmp[1024]={'\0'}; while(!feof(fp)){ fgets(tmp, 1024, fp); if(idx == lineIdx){ strncpy(line, tmp, 1024); break; } idx++; } fclose(fp); return 0; } static void caffeSqueezenetPostproc(T_TY_TaskOutput outVec[], uint32_t outNum){ int32_t count = 1000; assert(1 == outNum); assert(count * sizeof(float) == outVec[0].dataOut.size); typedef struct{ int32_t idx; float prob; }stOutItem; stOutItem *ptrOutVec = malloc(sizeof(stOutItem) * count); int32_t idx=0; for(; idxdataOut, "./out_picture/out_data"); // if(TY_NPU_SUCCESS != tyRet){ // ERROR_LOG("write fail, errCode:%d", tyRet); // }else{ // printf("out file path = '/nfs/xc01nna/npu/out_picture/out_data'"); // } // system("cat /proc/media-mem"); // caffeSqueezenetPostproc(taskOutVec, mdlOutNum); // } } else{ TY_NPU_NN_HANDLE nnHandle; tyRet = TY_NPU_ForwardAsync(tskHdl, npuId, mdlInNum, taskInVec, mdlOutNum, taskOutVec, &nnHandle); if(TY_NPU_SUCCESS != tyRet){ ERROR_LOG("TY_NPU_ForwardAsync fail, errCode:%d", tyRet); TY_NPU_ReleaseTask(tskHdl); TY_NPU_ReleaseModel(mdlHdl); TY_NPU_SysExit(); freeMemSegments(&mdlMemInfo); freeMemSegments(&tskMemInfo); freeTaskInOutBuf(taskInVec, mdlInNum, taskOutVec, mdlOutNum); return -1; } INFO_LOG("TY_NPU_ForwardAsync send task done"); if(0 == queryPeriod){ int32_t block = 1; E_TY_Bool status = E_TY_FALSE; tyRet = TY_NPU_Query(npuId, nnHandle, &status, block); if(TY_NPU_SUCCESS != tyRet){ ERROR_LOG("TY_NPU_Query fail, errCode:%d", tyRet); TY_NPU_ReleaseTask(tskHdl); TY_NPU_ReleaseModel(mdlHdl); TY_NPU_SysExit(); freeMemSegments(&mdlMemInfo); freeMemSegments(&tskMemInfo); freeTaskInOutBuf(taskInVec, mdlInNum, taskOutVec, mdlOutNum); return -1; } INFO_LOG("TY_NPU_Query(block mode) done"); caffeSqueezenetPostproc(taskOutVec, mdlOutNum); }else{ int32_t block = 0; E_TY_Bool status = E_TY_FALSE; int32_t waitTime = 0; while(status != E_TY_TRUE){ waitTime += queryPeriod; usleep(queryPeriod*1000); tyRet = TY_NPU_Query(npuId, nnHandle, &status, block); if(TY_NPU_SUCCESS != tyRet){ ERROR_LOG("TY_NPU_Query fail, errCode:%d", tyRet); TY_NPU_ReleaseTask(tskHdl); TY_NPU_ReleaseModel(mdlHdl); TY_NPU_SysExit(); freeMemSegments(&mdlMemInfo); freeMemSegments(&tskMemInfo); freeTaskInOutBuf(taskInVec, mdlInNum, taskOutVec, mdlOutNum); return -1; } INFO_LOG("TY_NPU_Query(period mode), wait waitTime:%d(ms)", waitTime); } INFO_LOG("TY_NPU_Query(period mode) done"); caffeSqueezenetPostproc(taskOutVec, mdlOutNum); } } tyRet = TY_NPU_ReleaseTask(tskHdl); if(TY_NPU_SUCCESS != tyRet){ ERROR_LOG("TY_NPU_ReleaseTask fail, errCode:%d", tyRet); TY_NPU_ReleaseModel(mdlHdl); TY_NPU_SysExit(); freeMemSegments(&mdlMemInfo); freeMemSegments(&tskMemInfo); freeTaskInOutBuf(taskInVec, mdlInNum, taskOutVec, mdlOutNum); return -1; } INFO_LOG("TY_NPU_ReleaseTask done"); tyRet = TY_NPU_ReleaseModel(mdlHdl); if(TY_NPU_SUCCESS != tyRet){ ERROR_LOG("TY_NPU_ReleaseModel fail, errCode:%d", tyRet); TY_NPU_SysExit(); freeMemSegments(&mdlMemInfo); freeMemSegments(&tskMemInfo); freeTaskInOutBuf(taskInVec, mdlInNum, taskOutVec, mdlOutNum); return -1; } INFO_LOG("TY_NPU_ReleaseModel done"); freeMemSegments(&mdlMemInfo); freeMemSegments(&tskMemInfo); freeTaskInOutBuf(taskInVec, mdlInNum, taskOutVec, mdlOutNum); tyRet = TY_NPU_SysExit(); if(TY_NPU_SUCCESS != tyRet){ ERROR_LOG("TY_NPU_SysExit fail, errCode:%d", tyRet); return -1; } INFO_LOG("TY_NPU_SysExit done"); return 0; }