--- Begin Message ---
Package: openmpi
Version: 1.2.7~rc2-1
Tags: patch
Severity: wishlist
I believe the appended patch is sufficient to add Linux/MIPS support
to openmpi (for both the mips and mipsel variants). That said, I wasn't
able to build and test it, due to some libtool-induced trouble:
- With just this patch, ./libtool gets triggered and falls over an
undefined CDPATH variable:
[...]
Making all in asm
make[3]: Entering directory `/srv/ths/debian/openmpi/openmpi-1.2.7~rc2/opal/asm'
depbase=`echo asm.lo | sed 's|[^/]*$|.deps/&|;s|\.lo$||'`;\
/bin/sh ../../libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I.
-I../../opal/include -I../../orte/include -I../../ompi/include -I../..
-DNDEBUG -Wall -g -O2 -finline-functions -fno-strict-aliasing -pthread -MT
asm.lo -MD -MP -MF $depbase.Tpo -c -o asm.lo asm.c &&\
mv -f $depbase.Tpo $depbase.Plo
../../libtool: line 463: CDPATH: command not found
../../libtool: line 1266: func_opt_split: command not found
libtool: Version mismatch error. This is libtool 2.1a, but the
libtool: definition of this LT_INIT comes from an older release.
libtool: You should recreate aclocal.m4 with macros from libtool 2.1a
libtool: and run autoconf again.
make[3]: *** [asm.lo] Error 63
make[3]: Leaving directory `/srv/ths/debian/openmpi/openmpi-1.2.7~rc2/opal/asm'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/srv/ths/debian/openmpi/openmpi-1.2.7~rc2/opal'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/srv/ths/debian/openmpi/openmpi-1.2.7~rc2'
make: *** [build] Error 2
dpkg-buildpackage: failure: debian/rules build gave error exit status 2
- The native approach of re-libtoolizing broke down in opal/libltdl,
which does some special libtool handling I couldn't figure out.
Thiemo
Index: openmpi-1.2.7~rc2/config/ompi_config_asm.m4
===================================================================
--- openmpi-1.2.7~rc2.orig/config/ompi_config_asm.m4 2007-12-06
20:20:58.000000000 +0000
+++ openmpi-1.2.7~rc2/config/ompi_config_asm.m4 2008-07-03 18:21:34.000000000
+0100
@@ -873,6 +873,18 @@
OMPI_GCC_INLINE_ASSIGN='"bis [$]31,[$]31,%0" : "=&r"(ret)'
;;
+ mips64*-linux-*)
+ ompi_cv_asm_arch="MIPS"
+ OMPI_ASM_SUPPORT_64BIT=1
+ OMPI_GCC_INLINE_ASSIGN='"or %0,[$]0,[$]0" : "=&r"(ret)'
+ ;;
+
+ mips*-linux-*)
+ ompi_cv_asm_arch="MIPS"
+ OMPI_ASM_SUPPORT_64BIT=0
+ OMPI_GCC_INLINE_ASSIGN='"or %0,[$]0,[$]0" : "=&r"(ret)'
+ ;;
+
mips-*|mips64-*)
# Should really find some way to make sure that we are on
# a MIPS III machine (r4000 and later)
Index: openmpi-1.2.7~rc2/debian/control
===================================================================
--- openmpi-1.2.7~rc2.orig/debian/control 2008-07-03 18:21:22.000000000
+0100
+++ openmpi-1.2.7~rc2/debian/control 2008-07-03 18:21:34.000000000 +0100
@@ -12,7 +12,7 @@
XS-Dm-Upload-Allowed: yes
Package: openmpi-bin
-Architecture: alpha amd64 i386 ia64 powerpc ppc64 sparc kfreebsd-i386
kfreebsd-amd64 hurd-i386
+Architecture: alpha amd64 i386 ia64 powerpc ppc64 sparc kfreebsd-i386
kfreebsd-amd64 hurd-i386 mips mipsel
Depends: ${shlibs:Depends}, ${misc:Depends}, openmpi-common (=
${source:Version})
Suggests: gfortran
Description: high performance message passing library -- binaries
@@ -40,7 +40,7 @@
Package: libopenmpi-dev
Section: libdevel
-Architecture: alpha amd64 i386 ia64 powerpc ppc64 sparc kfreebsd-i386
kfreebsd-amd64 hurd-i386
+Architecture: alpha amd64 i386 ia64 powerpc ppc64 sparc kfreebsd-i386
kfreebsd-amd64 hurd-i386 mips mipsel
Depends: ${shlibs:Depends}, libopenmpi1 (= ${binary:Version}), openmpi-common
(= ${source:Version})
Conflicts: libopal-dev, pgapack (<= 1.0.0.1-4.2), openmpi-dev
Replaces: openmpi-dev, openmpi-bin (<= 1.2.4-0)
@@ -57,7 +57,7 @@
Package: libopenmpi1
Section: libs
-Architecture: alpha amd64 i386 ia64 powerpc ppc64 sparc kfreebsd-i386
kfreebsd-amd64 hurd-i386
+Architecture: alpha amd64 i386 ia64 powerpc ppc64 sparc kfreebsd-i386
kfreebsd-amd64 hurd-i386 mips mipsel
Depends: ${shlibs:Depends}, ${misc:Depends}
Conflicts: openmpi-libs0
Replaces: openmpi-libs0
@@ -100,7 +100,7 @@
Package: libopenmpi-dbg
Section: devel
-Architecture: alpha amd64 i386 ia64 powerpc ppc64 sparc kfreebsd-i386
kfreebsd-amd64 hurd-i386
+Architecture: alpha amd64 i386 ia64 powerpc ppc64 sparc kfreebsd-i386
kfreebsd-amd64 hurd-i386 mips mipsel
Depends: openmpi-bin (= ${binary:Version}), libopenmpi1 (= ${binary:Version})
Conflicts: openmpi-dbg
Replaces: openmpi-dbg
Index: openmpi-1.2.7~rc2/opal/asm/asm-data.txt
===================================================================
--- openmpi-1.2.7~rc2.orig/opal/asm/asm-data.txt 2006-11-09
18:53:28.000000000 +0000
+++ openmpi-1.2.7~rc2/opal/asm/asm-data.txt 2008-07-03 18:21:34.000000000
+0100
@@ -126,3 +126,7 @@
# means that we can use the same code either way. Woo hoo!
MIPS default-.text-.globl-:--L--1-1-1-1-0 mips-irix
+MIPS default-.text-.globl-:--L-@-1-1-1-1-1 mips64-linux
+
+# However, this doesn't hold true for 32-bit MIPS as used on Linux.
+MIPS default-.text-.globl-:--L-@-1-1-1-0-1 mips-linux
Index: openmpi-1.2.7~rc2/opal/include/opal/sys/mips/atomic.h
===================================================================
--- openmpi-1.2.7~rc2.orig/opal/include/opal/sys/mips/atomic.h 2006-08-15
21:13:38.000000000 +0100
+++ openmpi-1.2.7~rc2/opal/include/opal/sys/mips/atomic.h 2008-07-03
18:21:34.000000000 +0100
@@ -23,10 +23,17 @@
#if OMPI_WANT_SMP_LOCKS
/* BWB - FIX ME! */
+#ifdef __linux__
+#define MB() __asm__ __volatile__(".set mips2; sync; .set mips0": : :"memory")
+#define RMB() __asm__ __volatile__(".set mips2; sync; .set mips0": : :"memory")
+#define WMB() __asm__ __volatile__(".set mips2; sync; .set mips0": : :"memory")
+#define SMP_SYNC ".set mips2; sync; .set mips0"
+#else
#define MB() __asm__ __volatile__("sync": : :"memory")
#define RMB() __asm__ __volatile__("sync": : :"memory")
#define WMB() __asm__ __volatile__("sync": : :"memory")
#define SMP_SYNC "sync"
+#endif
#else
@@ -46,8 +53,10 @@
#define OPAL_HAVE_ATOMIC_MEM_BARRIER 1
#define OPAL_HAVE_ATOMIC_CMPSET_32 1
-#define OPAL_HAVE_ATOMIC_CMPSET_64 1
+#ifdef __mips64
+#define OPAL_HAVE_ATOMIC_CMPSET_64 1
+#endif
/**********************************************************************
*
@@ -92,16 +101,23 @@
int32_t tmp;
__asm__ __volatile__ ("\t"
- ".set noreorder \n"
- "1: \n\t"
- "ll %0, %2 \n\t" /* load *addr into ret */
- "bne %0, %3, 2f \n\t" /* done if oldval != ret */
- "or %5, %4, 0 \n\t" /* ret = newval */
- "sc %5, %2 \n\t" /* store ret in *addr */
+ ".set noreorder \n"
+ "1: \n\t"
+#ifdef __linux__
+ ".set mips2 \n\t"
+#endif
+ "ll %0, %2 \n\t" /* load *addr into ret */
+ "bne %0, %3, 2f \n\t" /* done if oldval != ret */
+ "or %5, %4, 0 \n\t" /* ret = newval */
+ "sc %5, %2 \n\t" /* store ret in *addr */
+#ifdef __linux__
+ ".set mips0 \n\t"
+#endif
/* note: ret will be 0 if failed, 1 if succeeded */
"bne %5, 1, 1b \n\t"
+ "nop \n"
"2: \n\t"
- ".set reorder \n"
+ ".set reorder \n"
: "=&r"(ret), "=m"(*addr)
: "m"(*addr), "r"(oldval), "r"(newval), "r"(tmp)
: "cc", "memory");
@@ -133,7 +149,7 @@
return opal_atomic_cmpset_32(addr, oldval, newval);
}
-
+#ifdef OPAL_HAVE_ATOMIC_CMPSET_64
static inline int opal_atomic_cmpset_64(volatile int64_t *addr,
int64_t oldval, int64_t newval)
{
@@ -141,16 +157,17 @@
int64_t tmp;
__asm__ __volatile__ ("\t"
- ".set noreorder \n"
- "1: \n\t"
- "lld %0, %2 \n\t" /* load *addr into ret */
- "bne %0, %3, 2f \n\t" /* done if oldval != ret */
- "or %5, %4, 0 \n\t" /* tmp = newval */
- "scd %5, %2 \n\t" /* store tmp in *addr */
+ ".set noreorder \n"
+ "1: \n\t"
+ "lld %0, %2 \n\t" /* load *addr into ret */
+ "bne %0, %3, 2f \n\t" /* done if oldval != ret */
+ "or %5, %4, 0 \n\t" /* tmp = newval */
+ "scd %5, %2 \n\t" /* store tmp in *addr */
/* note: ret will be 0 if failed, 1 if succeeded */
- "bne %5, 1, 1b \n"
+ "bne %5, 1, 1b \n\t"
+ "nop \n"
"2: \n\t"
- ".set reorder \n"
+ ".set reorder \n"
: "=&r" (ret), "=m" (*addr)
: "m" (*addr), "r" (oldval), "r" (newval),
"r"(tmp)
@@ -183,6 +200,7 @@
opal_atomic_wmb();
return opal_atomic_cmpset_64(addr, oldval, newval);
}
+#endif /* OPAL_HAVE_ATOMIC_CMPSET_64 */
#endif /* OMPI_GCC_INLINE_ASSEMBLY */
Index: openmpi-1.2.7~rc2/opal/asm/base/MIPS.asm
===================================================================
--- openmpi-1.2.7~rc2.orig/opal/asm/base/MIPS.asm 2006-08-15
21:13:33.000000000 +0100
+++ openmpi-1.2.7~rc2/opal/asm/base/MIPS.asm 2008-07-03 18:21:34.000000000
+0100
@@ -1,26 +1,48 @@
START_FILE
+#ifdef __linux__
+#include <sys/asm.h>
+#else
#include <asm.h>
+#endif
#include <regdef.h>
TEXT
ALIGN(8)
LEAF(opal_atomic_mb)
- sync
+#ifdef __linux__
+ .set mips2
+#endif
+ sync
+#ifdef __linux__
+ .set mips0
+#endif
j ra
END(opal_atomic_mb)
ALIGN(8)
LEAF(opal_atomic_rmb)
- sync
+#ifdef __linux__
+ .set mips2
+#endif
+ sync
+#ifdef __linux__
+ .set mips0
+#endif
j ra
END(opal_atomic_rmb)
LEAF(opal_atomic_wmb)
- sync
+#ifdef __linux__
+ .set mips2
+#endif
+ sync
+#ifdef __linux__
+ .set mips0
+#endif
j ra
END(opal_atomic_wmb)
@@ -28,10 +50,22 @@
LEAF(opal_atomic_cmpset_32)
.set noreorder
retry1:
+#ifdef __linux__
+ .set mips2
+#endif
ll $3, 0($4)
+#ifdef __linux__
+ .set mips0
+#endif
bne $3, $5, done1
or $2, $6, 0
+#ifdef __linux__
+ .set mips2
+#endif
sc $2, 0($4)
+#ifdef __linux__
+ .set mips0
+#endif
bne $2, 1, retry1
done1:
.set reorder
@@ -45,13 +79,31 @@
LEAF(opal_atomic_cmpset_acq_32)
.set noreorder
retry2:
+#ifdef __linux__
+ .set mips2
+#endif
ll $3, 0($4)
+#ifdef __linux__
+ .set mips0
+#endif
bne $3, $5, done2
or $2, $6, 0
+#ifdef __linux__
+ .set mips2
+#endif
sc $2, 0($4)
+#ifdef __linux__
+ .set mips0
+#endif
bne $2, 1, retry2
done2:
- sync
+#ifdef __linux__
+ .set mips2
+#endif
+ sync
+#ifdef __linux__
+ .set mips0
+#endif
.set reorder
xor $3,$3,$5
@@ -62,12 +114,30 @@
LEAF(opal_atomic_cmpset_rel_32)
.set noreorder
- sync
+#ifdef __linux__
+ .set mips2
+#endif
+ sync
+#ifdef __linux__
+ .set mips0
+#endif
retry3:
+#ifdef __linux__
+ .set mips2
+#endif
ll $3, 0($4)
+#ifdef __linux__
+ .set mips0
+#endif
bne $3, $5, done3
or $2, $6, 0
+#ifdef __linux__
+ .set mips2
+#endif
sc $2, 0($4)
+#ifdef __linux__
+ .set mips0
+#endif
bne $2, 1, retry3
done3:
.set reorder
@@ -76,8 +146,8 @@
j ra
sltu $2,$3,1
END(opal_atomic_cmpset_rel_32)
-
-
+
+#ifdef __mips64
LEAF(opal_atomic_cmpset_64)
.set noreorder
retry4:
@@ -128,3 +198,4 @@
j ra
sltu $3,$4,1
END(opal_atomic_cmpset_rel_64)
+#endif /* __mips64 */
Index: openmpi-1.2.7~rc2/debian/rules
===================================================================
--- openmpi-1.2.7~rc2.orig/debian/rules 2008-07-03 18:21:22.000000000 +0100
+++ openmpi-1.2.7~rc2/debian/rules 2008-07-03 18:21:34.000000000 +0100
@@ -28,7 +28,7 @@
config.status: #patch-stamp
dh_testdir
- CFLAGS="$(CFLAGS)" ./configure \
+ CFLAGS="$(CFLAGS)" CCASFLAGS="-xassembler-with-cpp" ./configure \
$(CROSS) \
--prefix=/usr \
--mandir=\$${prefix}/share/man \
--- End Message ---