Better Cilk Development With Docker

I’m taking a course that focuses on parallel and distributed computing. We use a compiler extension for GCC called Cilk to develop parallel programs in C/C++. Cilk offers developers a simple method for developing parallel code, and as a plus it now comes included in GCC since version 4.9.

The unjust thing with this course is that the professor provides a hefty 4GB Ubuntu virtual machine just for running the GNU compiler with Cilk. No sane person would download an entire virtual machine image just to run a compiler.

Docker comes to the rescue. It couldn’t be more space effective and convenient to use Cilk from a Docker container. I’ve created a simple Dockerfile containing the latest GNU compiler for Ubuntu 16.04. Here are some Gists showing how to build and run a Dockerfile which contain the dependencies needed to build and run Cilk programs.

Moving a Jenkins Instance From one Server to Another

During my time converting ZDirect’s SVN repo to Git, we decided to move our code from a server in Florida to a server in Ottawa. The same server also hosts our Jenkins build server. To keep bandwidth bills and build latency down we’re moving the Jenkins server over as well.

Trial and error led me to copying the entire Jenkins directory, which is either at the JENKINS_HOME environment variable or ~/.jenkins as the default. Launching the Jenkins executable while setting the JENKINS_HOME environment variable will bring up an almost perfectly configured instance of Jenkins. I say almost because the Jenkins configuration should be looked over for any settings that are wrong for this new system. Some Jenkins configuration options that I had to change was the JDK home, Ant home and the external url of the server. An example launch script looks as follows:

$ JENKINS_HOME=/path/to/jenkins/home/folder
$ java -jar jenkins.war

The Jenkins Wiki outlines how to move specific jobs as well.

Building Eclipse C/C++ projects for 32-bit on a 64-bit system

In my systems programming course we learn various techniques of the C programming language. On multiple assignments we are provided code that only runs on 32-bit. I run Linux Mint 64-bit on my laptop, using Eclipse for my C/C++ development and the GNU toolchain to compile, which is an issue when the 32-bit C/C++ code is compiled by default for 64-bit. Valgrind is also unhappy since it cannot run the cross compiled 32-bit code (probably many other profiling tools encounter this as well).

This guide should work flawlessly on Ubuntu and its derivatives since Linux Mint is based upon Ubuntu and uses its packages.

I solved this problem by adding the -m32 tag to the eclipse compiler and linker settings, and installing the required 32-bit packages for my operating system.

Method

In eclipse

  1. Go to Project->Properties then click on Settings, which is under C/C++ Build
  2. Make sure that the current configuration that is selected is All Configurations
  3. Select the Tool Settings tab, select GCC C Compiler, if it isn’t selected already, and in the Command form change gcc to gcc -m32 to enable 32-bit compiling with GCC
    gcc compiler
  4. Do the same change of gcc to gcc -m32 on the GCC C Linker page, then click OK to save the settings
    gcc linker
  5. Make sure to clean the project so that previously created object files compiled with 64-bit GCC are removed, otherwise the build will fail. Go to Project->Clean… and either select Clean all projects or select Clean projects selected below, then selecting the current project (In my case it is comp2401a3). Click OK
    eclipse clean project

Required Packages

Installing the following packages enabled standard C/C++ library calls to work. If other libraries are used within the code, additional 32-bit packages might have to be installed. Installation via Linux Mint, based on Ubuntu, is via the standard apt-get install command.

apt-get install g++-multilib lib32gcc1 libc6-i386 lib32z1 lib32stdc++6
apt-get install lib32asound2 lib32ncurses5 lib32gomp1 lib32z1-dev lib32bz2-dev

This might also be required if the code still does not compile:

apt-get install ia32-libs-gtk

 Package for Valgrind

When running Valgrind on the 32-bit code the following error occurred.

valgrind: Fatal error at startup: a function redirection
valgrind: which is mandatory for this platform-tool combination
valgrind: cannot be set up. Details of the redirection are:
valgrind:
valgrind: A must-be-redirected function
valgrind: whose name matches the pattern: strlen
valgrind: in an object with soname matching: ld-linux.so.2
valgrind: was not found whilst processing
valgrind: symbols from the object with soname: ld-linux.so.2
valgrind:
valgrind: Possible fixes: (1, short term): install glibc’s debuginfo
valgrind: package on this machine. (2, longer term): ask the packagers
valgrind: for your Linux distribution to please in future ship a non-
valgrind: stripped ld.so (or whatever the dynamic linker .so is called)
valgrind: that exports the above-named function using the standard
valgrind: calling conventions for this platform. The package you need
valgrind: to install for fix (1) is called
valgrind:
valgrind: On Debian, Ubuntu: libc6-dbg
valgrind: On SuSE, openSuSE, Fedora, RHEL: glibc-debuginfo
valgrind:
valgrind: Cannot continue — exiting now. Sorry.

After adding the suggested package libc6-dbg, the error still occurred. Installing the 32-bit version of the package fixed the error:

apt-get install libc6-dbg:i386

Conclusion

As shown above, it can be troublesome to set up cross compiling of 32-bit C/C++ code on a 64-bit machine, but if the reward of programming in the native operating system is worth more than programming in a virtual machine or on another computer, then it is a worthy cause.


 Sources