XiaoMi / mace

MACE is a deep learning inference framework optimized for mobile heterogeneous computing platforms.
Apache License 2.0
4.91k stars 820 forks source link

非签名调用dsp #737

Open xmy19029 opened 3 years ago

xmy19029 commented 3 years ago

hexagon SDK上说secure boot开启的手机上要调用dsp只能通过unsigned PD方式,我看mace也提供了这个函数。但是不知道大佬们有没有用谷歌的tflite,为什么tflite不用开启非签名就可以调用libhexagon_nn_skel.so?我用tflite换上我自己编译nnlib得到.so,就会报signature错误。很奇怪,他们怎么做的?

lu229 commented 3 years ago

@1173710201 谷歌是大厂,高通给了他们特殊的权限,其他框架没有这个权限。

xmy19029 commented 3 years ago

嗷嗷,怪不得。@lu229 大佬我还想请教下,mace开启非签名的函数是怎么实现的?

#pragma weak remote_session_control
int unsigned_pd = 0;
if ( remote_session_control ) {
    struct remote_rpc_control_unsigned_module data;
    data.enable = 1;
    data.domain = CDSP_DOMAIN_ID;
    err = remote_session_control(DSPRPC_CONTROL_UNSIGNED_MODULE, (void*)&data, sizeof(data));
}

SDK提供的这段开非签名的代码mace是用Hexagong SDK编译的吗?因为Hexagon SDK编译出的.so是32位qualcomm DSP6架构的,android应该无法直接用。mace是通过jni的.so来调用SDK得到的.so的吗? 因为我在mace里只找到了这个函数的声明,不知道它的实现方不方便公开呢?

lu229 commented 3 years ago

@xmy19029 你这段代码是MACE的?我没有看到呀,在哪个文件里?

xmy19029 commented 3 years ago

@lu229 您好!这就是高通hexagon SDK提供的开启unsigned PD的方法,mace用的不是这个方法吗?我看mace的setHexagonToUseUnsignedPD()是封装起来的,不知道具体咋实现的

lu229 commented 3 years ago

@xmy19029 你说的是SetHexagonToUnsignedPD? 这个具体实现可以看代码,我们是调用hexagon nn的函数:int hexnn_controller_request_unsigned_pd();

xmy19029 commented 3 years ago

好的,谢谢您!我看到了这个hexagon nn函数,是封装在libhexagon_controller.so中的,不知道这个so怎么生成的能告诉我吗?这里面还包含了dsp具体执行的函数,我想往里面插桩看转移代价。在tflite里面有个类似的libhexagon_interface.so,但是谷歌不公布源码,说是用到了高通的一些库他们没有权限公布。不知道小米这边方便嘛。

lu229 commented 3 years ago

@xmy19029 不客气,这个确实不方便,高通没有授权给我们,抱歉

xmy19029 commented 3 years ago

了解了解。大佬我还有个问题,我在/mace/runtimes/hexagon/dsp/hexagon_dsp_wrapper.cc里找到了如下代码:

bool HexagonDSPWrapper::RequestUnsignedPD() {
  int ret = hexnn_controller_request_unsigned_pd();
  if (ret != 0) {
    LOG(WARNING) << "Request unsigned PD failed: " << ret;
  }
  return ret == 0;
}

但是hexnn_controller_request_unsigned_pd()这个函数我只在third_party/nnlib/hexnn_dsp_controller.h看到。这个我不太懂,不需要通过dlopen去加载libhexagon_controller.so,然后加载hexnn_controller_request_unsigned_pd()这个函数嘛?

eclipse9527 commented 3 years ago

@xmy19029 hexnn_controller_request_unsigned_pd这个函数在nnlibhexnn_dsp_controller.c文件里,跟你上面提到的Hexagong SDK是同一种实现