Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
bb3a4163
O
Opencv
项目概览
Greenplum
/
Opencv
11 个月 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
bb3a4163
编写于
5月 19, 2017
作者:
R
Ryuhei Mori
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix cpu features detection on android
上级
913a2dbd
变更
7
展开全部
隐藏空白更改
内联
并排
Showing
7 changed file
with
589 addition
and
83 deletion
+589
-83
3rdparty/cpufeatures/CMakeLists.txt
3rdparty/cpufeatures/CMakeLists.txt
+29
-0
3rdparty/cpufeatures/cpu-features.c
3rdparty/cpufeatures/cpu-features.c
+409
-68
3rdparty/cpufeatures/cpu-features.h
3rdparty/cpufeatures/cpu-features.h
+134
-6
3rdparty/libwebp/CMakeLists.txt
3rdparty/libwebp/CMakeLists.txt
+2
-7
CMakeLists.txt
CMakeLists.txt
+4
-0
modules/core/CMakeLists.txt
modules/core/CMakeLists.txt
+2
-2
modules/core/src/system.cpp
modules/core/src/system.cpp
+9
-0
未找到文件。
3rdparty/cpufeatures/CMakeLists.txt
0 → 100644
浏览文件 @
bb3a4163
ocv_include_directories
(
${
CMAKE_CURRENT_SOURCE_DIR
}
)
file
(
GLOB cpuf_s *.c
)
file
(
GLOB cpuf_h *.h
)
set
(
lib_srcs
${
cpuf_s
}
)
set
(
lib_hdrs
${
cpuf_h
}
)
set
(
CPUFEATURES_INCLUDE_DIR
${
CMAKE_CURRENT_SOURCE_DIR
}
CACHE INTERNAL
""
)
set
(
CPUFEATURES_LIBRARIES cpufeatures CACHE INTERNAL
""
)
add_library
(
cpufeatures STATIC
${
lib_srcs
}
${
lib_hdrs
}
)
set_target_properties
(
cpufeatures
PROPERTIES OUTPUT_NAME cpufeatures
DEBUG_POSTFIX
"
${
OPENCV_DEBUG_POSTFIX
}
"
COMPILE_PDB_NAME cpufeatures
COMPILE_PDB_NAME_DEBUG
"cpufeatures
${
OPENCV_DEBUG_POSTFIX
}
"
ARCHIVE_OUTPUT_DIRECTORY
${
3P_LIBRARY_OUTPUT_PATH
}
)
if
(
ENABLE_SOLUTION_FOLDERS
)
set_target_properties
(
cpufeatures PROPERTIES FOLDER
"3rdparty"
)
endif
()
if
(
NOT BUILD_SHARED_LIBS
)
ocv_install_target
(
cpufeatures EXPORT OpenCVModules ARCHIVE DESTINATION
${
OPENCV_3P_LIB_INSTALL_PATH
}
COMPONENT dev
)
endif
()
3rdparty/
libwebp/cpu-
features/cpu-features.c
→
3rdparty/
cpu
features/cpu-features.c
浏览文件 @
bb3a4163
此差异已折叠。
点击以展开。
3rdparty/
libwebp/cpu-
features/cpu-features.h
→
3rdparty/
cpu
features/cpu-features.h
浏览文件 @
bb3a4163
...
...
@@ -33,21 +33,40 @@
__BEGIN_DECLS
/* A list of valid values returned by android_getCpuFamily().
* They describe the CPU Architecture of the current process.
*/
typedef
enum
{
ANDROID_CPU_FAMILY_UNKNOWN
=
0
,
ANDROID_CPU_FAMILY_ARM
,
ANDROID_CPU_FAMILY_X86
,
ANDROID_CPU_FAMILY_MIPS
,
ANDROID_CPU_FAMILY_ARM64
,
ANDROID_CPU_FAMILY_X86_64
,
ANDROID_CPU_FAMILY_MIPS64
,
ANDROID_CPU_FAMILY_MAX
/* do not remove */
}
AndroidCpuFamily
;
/* Return family of the device's CPU */
extern
AndroidCpuFamily
android_getCpuFamily
(
void
);
/* Return the CPU family of the current process.
*
* Note that this matches the bitness of the current process. I.e. when
* running a 32-bit binary on a 64-bit capable CPU, this will return the
* 32-bit CPU family value.
*/
extern
AndroidCpuFamily
android_getCpuFamily
(
void
);
/* Return a bitmap describing a set of optional CPU features that are
* supported by the current device's CPU. The exact bit-flags returned
* depend on the value returned by android_getCpuFamily(). See the
* documentation for the ANDROID_CPU_*_FEATURE_* flags below for details.
*/
extern
uint64_t
android_getCpuFeatures
(
void
);
/* The list of feature flags for ARM CPUs that can be recognized by the
* library. Value details are:
/* The list of feature flags for ANDROID_CPU_FAMILY_ARM that can be
* recognized by the library (see note below for 64-bit ARM). Value details
* are:
*
* VFPv2:
* CPU supports the VFPv2 instruction set. Many, but not all, ARMv6 CPUs
...
...
@@ -103,6 +122,27 @@ extern AndroidCpuFamily android_getCpuFamily(void);
* ARM CPU. This is only available on a few XScale-based CPU designs
* sold by Marvell. Pretty rare in practice.
*
* AES:
* CPU supports AES instructions. These instructions are only
* available for 32-bit applications running on ARMv8 CPU.
*
* CRC32:
* CPU supports CRC32 instructions. These instructions are only
* available for 32-bit applications running on ARMv8 CPU.
*
* SHA2:
* CPU supports SHA2 instructions. These instructions are only
* available for 32-bit applications running on ARMv8 CPU.
*
* SHA1:
* CPU supports SHA1 instructions. These instructions are only
* available for 32-bit applications running on ARMv8 CPU.
*
* PMULL:
* CPU supports 64-bit PMULL and PMULL2 instructions. These
* instructions are only available for 32-bit applications
* running on ARMv8 CPU.
*
* If you want to tell the compiler to generate code that targets one of
* the feature set above, you should probably use one of the following
* flags (for more details, see technical note at the end of this file):
...
...
@@ -150,6 +190,13 @@ extern AndroidCpuFamily android_getCpuFamily(void);
*
* -mcpu=iwmmxt
* Allows the use of iWMMXt instrinsics with GCC.
*
* IMPORTANT NOTE: These flags should only be tested when
* android_getCpuFamily() returns ANDROID_CPU_FAMILY_ARM, i.e. this is a
* 32-bit process.
*
* When running a 64-bit ARM process on an ARMv8 CPU,
* android_getCpuFeatures() will return a different set of bitflags
*/
enum
{
ANDROID_CPU_ARM_FEATURE_ARMv7
=
(
1
<<
0
),
...
...
@@ -164,18 +211,84 @@ enum {
ANDROID_CPU_ARM_FEATURE_IDIV_ARM
=
(
1
<<
9
),
ANDROID_CPU_ARM_FEATURE_IDIV_THUMB2
=
(
1
<<
10
),
ANDROID_CPU_ARM_FEATURE_iWMMXt
=
(
1
<<
11
),
ANDROID_CPU_ARM_FEATURE_AES
=
(
1
<<
12
),
ANDROID_CPU_ARM_FEATURE_PMULL
=
(
1
<<
13
),
ANDROID_CPU_ARM_FEATURE_SHA1
=
(
1
<<
14
),
ANDROID_CPU_ARM_FEATURE_SHA2
=
(
1
<<
15
),
ANDROID_CPU_ARM_FEATURE_CRC32
=
(
1
<<
16
),
};
/* The bit flags corresponding to the output of android_getCpuFeatures()
* when android_getCpuFamily() returns ANDROID_CPU_FAMILY_ARM64. Value details
* are:
*
* FP:
* CPU has Floating-point unit.
*
* ASIMD:
* CPU has Advanced SIMD unit.
*
* AES:
* CPU supports AES instructions.
*
* CRC32:
* CPU supports CRC32 instructions.
*
* SHA2:
* CPU supports SHA2 instructions.
*
* SHA1:
* CPU supports SHA1 instructions.
*
* PMULL:
* CPU supports 64-bit PMULL and PMULL2 instructions.
*/
enum
{
ANDROID_CPU_ARM64_FEATURE_FP
=
(
1
<<
0
),
ANDROID_CPU_ARM64_FEATURE_ASIMD
=
(
1
<<
1
),
ANDROID_CPU_ARM64_FEATURE_AES
=
(
1
<<
2
),
ANDROID_CPU_ARM64_FEATURE_PMULL
=
(
1
<<
3
),
ANDROID_CPU_ARM64_FEATURE_SHA1
=
(
1
<<
4
),
ANDROID_CPU_ARM64_FEATURE_SHA2
=
(
1
<<
5
),
ANDROID_CPU_ARM64_FEATURE_CRC32
=
(
1
<<
6
),
};
/* The bit flags corresponding to the output of android_getCpuFeatures()
* when android_getCpuFamily() returns ANDROID_CPU_FAMILY_X86 or
* ANDROID_CPU_FAMILY_X86_64.
*/
enum
{
ANDROID_CPU_X86_FEATURE_SSSE3
=
(
1
<<
0
),
ANDROID_CPU_X86_FEATURE_POPCNT
=
(
1
<<
1
),
ANDROID_CPU_X86_FEATURE_MOVBE
=
(
1
<<
2
),
ANDROID_CPU_X86_FEATURE_SSE4_1
=
(
1
<<
3
),
ANDROID_CPU_X86_FEATURE_SSE4_2
=
(
1
<<
4
),
ANDROID_CPU_X86_FEATURE_AES_NI
=
(
1
<<
5
),
ANDROID_CPU_X86_FEATURE_AVX
=
(
1
<<
6
),
ANDROID_CPU_X86_FEATURE_RDRAND
=
(
1
<<
7
),
ANDROID_CPU_X86_FEATURE_AVX2
=
(
1
<<
8
),
ANDROID_CPU_X86_FEATURE_SHA_NI
=
(
1
<<
9
),
};
/* The bit flags corresponding to the output of android_getCpuFeatures()
* when android_getCpuFamily() returns ANDROID_CPU_FAMILY_MIPS
* or ANDROID_CPU_FAMILY_MIPS64. Values are:
*
* R6:
* CPU executes MIPS Release 6 instructions natively, and
* supports obsoleted R1..R5 instructions only via kernel traps.
*
* MSA:
* CPU supports Mips SIMD Architecture instructions.
*/
enum
{
ANDROID_CPU_MIPS_FEATURE_R6
=
(
1
<<
0
),
ANDROID_CPU_MIPS_FEATURE_MSA
=
(
1
<<
1
),
};
extern
uint64_t
android_getCpuFeatures
(
void
);
/* Return the number of CPU cores detected on this device. */
extern
int
android_getCpuCount
(
void
);
extern
int
android_getCpuCount
(
void
);
/* The following is used to force the CPU count and features
* mask in sandboxed processes. Under 4.1 and higher, these processes
...
...
@@ -190,6 +303,21 @@ extern int android_getCpuCount(void);
extern
int
android_setCpu
(
int
cpu_count
,
uint64_t
cpu_features
);
#ifdef __arm__
/* Retrieve the ARM 32-bit CPUID value from the kernel.
* Note that this cannot work on sandboxed processes under 4.1 and
* higher, unless you called android_setCpuArm() before.
*/
extern
uint32_t
android_getCpuIdArm
(
void
);
/* An ARM-specific variant of android_setCpu() that also allows you
* to set the ARM CPUID field.
*/
extern
int
android_setCpuArm
(
int
cpu_count
,
uint64_t
cpu_features
,
uint32_t
cpu_id
);
#endif
__END_DECLS
#endif
/* CPU_FEATURES_H */
3rdparty/libwebp/CMakeLists.txt
浏览文件 @
bb3a4163
...
...
@@ -5,7 +5,7 @@
project
(
${
WEBP_LIBRARY
}
)
ocv_include_directories
(
${
CMAKE_CURRENT_SOURCE_DIR
}
)
ocv_include_directories
(
"
${
C
MAKE_CURRENT_SOURCE_DIR
}
/cpu-features
"
)
ocv_include_directories
(
"
${
C
PUFEATURES_INCLUDE_DIR
}
"
)
file
(
GLOB lib_srcs dec/*.c demux/*.c dsp/*.c enc/*.c mux/*.c utils/*.c webp/*.c
)
file
(
GLOB lib_hdrs dec/*.h demux/*.h dsp/*.h enc/*.h mux/*.h utils/*.h webp/*.h
)
...
...
@@ -19,13 +19,7 @@ if(ANDROID AND ARMEABI_V7A AND NOT NEON)
endforeach
()
endif
()
file
(
GLOB cpuf_s cpu-features/*.c
)
file
(
GLOB cpuf_h cpu-features/*.h
)
if
(
ANDROID
)
set
(
lib_srcs
${
lib_srcs
}
${
cpuf_s
}
)
set
(
lib_hdrs
${
lib_hdrs
}
${
cpuf_h
}
)
endif
()
# ----------------------------------------------------------------------------------
# Define the library target:
...
...
@@ -34,6 +28,7 @@ endif()
add_definitions
(
-DWEBP_USE_THREAD
)
add_library
(
${
WEBP_LIBRARY
}
STATIC
${
lib_srcs
}
${
lib_hdrs
}
)
target_link_libraries
(
${
WEBP_LIBRARY
}
${
CPUFEATURES_LIBRARIES
}
)
if
(
UNIX
)
if
(
CMAKE_COMPILER_IS_GNUCXX OR CV_ICC
)
...
...
CMakeLists.txt
浏览文件 @
bb3a4163
...
...
@@ -573,6 +573,10 @@ endif()
# Detect 3rd-party libraries
# ----------------------------------------------------------------------------
if
(
ANDROID
)
add_subdirectory
(
3rdparty/cpufeatures
)
endif
()
include
(
cmake/OpenCVFindLibsGrfmt.cmake
)
include
(
cmake/OpenCVFindLibsGUI.cmake
)
include
(
cmake/OpenCVFindLibsVideo.cmake
)
...
...
modules/core/CMakeLists.txt
浏览文件 @
bb3a4163
...
...
@@ -32,10 +32,10 @@ source_group("Src" FILES "${OPENCV_MODULE_opencv_core_BINARY_DIR}/version_string
ocv_glob_module_sources
(
SOURCES
"
${
OPENCV_MODULE_opencv_core_BINARY_DIR
}
/version_string.inc"
HEADERS
${
lib_cuda_hdrs
}
${
lib_cuda_hdrs_detail
}
)
ocv_module_include_directories
(
${
the_module
}
${
ZLIB_INCLUDE_DIRS
}
${
OPENCL_INCLUDE_DIRS
}
)
ocv_module_include_directories
(
${
the_module
}
${
ZLIB_INCLUDE_DIRS
}
${
OPENCL_INCLUDE_DIRS
}
${
CPUFEATURES_INCLUDE_DIR
}
)
ocv_create_module
(
${
extra_libs
}
)
ocv_target_link_libraries
(
${
the_module
}
${
ZLIB_LIBRARIES
}
"
${
OPENCL_LIBRARIES
}
"
"
${
VA_LIBRARIES
}
"
"
${
LAPACK_LIBRARIES
}
"
)
ocv_target_link_libraries
(
${
the_module
}
${
ZLIB_LIBRARIES
}
"
${
OPENCL_LIBRARIES
}
"
"
${
VA_LIBRARIES
}
"
"
${
LAPACK_LIBRARIES
}
"
"
${
CPUFEATURES_LIBRARIES
}
"
)
ocv_add_accuracy_tests
()
ocv_add_perf_tests
()
modules/core/src/system.cpp
浏览文件 @
bb3a4163
...
...
@@ -73,6 +73,10 @@ Mutex* __initialization_mutex_initializer = &getInitializationMutex();
#endif
#endif
#if defined ANDROID
# include <cpu-features.h>
#endif
#if defined WIN32 || defined _WIN32 || defined WINCE
#ifndef _WIN32_WINNT // This is needed for the declaration of TryEnterCriticalSection in winbase.h with Visual Studio 2005 (and older?)
#define _WIN32_WINNT 0x0400 // http://msdn.microsoft.com/en-us/library/ms686857(VS.85).aspx
...
...
@@ -467,6 +471,11 @@ struct HWFeatures
close
(
cpufile
);
}
#ifdef ANDROID
uint64_t
features
=
android_getCpuFeatures
();
have
[
CV_CPU_NEON
]
=
(
features
&
ANDROID_CPU_ARM_FEATURE_NEON
)
!=
0
;
have
[
CV_CPU_FP16
]
=
(
features
&
ANDROID_CPU_ARM_FEATURE_VFP_FP16
)
!=
0
;
#endif
#endif
#elif (defined __clang__ || defined __APPLE__)
#if (defined __ARM_NEON__ || (defined __ARM_NEON && defined __aarch64__))
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录