Android caffe ForwardPrefilled()在多线程对象中不起作用

时间:2016-06-23 15:20:37

标签: android android-ndk caffe

我遇到了m_caffe_net-> forwardPrefilled的问题,但只有android线程案例。

我的算法是一个基本的caffe过程,例如:

加载模型 - >工序 - >得到结果。 (CPU模式)

如果我将代码集成到ui线程中,一切正常。但Android表示 由于冻结gui,这不是一个好的提示。

我测试了线程,AsyncTask和runnables,并且总是得到相同的SIGSEV 11错误

所以我在Android Studio中测试了我的调用栈,我注意到最后一次调用是omp_get_num_threads。

enter image description here

使用openmp set_num_threads omp函数在多核模式下执行forwardPrefilled()是否必要?

我的样本与此类似:

https://github.com/sh1r0/caffe-android-demo

Caffe lib编译是这样的:

https://github.com/sh1r0/caffe-android-lib

提前致谢。

1 个答案:

答案 0 :(得分:3)

最后我找到了解决方案:

我在caffe脚本/ build_caffe.sh文件中禁用了openmp选项。

cmake -DCMAKE_TOOLCHAIN_FILE="${WD}/android-cmake/android.toolchain.cmake" \
      -DANDROID_NDK="${NDK_ROOT}" \
      -DCMAKE_BUILD_TYPE=Release \
      -DANDROID_ABI="${ANDROID_ABI}" \
      -DANDROID_NATIVE_API_LEVEL=21 \
      -DANDROID_USE_OPENMP=OFF \
      -DADDITIONAL_FIND_PATH="${ANDROID_LIB_ROOT}" \
      -DBUILD_python=OFF \
      -DBUILD_docs=OFF \
      -DCPU_ONLY=ON \
      -DUSE_LMDB=ON \
      -DUSE_LEVELDB=OFF \
      -DUSE_HDF5=OFF \
      -DBLAS=${BLAS} \
      -DBOOST_ROOT="${BOOST_HOME}" \
      -DGFLAGS_INCLUDE_DIR="${GFLAGS_HOME}/include" \
      -DGFLAGS_LIBRARY="${GFLAGS_HOME}/lib/libgflags.a" \
      -DGLOG_INCLUDE_DIR="${GLOG_ROOT}/include" \
      -DGLOG_LIBRARY="${GLOG_ROOT}/lib/libglog.a" \
      -DOpenCV_DIR="${OPENCV_ROOT}" \
      -DPROTOBUF_PROTOC_EXECUTABLE="${ANDROID_LIB_ROOT}/protobuf_host/bin/protoc" \
      -DPROTOBUF_INCLUDE_DIR="${PROTOBUF_ROOT}/include" \
      -DPROTOBUF_LIBRARY="${PROTOBUF_ROOT}/lib/libprotobuf.a" \
      -DCMAKE_INSTALL_PREFIX="${ANDROID_LIB_ROOT}/caffe" \

结果有点慢但它有效:)。