Patchwork Support OpenMP for task parallelism on Android-ICS/GCC-4.7.2

login
register
mail settings
Submitter Geunsik Lim
Date Dec. 27, 2012, 12:39 a.m.
Message ID <1356568757-32119-1-git-send-email-geunsik.lim@gmail.com>
Download mbox | patch
Permalink /patch/208247/
State New
Headers show

Comments

Geunsik Lim - Dec. 27, 2012, 12:39 a.m.
From: Geunsik Lim <leemgs@gmail.com>

The patch supports OpenMP library to parallelize the existing
C/C++ code (e.g: for task parallelism) rapidly/easily without
any modification of android platform on multicore embedded devices.

The original patch is made by Keith Obenschain (using GCC 4.4.3).
. Archive - https://android-review.googlesource.com/#/c/34491/

I just moved GCC version from 4.4.3 to 4.7.2 for ktoolchain
version 2.5. The patch is good to me when I evaluate a lot of
C/C++ source code with OpenMP's #parama. we move the version
of OpenMP from version 2.5 to version 3.1.

Please, refer to the "kandroid toolchain" menu in www.kandroid.org
to compile source code including bionic and openmp library on real
Android devices.
http://kandroid.org/board/board.php?board=toolchain&command=body&no=16

I tested Openmp library with the latest GCC 4.7.2 on Android/ARM
devices as following. Please refer to the below example.

geunsik@rhel6$> ./arm-linux-androideabi-gcc   openmptest.c  -L
/usr/local/ktoolchain-cortexa9-ver2.5-20120515-bionic/arm-linux-androideabi/lib
 -lgomp  -o openmptest   [ENTER]
geunsik@rhel6$>
geunsik@rhel6$>
geunsik@rhel6$> file ./openmptest
./openmptest: ELF 32-bit LSB executable, ARM, version 1 (SYSV),
dynamically linked (uses shared libs), not stripped

Change-Id: I20cb3c1ac5c000445c043310158179723bd69fe2
Signed-off-by: Geunsik Lim <leemgs@gmail.com>
Acked-by: Geunsik Lim <geunsik.lim@gmail.com>
---
 gcc-4.7/gcc/config/arm/linux-eabi.h |    2 +-
 gcc-4.7/gcc/config/linux-android.h  |    3 +-
 gcc-4.7/libgomp/configure           |   52 ++++++++++++++++++++++++++++++++++-
 gcc-4.7/libgomp/configure.ac        |    9 +++++-
 gcc-4.7/libgomp/env.c               |    1 +
 5 files changed, 63 insertions(+), 4 deletions(-)
Richard Henderson - Jan. 2, 2013, 8:05 p.m.
On 12/26/2012 04:39 PM, Geunsik Lim wrote:
> diff --git a/gcc-4.7/gcc/config/linux-android.h b/gcc-4.7/gcc/config/linux-android.h
> index 033cfef..c6d9cdd 100644
> --- a/gcc-4.7/gcc/config/linux-android.h
> +++ b/gcc-4.7/gcc/config/linux-android.h
> @@ -53,7 +53,8 @@
>    "--noexecstack"
>  
>  #define ANDROID_LIB_SPEC \
> -  "%{!static: -ldl}"
> +  "%{!static: -ldl}" \
> +  "%{pthread:-lc}"
>  
...
> diff --git a/gcc-4.7/libgomp/configure.ac b/gcc-4.7/libgomp/configure.ac
> index d87ed29..292db2a 100644
> --- a/gcc-4.7/libgomp/configure.ac
> +++ b/gcc-4.7/libgomp/configure.ac
> @@ -184,6 +184,13 @@ AC_LINK_IFELSE(
>     void *g(void *d) { return NULL; }],
>    [pthread_t t; pthread_create(&t,NULL,g,NULL);])],
>   [XPCFLAGS=" -Wc,-pthread"],
> + [CFLAGS="$save_CFLAGS" LIBS="$LIBS"
> +  AC_LINK_IFELSE(
> +   [AC_LANG_PROGRAM(
> +    [#include <pthread.h>
> +     void *g(void *d) { return NULL; }],
> +    [pthread_t t; pthread_create(&t,NULL,g,NULL);])],
> +   [],
>   [CFLAGS="$save_CFLAGS" LIBS="-lpthread $LIBS"
>    AC_LINK_IFELSE(
>     [AC_LANG_PROGRAM(
> @@ -191,7 +198,7 @@ AC_LINK_IFELSE(
>       void *g(void *d) { return NULL; }],
>      [pthread_t t; pthread_create(&t,NULL,g,NULL);])],
>     [],
> -   [AC_MSG_ERROR([Pthreads are required to build libgomp])])])
> +   [AC_MSG_ERROR([Pthreads are required to build libgomp])])])])

Why do you need this change to configure.ac?

It sure looks as if the linux-android.h patch
makes the -pthread gcc parameter DTRT, and the
first existing test here is configure.ac will
default to using -pthread.

> --- a/gcc-4.7/libgomp/env.c
> +++ b/gcc-4.7/libgomp/env.c
> @@ -44,6 +44,7 @@
>  #endif
>  #include <limits.h>
>  #include <errno.h>
> +#include <asm/page.h>

This isn't correct.  What declaration are you after?


r~

Patch

diff --git a/gcc-4.7/gcc/config/arm/linux-eabi.h b/gcc-4.7/gcc/config/arm/linux-eabi.h
index 88811b7..ddeb627 100644
--- a/gcc-4.7/gcc/config/arm/linux-eabi.h
+++ b/gcc-4.7/gcc/config/arm/linux-eabi.h
@@ -87,7 +87,7 @@ 
 #undef  LIB_SPEC
 #define LIB_SPEC							\
   LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LIB_SPEC,			\
-		       GNU_USER_TARGET_LIB_SPEC " " ANDROID_LIB_SPEC)
+	               ANDROID_LIB_SPEC " " GNU_USER_TARGET_LIB_SPEC )
 
 #undef	STARTFILE_SPEC
 #define STARTFILE_SPEC \
diff --git a/gcc-4.7/gcc/config/linux-android.h b/gcc-4.7/gcc/config/linux-android.h
index 033cfef..c6d9cdd 100644
--- a/gcc-4.7/gcc/config/linux-android.h
+++ b/gcc-4.7/gcc/config/linux-android.h
@@ -53,7 +53,8 @@ 
   "--noexecstack"
 
 #define ANDROID_LIB_SPEC \
-  "%{!static: -ldl}"
+  "%{!static: -ldl}" \
+  "%{pthread:-lc}"
 
 #define ANDROID_STARTFILE_SPEC						\
   "%{shared: crtbegin_so%O%s;:"						\
diff --git a/gcc-4.7/libgomp/configure b/gcc-4.7/libgomp/configure
index 8ed841a..3c99b25 100755
--- a/gcc-4.7/libgomp/configure
+++ b/gcc-4.7/libgomp/configure
@@ -15013,7 +15013,54 @@  _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
   XPCFLAGS=" -Wc,-pthread"
 else
-  CFLAGS="$save_CFLAGS" LIBS="-lpthread $LIBS"
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+CFLAGS="$save_CFLAGS" LIBS="$LIBS"
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <pthread.h>
+     void *g(void *d) { return NULL; }
+int
+main ()
+{
+pthread_t t; pthread_create(&t,NULL,g,NULL);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+CFLAGS="$save_CFLAGS" LIBS="-lpthread $LIBS"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 #include <pthread.h>
@@ -15036,6 +15083,9 @@  rm -f core conftest.err conftest.$ac_objext \
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 
 # Check for functions needed.
 for ac_func in getloadavg clock_gettime strtoull
diff --git a/gcc-4.7/libgomp/configure.ac b/gcc-4.7/libgomp/configure.ac
index d87ed29..292db2a 100644
--- a/gcc-4.7/libgomp/configure.ac
+++ b/gcc-4.7/libgomp/configure.ac
@@ -184,6 +184,13 @@  AC_LINK_IFELSE(
    void *g(void *d) { return NULL; }],
   [pthread_t t; pthread_create(&t,NULL,g,NULL);])],
  [XPCFLAGS=" -Wc,-pthread"],
+ [CFLAGS="$save_CFLAGS" LIBS="$LIBS"
+  AC_LINK_IFELSE(
+   [AC_LANG_PROGRAM(
+    [#include <pthread.h>
+     void *g(void *d) { return NULL; }],
+    [pthread_t t; pthread_create(&t,NULL,g,NULL);])],
+   [],
  [CFLAGS="$save_CFLAGS" LIBS="-lpthread $LIBS"
   AC_LINK_IFELSE(
    [AC_LANG_PROGRAM(
@@ -191,7 +198,7 @@  AC_LINK_IFELSE(
      void *g(void *d) { return NULL; }],
     [pthread_t t; pthread_create(&t,NULL,g,NULL);])],
    [],
-   [AC_MSG_ERROR([Pthreads are required to build libgomp])])])
+   [AC_MSG_ERROR([Pthreads are required to build libgomp])])])])
 
 # Check for functions needed.
 AC_CHECK_FUNCS(getloadavg clock_gettime strtoull)
diff --git a/gcc-4.7/libgomp/env.c b/gcc-4.7/libgomp/env.c
index aff7490..98abd71 100644
--- a/gcc-4.7/libgomp/env.c
+++ b/gcc-4.7/libgomp/env.c
@@ -44,6 +44,7 @@ 
 #endif
 #include <limits.h>
 #include <errno.h>
+#include <asm/page.h>
 
 #ifndef HAVE_STRTOULL
 # define strtoull(ptr, eptr, base) strtoul (ptr, eptr, base)