我遇到了m_caffe_net-> forwardPrefilled的问题,但只有android线程案例。
我的算法是一个基本的caffe过程,例如:
加载模型 - >工序 - >得到结果。 (CPU模式)
如果我将代码集成到ui线程中,一切正常。但Android表示 由于冻结gui,这不是一个好的提示。
我测试了线程,AsyncTask和runnables,并且总是得到相同的SIGSEV 11错误
所以我在Android Studio中测试了我的调用栈,我注意到最后一次调用是omp_get_num_threads。
使用openmp set_num_threads omp函数在多核模式下执行forwardPrefilled()是否必要?
我的样本与此类似:
https://github.com/sh1r0/caffe-android-demo
Caffe lib编译是这样的:
https://github.com/sh1r0/caffe-android-lib
提前致谢。
答案 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" \
结果有点慢但它有效:)。