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/.tags/v0.2.15^2
| @@ -1,13 +1,23 @@ | |||||
| # ifeq logical or | # ifeq logical or | ||||
| ifeq ($(CORE), $(filter $(CORE),CORTEXA9 CORTEXA15)) | 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 | CCOMMON_OPT += -marm -mfpu=vfpv3 -mfloat-abi=hard -march=armv7-a | ||||
| FCOMMON_OPT += -marm -mfpu=vfpv3 -mfloat-abi=hard -march=armv7-a | FCOMMON_OPT += -marm -mfpu=vfpv3 -mfloat-abi=hard -march=armv7-a | ||||
| endif | endif | ||||
| endif | |||||
| ifeq ($(CORE), ARMV7) | 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 | CCOMMON_OPT += -marm -mfpu=vfpv3 -mfloat-abi=hard -march=armv7-a | ||||
| FCOMMON_OPT += -marm -mfpu=vfpv3 -mfloat-abi=hard -march=armv7-a | FCOMMON_OPT += -marm -mfpu=vfpv3 -mfloat-abi=hard -march=armv7-a | ||||
| endif | endif | ||||
| endif | |||||
| ifeq ($(CORE), ARMV6) | ifeq ($(CORE), ARMV6) | ||||
| CCOMMON_OPT += -marm -mfpu=vfp -mfloat-abi=hard -march=armv6 | CCOMMON_OPT += -marm -mfpu=vfp -mfloat-abi=hard -march=armv6 | ||||
| @@ -57,6 +57,7 @@ $os = osf if ($data =~ /OS_OSF/); | |||||
| $os = WINNT if ($data =~ /OS_WINNT/); | $os = WINNT if ($data =~ /OS_WINNT/); | ||||
| $os = CYGWIN_NT if ($data =~ /OS_CYGWIN_NT/); | $os = CYGWIN_NT if ($data =~ /OS_CYGWIN_NT/); | ||||
| $os = Interix if ($data =~ /OS_INTERIX/); | $os = Interix if ($data =~ /OS_INTERIX/); | ||||
| $os = Android if ($data =~ /OS_ANDROID/); | |||||
| $architecture = x86 if ($data =~ /ARCH_X86/); | $architecture = x86 if ($data =~ /ARCH_X86/); | ||||
| $architecture = x86_64 if ($data =~ /ARCH_X86_64/); | $architecture = x86_64 if ($data =~ /ARCH_X86_64/); | ||||
| @@ -93,6 +93,10 @@ extern "C" { | |||||
| #include <sched.h> | #include <sched.h> | ||||
| #endif | #endif | ||||
| #ifdef OS_ANDROID | |||||
| #define NO_SYSV_IPC | |||||
| #endif | |||||
| #ifdef OS_WINDOWS | #ifdef OS_WINDOWS | ||||
| #ifdef ATOM | #ifdef ATOM | ||||
| #define GOTO_ATOM ATOM | #define GOTO_ATOM ATOM | ||||
| @@ -106,7 +110,9 @@ extern "C" { | |||||
| #endif | #endif | ||||
| #else | #else | ||||
| #include <sys/mman.h> | #include <sys/mman.h> | ||||
| #ifndef NO_SYSV_IPC | |||||
| #include <sys/shm.h> | #include <sys/shm.h> | ||||
| #endif | |||||
| #include <sys/time.h> | #include <sys/time.h> | ||||
| #include <unistd.h> | #include <unistd.h> | ||||
| #include <math.h> | #include <math.h> | ||||
| @@ -44,6 +44,10 @@ COMPILER_DEC | |||||
| COMPILER_GNU | COMPILER_GNU | ||||
| #endif | #endif | ||||
| #if defined(__ANDROID__) | |||||
| OS_ANDROID | |||||
| #endif | |||||
| #if defined(__linux__) | #if defined(__linux__) | ||||
| OS_LINUX | OS_LINUX | ||||
| #endif | #endif | ||||
| @@ -90,7 +90,9 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
| #ifndef OS_WINDOWS | #ifndef OS_WINDOWS | ||||
| #include <sys/mman.h> | #include <sys/mman.h> | ||||
| #ifndef NO_SYSV_IPC | |||||
| #include <sys/shm.h> | #include <sys/shm.h> | ||||
| #endif | |||||
| #include <sys/ipc.h> | #include <sys/ipc.h> | ||||
| #endif | #endif | ||||
| @@ -169,6 +171,14 @@ int get_num_procs(void) { | |||||
| #endif | #endif | ||||
| #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 | #ifdef OS_WINDOWS | ||||
| int get_num_procs(void) { | int get_num_procs(void) { | ||||
| @@ -266,7 +276,7 @@ void openblas_fork_handler() | |||||
| // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60035 | // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60035 | ||||
| // In the mean time build with USE_OPENMP=0 or link against another | // In the mean time build with USE_OPENMP=0 or link against another | ||||
| // implementation of OpenMP. | // implementation of OpenMP. | ||||
| #if !defined(OS_WINDOWS) && defined(SMP_SERVER) | |||||
| #if !(defined(OS_WINDOWS) || defined(OS_ANDROID)) && defined(SMP_SERVER) | |||||
| int err; | int err; | ||||
| err = pthread_atfork ((void (*)(void)) BLASFUNC(blas_thread_shutdown), NULL, NULL); | err = pthread_atfork ((void (*)(void)) BLASFUNC(blas_thread_shutdown), NULL, NULL); | ||||
| if(err != 0) | if(err != 0) | ||||
| @@ -276,7 +286,7 @@ void openblas_fork_handler() | |||||
| int blas_get_cpu_number(void){ | int blas_get_cpu_number(void){ | ||||
| env_var_t p; | 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; | int max_num; | ||||
| #endif | #endif | ||||
| int blas_goto_num = 0; | int blas_goto_num = 0; | ||||
| @@ -284,7 +294,7 @@ int blas_get_cpu_number(void){ | |||||
| if (blas_num_threads) return blas_num_threads; | 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(); | max_num = get_num_procs(); | ||||
| #endif | #endif | ||||
| @@ -308,7 +318,7 @@ int blas_get_cpu_number(void){ | |||||
| else if (blas_omp_num > 0) blas_num_threads = blas_omp_num; | else if (blas_omp_num > 0) blas_num_threads = blas_omp_num; | ||||
| else blas_num_threads = MAX_CPU_NUMBER; | 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; | if (blas_num_threads > max_num) blas_num_threads = max_num; | ||||
| #endif | #endif | ||||