接口就是cnrt的接口,您可以参考cnrt文档查看。离线推理load的就是cambricon文件哦。
我按照示例程序写(input是16个3*224*224的图片): cnrtFunction_t function; cnrtCreateFunction(&function); cnrtExtractFunction(&function, model, name); int inputNum, outputNum; int64_t *inputSizeS, *outputSizeS; printf("inputNum: %d.n", inputNum); printf("outputNum: %d.n", outputNum); cnrtGetInputDataSize(&inputSizeS, &inputNum, function); cnrtGetOutputDataSize(&outputSizeS, &outputNum, function); 输出的inputNum和outputNum并不是16和16,而是0和1024。您知道这是怎么回事吗?这是属于默认设置吗?您说是通过接口获得的,这个接口是保存在模型中的吗,具体的接口是什么呢?我还有一个疑问就是示例程序中是load的模型的后缀是.mef,我们的离线模型生成的时候出现的是.cambricon和.cambricon_twins为后缀名的两个文件,所以我load时load的是.cambricon文件,我的这个操作是否 是错误的呢? 谢谢您!刚刚接触这部分,可能问题比较多展开
不是人为设置的,这些参数是对应网络结构的输入输出个数的,生成离线模型后保存在其中,通过接口获取到。
如果我输入的数据是16个3*224*224的数据,那么我*inputSizeS的大小是3*224*224的,还是16*3*224*224的?这个*inputSizeS是人为给定的吗(人为开辟一个空间,令指针指向这个空间)?谢谢您的解答展开
2、void **inputCpuPtrS = (void **)malloc(inputNum * sizeof(void *));void **outputCpuPtrS = (void **)malloc(outputNum * sizeof(void *));这两个是为cpu上的输入、输出构建了对应输入、输出个数的指针空间真正的数据处理是在下面的代码中:[代码][代码]展开
// prepare input buffer for (int i = 0; i < inputNum; i++) { // converts data format when using new interface model inputCpuPtrS[i] = malloc(inputSizeS[i]); // malloc mlu memory cnrtMalloc(&(inputMluPtrS[i]), inputSizeS[i]); cnrtMemcpy(inputMluPtrS[i], inputCpuPtrS[i], inputSizeS[i], CNRT_MEM_TRANS_DIR_HOST2DEV); }
// copy mlu result to cpu for (int i = 0; i < outputNum; i++) { cnrtMemcpy(outputCpuPtrS[i], outputMluPtrS[i], outputSizeS[i], CNRT_MEM_TRANS_DIR_DEV2HOST); }
请登录后评论