From a11555c71570eda09779496314a1a31ee6b43e4c Mon Sep 17 00:00:00 2001 From: Zhang Xianyi Date: Wed, 20 May 2015 21:57:27 -0500 Subject: [PATCH] Support Android NDK armeabi-v7a-hard ABI. (-mfloat-abi=hard) e.g. make HOSTCC=gcc CC=arm-linux-androideabi-gcc NO_LAPACK=1 TARGET=ARMV7 In Android NDK, it uses armeabi-v7a-hard ABI. TARGET_CFLAGS += -mhard-float -D_NDK_MATH_NO_SOFTFP=1 TARGET_LDFLAGS += -Wl,--no-warn-mismatch -lm_hard For more information, please check hard-float example at android_ndk/tests/device/hard-float/jni/. --- Makefile.arm | 10 ++++++++++ c_check | 1 + common.h | 6 ++++++ ctest.c | 4 ++++ driver/others/memory.c | 18 ++++++++++++++---- 5 files changed, 35 insertions(+), 4 deletions(-) diff --git a/Makefile.arm b/Makefile.arm index 9978a67..2f7b337 100644 --- a/Makefile.arm +++ b/Makefile.arm @@ -1,13 +1,23 @@ # ifeq logical or ifeq ($(CORE), $(filter $(CORE),CORTEXA9 CORTEXA15)) +ifeq ($(OSNAME), Android) +CCOMMON_OPT += -marm -mfpu=neon -mfloat-abi=hard -march=armv7-a +FCOMMON_OPT += -marm -mfpu=neon -mfloat-abi=hard -march=armv7-a +else CCOMMON_OPT += -marm -mfpu=vfpv3 -mfloat-abi=hard -march=armv7-a FCOMMON_OPT += -marm -mfpu=vfpv3 -mfloat-abi=hard -march=armv7-a endif +endif ifeq ($(CORE), ARMV7) +ifeq ($(OSNAME), Android) +CCOMMON_OPT += -marm -mfpu=neon -mfloat-abi=hard -march=armv7-a +FCOMMON_OPT += -marm -mfpu=neon -mfloat-abi=hard -march=armv7-a +else CCOMMON_OPT += -marm -mfpu=vfpv3 -mfloat-abi=hard -march=armv7-a FCOMMON_OPT += -marm -mfpu=vfpv3 -mfloat-abi=hard -march=armv7-a endif +endif ifeq ($(CORE), ARMV6) CCOMMON_OPT += -marm -mfpu=vfp -mfloat-abi=hard -march=armv6 diff --git a/c_check b/c_check index 99de070..0fdadb6 100644 --- a/c_check +++ b/c_check @@ -57,6 +57,7 @@ $os = osf if ($data =~ /OS_OSF/); $os = WINNT if ($data =~ /OS_WINNT/); $os = CYGWIN_NT if ($data =~ /OS_CYGWIN_NT/); $os = Interix if ($data =~ /OS_INTERIX/); +$os = Android if ($data =~ /OS_ANDROID/); $architecture = x86 if ($data =~ /ARCH_X86/); $architecture = x86_64 if ($data =~ /ARCH_X86_64/); diff --git a/common.h b/common.h index cf25fd5..320adad 100644 --- a/common.h +++ b/common.h @@ -93,6 +93,10 @@ extern "C" { #include #endif +#ifdef OS_ANDROID +#define NO_SYSV_IPC +#endif + #ifdef OS_WINDOWS #ifdef ATOM #define GOTO_ATOM ATOM @@ -106,7 +110,9 @@ extern "C" { #endif #else #include +#ifndef NO_SYSV_IPC #include +#endif #include #include #include diff --git a/ctest.c b/ctest.c index d5c2247..b5c74f1 100644 --- a/ctest.c +++ b/ctest.c @@ -44,6 +44,10 @@ COMPILER_DEC COMPILER_GNU #endif +#if defined(__ANDROID__) +OS_ANDROID +#endif + #if defined(__linux__) OS_LINUX #endif diff --git a/driver/others/memory.c b/driver/others/memory.c index a9a80b8..a562da3 100644 --- a/driver/others/memory.c +++ b/driver/others/memory.c @@ -90,7 +90,9 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef OS_WINDOWS #include +#ifndef NO_SYSV_IPC #include +#endif #include #endif @@ -169,6 +171,14 @@ int get_num_procs(void) { #endif #endif +#ifdef OS_ANDROID +int get_num_procs(void) { + static int nums = 0; + if (!nums) nums = sysconf(_SC_NPROCESSORS_ONLN); + return nums; +} +#endif + #ifdef OS_WINDOWS int get_num_procs(void) { @@ -266,7 +276,7 @@ void openblas_fork_handler() // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60035 // In the mean time build with USE_OPENMP=0 or link against another // implementation of OpenMP. -#if !defined(OS_WINDOWS) && defined(SMP_SERVER) +#if !(defined(OS_WINDOWS) || defined(OS_ANDROID)) && defined(SMP_SERVER) int err; err = pthread_atfork ((void (*)(void)) BLASFUNC(blas_thread_shutdown), NULL, NULL); if(err != 0) @@ -276,7 +286,7 @@ void openblas_fork_handler() int blas_get_cpu_number(void){ env_var_t p; -#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FREEBSD) || defined(OS_DARWIN) +#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FREEBSD) || defined(OS_DARWIN) || defined(OS_ANDROID) int max_num; #endif int blas_goto_num = 0; @@ -284,7 +294,7 @@ int blas_get_cpu_number(void){ if (blas_num_threads) return blas_num_threads; -#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FREEBSD) || defined(OS_DARWIN) +#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FREEBSD) || defined(OS_DARWIN) || defined(OS_ANDROID) max_num = get_num_procs(); #endif @@ -308,7 +318,7 @@ int blas_get_cpu_number(void){ else if (blas_omp_num > 0) blas_num_threads = blas_omp_num; else blas_num_threads = MAX_CPU_NUMBER; -#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FREEBSD) || defined(OS_DARWIN) +#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FREEBSD) || defined(OS_DARWIN) || defined(OS_ANDROID) if (blas_num_threads > max_num) blas_num_threads = max_num; #endif -- 2.7.4