/*
 * This file is part of the StarPU Handbook.
 * Copyright (C) 2009--2011  Universit@'e de Bordeaux
 * Copyright (C) 2010, 2011, 2012, 2013  CNRS
 * Copyright (C) 2011, 2012 INRIA
 * See the file version.doxy for copying conditions.
 */

/*! \page MICSCCSupport MIC Xeon Phi / SCC Support

\section Compilation Compilation

SCC support just needs the presence of the RCCE library.

MIC Xeon Phi support actually needs two compilations of StarPU, one for the host and one for
the device. The PATH environment variable has to include the path to the
cross-compilation toolchain, for instance <c>/usr/linux-k1om-4.7/bin</c> .
The SINK_PKG_CONFIG_PATH environment variable should include the path to the
cross-compiled hwloc.pc.
The script <c>mic-configure</c> can then be used to achieve the two compilations: it basically
calls <c>configure</c> as appropriate from two new directories: <c>build_mic</c> and
<c>build_host</c>. <c>make</c> and <c>make install</c> can then be used as usual and will
recurse into both directories. If different configuration options are needed
for the host and for the mic, one can use <c>--with-host-param=--with-fxt</c>
for instance to specify the <c>--with-fxt</c> option for the host only, or
<c>--with-mic-param=--with-fxt</c> for the mic only.

One can also run StarPU just natively on the Xeon Phi, i.e. it will only run
directly on the Phi without any exchange with the host CPU. The binaries in
<c>build_mic</c> can be run that way.

For MPI support, you will probably have to specify different MPI compiler path
or option for the host and the device builds, for instance:

<c>./mic-configure --with-mic-param=--with-mpicc="/.../mpiicc -mmic" --with-mic-param=--with-mpicc=/.../mpiicc</c>

In case you have troubles with the coi or scif libraries (the Intel paths are
really not standard, it seems...), you can still make a build in native mode
only, by using <c>mic-configure --enable-native-mic</c> (and notably without
<c>--enable-mic</c> since in that case we don't need mic offloading support).

\section PortingApplicationsToMICSCC Porting Applications To MIC Xeon Phi / SCC

The simplest way to port an application to MIC Xeon Phi or SCC is to set the field
starpu_codelet::cpu_funcs_name, to provide StarPU with the function
name of the CPU implementation. StarPU will thus simply use the
existing CPU implementation (cross-rebuilt in the MIC Xeon Phi case). The
functions have to be globally-visible (i.e. not <c>static</c>) for
StarPU to be able to look them up, and -rdynamic must be passed to gcc (or
-export-dynamic to ld) so that symbols of the main program are visible.

For SCC execution, the function starpu_initialize() also has to be
used instead of starpu_init(), so as to pass <c>argc</c> and
<c>argv</c>.

\section LaunchingPrograms Launching Programs

SCC programs are started through RCCE.

MIC programs are started from the host. StarPU automatically
starts the same program on MIC devices. It however needs to get
the MIC-cross-built binary. It will look for the file given by the
environment variable \ref STARPU_MIC_SINK_PROGRAM_NAME or in the
directory given by the environment variable \ref
STARPU_MIC_SINK_PROGRAM_PATH, or in the field
starpu_conf::mic_sink_program_path. It will also look in the current
directory for the same binary name plus the suffix <c>-mic</c> or
<c>_mic</c>.

The testsuite can be started by simply running <c>make check</c> from the
top directory. It will recurse into both <c>build_host</c> to run tests with only
the host, and into <c>build_mic</c> to run tests with both the host and the MIC
devices. Single tests with the host and the MIC can be run by starting
<c>./loader-cross.sh ./the_test</c> from <c>build_mic/tests</c>.

*/
