Re: [QUESTION] Execute OpenMP Application on Rump Kernel?

  • From: Vincent Schwarzer <vincent.schwarzer@xxxxxxxx>
  • To: rumpkernel-users@xxxxxxxxxxxxx, Antti Kantee <pooka@xxxxxx>
  • Date: Tue, 18 Aug 2015 18:04:24 +0200

2015-08-17 13:57 GMT+02:00 Antti Kantee <pooka@xxxxxx>:


I want to run different established performance benchmarking tools (e.g.
STREAM) and real world applications used in web application stacks on
Rumprun unikernel. At the end I want to compare the measurement results of
these tools/applications to other platforms (e.g. OSv,Linux Native,
Docker,
...) for a recommendation matrix for what kind of workload which platform
is most suitable in a cloud/backend application context. Many of these
application I want to use are utilizing OpenMP to fork new threads for
each
core and join the results at the end.


What does OpenMP use for transport on the cloud? sockets?

What do you expect to be dominating factor in your benchmark? (e.g. data
transfer, guest bootstrap overhead, ...)?


OpenMP has in this case nothing to do with communication between multiple
machines but is a convenient way of programming parallel
applications using compiler pragmas. See
https://en.wikipedia.org/wiki/OpenMP for a good explanation and some simple
examples.




I assume that you have to fetch the sources of the compiler that you're
using and crosscompile libgomp first. I also assume that libgomp is tied
to the compiler version, so not sure how much we can automate that,
unless
we provide a default compiler (which has sort of been an explicit no-no
in
our design so far -- you should be able to use any compiler you want to
build rump kernels).


What is the difference between x86_64-rumprun-netbsd-gcc in the app-tools
folder and my standard gcc (4.9) on my system which can compile OpenMP
applications, when there is no complier supplied by rumprun itself?


The C compiler frontend does essentially two things:
1) compiles C for the correct target architecture
2) sets the correct paths and defaults for headers/libs/cppmacros for the
target system

So, we want "1" as-is, but "2" we need to adjust to be correct for our use
with the wrappers. You can't use libgomp from your system (*) because it's
compiled against your system. It's the same reason that you can't use
pretty much any system-interfacing library on another system, even though
they might share the same "1".

*) ok, you might, if your system is NetBSD, but I'd assume the gcc
versions need to match too.

IOW, I still think you need to get gcc 4.9 sources and crosscompile
libgomp for Rumprun from there. If that works, we can think further about
how to "productize" the availability of libgomp for Rumprun.

I noticed today that x86_64-rumprun-netbsd-gcc is just a wrapper shell
script around the gcc installed on my system.
I got the gcc 4.9 sources but is it possible to cross-compile single
modules / components from it without compiling the complete gcc again?

My current approach is the following:


- Clone GCC 4.9 sources from Github to folder <gcc>
- Mkdir additional GCC Build folder called <gcc-build>
- Execute configure (GNU Autotools) from new Build Folder with relative
path to GCC lgomp Source Folder
gcc-build/$ /gcc/lgomp/configure --target=x86_64-rump kernel-netbsd
- Execute Makefile created by configure

I run into following error during the execution of the Makefile:

/tmp/gcc/libgomp/oacc-init.c: In function ‘acc_on_device’:
/tmp/gcc/libgomp/oacc-init.c:627:3: error: implicit declaration of
function ‘__builtin_acc_on_device’ [-Werror=implicit-function-declaration]
return __builtin_acc_on_device (dev);
^
cc1: all warnings being treated as errors
make[2]: *** [oacc-init.lo] Error 1
make[2]: Leaving directory `/tmp/gcc-build'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/tmp/gcc-build'
make: *** [all] Error 2



Does anyone have experience with compiling single components from GCC
source?
Can anyone point me to further material that could help me in my current
situation?


Thanks! :)

Cheers,

Vincent

Other related posts: