Android caffe Forward Prefilled() 在多线程对象中不起作用
Android caffe ForwardPrefilled() doesn't work in Multithread objects
我在使用 m_caffe_net->forwardPrefilled 时遇到问题,但仅限于 android 线程情况。
我的算法是一个基本的caffe过程如:
加载模型->处理->得到结果。 (CPU模式)
如果我将代码集成到 ui 线程中,一切正常。但是 Android 说
这不是一个好的提示,因为冻结了 gui。
我测试了线程、AsyncTask 和可运行对象,并且总是得到相同的 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
提前致谢。
终于找到了解决办法:
我在 caffe script/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" \
结果有点慢,但它有效:)。
我在使用 m_caffe_net->forwardPrefilled 时遇到问题,但仅限于 android 线程情况。
我的算法是一个基本的caffe过程如:
加载模型->处理->得到结果。 (CPU模式)
如果我将代码集成到 ui 线程中,一切正常。但是 Android 说 这不是一个好的提示,因为冻结了 gui。
我测试了线程、AsyncTask 和可运行对象,并且总是得到相同的 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
提前致谢。
终于找到了解决办法:
我在 caffe script/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" \
结果有点慢,但它有效:)。