<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Optimization of Parallel Software Tuning with Statistical Modeling and Machine Learning</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Anatoliy Doroshenko</string-name>
          <email>doroshenkoanatoliy2@gmail.com</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Pavlo Ivanenko</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Oleksandr Novak</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Olena Yatsenko</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Institute of Software Systems of National Academy of Sciences of Ukraine</institution>
          ,
          <addr-line>Glushkov prosp. 40, 03187 Kyiv</addr-line>
          ,
          <country country="UA">Ukraine</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>High-performance computation is the main goal of parallel computers, but the performance of compiled code is often far from the best. Parallel program auto-tuning is the method adjusting some structural parameters (mainly, data structures) of an application program for a target hardware platform to speed-up computation as much as possible. In previous work, the authors have developed a framework intended to automate generation of an auto-tuner from an application source code. However, auto-tuning for complex and nontrivial parallel systems is usually time-consuming due to empirical evaluation of huge amount of parameter values combinations of an initial parallel program in a target environment. In this paper, we propose to improve the auto-tuning method using statistical modeling and neural network algorithms that allow to reduce significantly the space of possible parameter combinations. The resulting optimization is illustrated by an example of tuning a parallel sorting program, that combines several sorting methods. The optimization is done by means of the automatic training of a neural network model on results of “traditional” tuning cycles with subsequent replacement of some auto-tuner calls with an evaluation from the statistical model.</p>
      </abstract>
      <kwd-group>
        <kwd />
        <kwd>Auto-tuning</kwd>
        <kwd>parallel computation</kwd>
        <kwd>machine learning</kwd>
        <kwd>neural network</kwd>
        <kwd>statistical modeling</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        The problem of optimal use of computing resources has always been important in the
process of development of any software — from mobile applications to complex
client-server systems. The auto-tuning paradigm [
        <xref ref-type="bibr" rid="ref1 ref2">1, 2</xref>
        ], which has become a standard for
solving the problem of software application optimization over the last decade, allows
to fully automatize this process for any computing environment. Its popularity is
predefined first by simplicity of use and independence from qualitative characteristics of
a computer and operating system. Auto-tuning traditionally uses empirical data for
obtaining a qualitative evaluation of optimized code (the quality usually refers to
program execution time and accuracy of output results). It automates the search for
the optimal program version out of a set of provided possibilities by running each
candidate and measuring its performance on a given parallel architecture. Its main
benefit is a high level of abstraction — a program is optimized without explicit
knowledge of hardware implementation details, such as number of cores, cache size
or memory access speed on various levels. Instead, it needs to use subject domain
concepts such as number and size of independent tasks.
      </p>
      <p>
        In the previous works [
        <xref ref-type="bibr" rid="ref3 ref4 ref5 ref6">3–6</xref>
        ], we have developed a theory, methodology and tools
for automated program design, synthesis, and auto-tuning, based on Glushkov’s
systems of algorithmic algebras (SAA) and term rewriting technique. The model for
parallel programs optimization and the auto-tuning framework named TuningGenie
aimed at automating adjustment of programs to a target platform have been proposed
in [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. The framework works with a source code of parallel software and performs
source-to-source transformations by using facilities of a rule-based rewriting system
TermWare [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ].
      </p>
      <p>The main drawback of the auto-tuning approach is in significant one-time costs of
optimization process: if the number of program versions is large enough, the
optimization process may run for many hours and even days. In this paper we propose the
hybrid approach to auto-tuning using statistical modeling and machine learning
technique to reduce the time needed for searching for an optimal program version. The
approach consists in automatic training of a neural network model on results of
common tuning cycles with subsequent replacement of some auto-tuner calls with an
evaluation from the statistical model.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Auto-Tuning Software Framework and Machine Learning</title>
      <p>
        In the work [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], TuningGenie framework for automated generation of auto-tuner
applications from a source code has been developed. The idea of an auto-tuner consists
in empirical evaluation of several versions of input program and selection of the best
one where the main evaluation criteria are less execution time of input program and
accuracy of results obtained. The framework works with program source code using
expert knowledge of a developer and automation facilities from the framework. A
developer adds some metadata (parameter names and value ranges) to a source code
in the form of special comments-pragmas. Exploiting such expert knowledge (s)he
can reduce the number of program versions to be evaluated and therefore increase
optimization performance.
      </p>
      <p>
        The auto-tuning software implementation is based on the rewriting rules system
TermWare [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. TermWare is an open-source implementation of rewriting rules engine
written in Java. It provides a language for describing rewriting rules that operate on
data structures that are called terms, and a rule engine that interprets rules to
transform terms. TuningGenie uses TermWare to extract expert knowledge from program
source code and generates a new program version on each tuning iteration. TermWare
translates source code into a term and provides transformations according to rewriting
rules. The current TermWare version contains components for interaction with Java
and C# languages, and the current TuningGenie version supports Java programs.
      </p>
      <p>Application of auto-tuning for complex and nontrivial program systems usually
takes a lot of time due to empirical estimating a large number of parameter
combinations of input program in a target environment (let us denote the set of parameters
combinations as C). In this paper we propose to optimize the auto-tuning method by
using statistical modeling and machine learning. The improvement consists in
reducing the number of auto-tuner launches by means of building an approximation model
which allows dismissing the parameter combinations that are unlikely to be fast. The
model approximation often results in a reduction of dimensionality of input
parameters of the set C that means significant auto-tuning process speed-up.</p>
      <p>
        Generally, machine learning methods are based on the concept of learning some
behavior from data [
        <xref ref-type="bibr" rid="ref2 ref7">2, 7</xref>
        ]. In the context of auto-tuning, the behavior to be learnt, for
example, can be program performance at different settings of program parameters.
A machine learning method first evaluates several alternatives within the search space
for n different input programs P1, ...,Pn , defined by configurations C1,..., Cn . The set
of evaluated alternatives is called training data. The process of generating and
evaluating the training data and learning behavior from this data is called training. Once the
training is completed, and given a new version of program P to be evaluated,
execution of P is replaced with estimate, obtained from trained model.
      </p>
      <p>
        Machine learning is closely linked to (and often overlaps with) computational
statistics [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]. All statistical algorithms (including machine learning algorithms) require a
significant number of statistical data for analysis and model construction. In the
context of auto-tuning tasks, the collection of many statistical data can be a long process.
Therefore, the problem of selecting the algorithms narrowing the search space at a
minimal number of real launches of an auto-tuner is very acute. For a partial solution
of the mentioned problem, in this work we use a neural network for data extrapolation
(see Section 3). In this case, relatively small number of real launches is required for
construction of an approximate model, after which the neural network model can be
used by other algorithms according to the black box principle.
3
      </p>
    </sec>
    <sec id="sec-3">
      <title>A Case Study</title>
      <p>
        In the design process, we follow top-down formal transformational style provided by
our automated toolkit for designing and synthesis of programs (IDS) [
        <xref ref-type="bibr" rid="ref4 ref5">4, 5</xref>
        ]. We begin
with high-level specification presented as a generalized scheme of the algorithm
represented in the algorithmic language of Glushkov's algorithmic algebras [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] that has
the advantage to be human-friendly and complete with code in one of the parallel
programming languages (Java or C++, in our case).
      </p>
      <p>Below, we consider a case study of performance tuning by the example of a hybrid
parallel sorting algorithm which applies a merge sort or an insertion sort depending on
a block size (insertionSortThreshold) of input numerical array. The initial
SAA scheme of the algorithm contains the tuneAbleParam pragmas, which
specify search domain for optimal values of variables
insertionSortThreshold and mergeSortBucketSize. The resulting
algorithm is implemented in Java.
"Parallel Hybrid Sorting (arr)"
==== "Comment(tuneAbleParam name=insertionSortThreshold
start=10 stop=200 step=10)";
"Declare a variable (insertionSortThreshold)</p>
      <p>of type (int) with initial value (100)";
"Comment(tuneAbleParam name=mergeSortBucketSize
start=5000 stop=1000000 step=5000)";
"Declare a variable (mergeSortBucketSize)</p>
      <p>of type (int) with initial value (5000)";
IF 'Length of the array (arr) is less or equal to
(insertionSortThreshold)'
THEN "insertionSort(arr)"
ELSE IF 'Length of the array (arr) is less or equal
to (mergeSortBucketSize)'
THEN "sequentialMergeSort(arr)"
ELSE "concurrentMergeSort(arr)"</p>
      <p>END IF</p>
      <p>END IF</p>
      <p>In the auto-tuning experiment, the set of 2107 random integer numbers were
sorted. The auto-tuner parameters are C {Tcn,Ts,Th}, where Tcn is a number of
parallel threads, Ts is a threshold for block size to be sorted sequentially within the
current thread (blocks with size Ts are split into smaller blocks and assigned to
different threads), Th is a block size at which insertion sort is used.</p>
      <p>The experiment was performed in the following environment: 2.7 GHz Intel
Core i7 processor (6820HQ) with 4 cores and 8 MB L3 cache; 16 GB 2133 MHz
RAM; 512 GB Apple SSD SM0512L; MacOS 10.12.</p>
      <p>In a first phase, the auto-tuner was executed without a statistical model to estimate
how quick the tuned algorithm can be. In a second phase, the statistical modeling was
plugged in to understand how heavily the search space can be pruned while
preserving the near-optimum performance of the tuned algorithm.</p>
      <p>Let’s look at the results of the first phase given in Table 1. Three configurations are
listed: slow (“default” configuration that behaves almost as classical sequential merge
sort); optimal (the quickest one that was automatically picked by the auto-tuner) and
intuitive (values are filled in by intuition with respect to known hardware
specifications and algorithms details). Optimal configuration is 4.93 times quicker than slow.
This result is quite good for 4-core processor and was achieved primarily by a
combination of two factors: optimal usage of processor caches (by switching to
inplace sorting for small data sets) and efficient parallelization schema (merge sort is
easy to parallelize with “divide and conquer” method). Intuitive combination was 3.1
times faster than slow — also a decent result, but it was easy to guess due to relative
simplicity of the test algorithm. Usually optimal configurations are not so obvious for
real-life parallel programs. Optimal configuration is still substantially quicker — by
58%, so we can say that it was worth the time spent on tuning.
optimal
8
120</p>
      <p>
        Now let’s move to the second phase to see how the auto-tuner’s search space can
be reduced with the help of statistical analysis methods. Ts parameter is excluded
from the model during primary analysis phase because of its minor impact on overall
performance: once the number of subtasks after the decomposition of input data is
couple times bigger than the parallelism level, it makes almost no difference what
value is used. This can be explained by high effectiveness of Java’s
RecursiveAction [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] mechanism that was used in the implementation. RecursiveAction is a
recursive ForkJoinTask, which is “a thread-like entity that is much lighter weight than a
normal thread. Huge numbers of tasks and subtasks may be hosted by a small number
of actual threads in a ForkJoinPool, at the price of some usage limitations” [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ]. The
experiment proved that the computational overhead on executing new
RecursiveAction is negligible.
      </p>
      <p>
        The primary analysis of data was performed in Python language with a help of
Scikit-learn library [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]. Further analysis was implemented by means of R [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ],
which is a programming language for statistical computations, analysis and graphical
representation of data. The experiment consisted of several stages: preparation and
loading of auto-tuner results to R environment, data preparation (including
normalization), building a neural network model on a training dataset and checking the model
on a test dataset.
      </p>
      <p>
        The data analysis process is shown in Figure 1. At first, the auto-tuner performs N
experiments and saves the result data to a separate file. The data is used by the neural
network for training. After the training, the neural network extrapolates the data,
generates the new dataset, which is written into a separate file. In the end, both datasets
are analyzed and compared by a human. As a neural network, a multilayer perceptron
with three input neurons, three hidden layers (20-10-5 neurons per layer) and one
output neuron were applied. The rectified linear function f (x) = max(0, x) was used
as an activation function. The backward propagation of errors has been used as a
machine learning method and the Broyden-Fletcher-Goldfarb-Shanno algorithm [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] has
been applied for optimization of weighting factors.
      </p>
      <sec id="sec-3-1">
        <title>Auto-tuner</title>
      </sec>
      <sec id="sec-3-2">
        <title>Neural network</title>
      </sec>
      <sec id="sec-3-3">
        <title>Data processing</title>
      </sec>
      <sec id="sec-3-4">
        <title>Data</title>
        <p>processing</p>
      </sec>
      <sec id="sec-3-5">
        <title>Actor</title>
        <p>The initial neural network was built based on results of 3300 launches. Then it was
used for further data generation. The use of the neural network for initial
approximation allowed to reduce the search region by 58% (from 106 to 4.2 105 ). For
estimating the quality of the obtained results, more than 30000 real launches (evenly
distributed over the combinations set) of the auto-tuner was performed.</p>
        <p>Figure 2 shows the dependency of the model accuracy Acc from 10 neural
networks on the ratio of sample data used for training.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Related Work</title>
      <p>
        Many approaches have been proposed for the problem of auto-tuner development.
Well-known examples of auto-tuners are ATLAS [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ] and FFTW [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ], which are
specialized libraries introducing high-performance implementation of some specific
functions. Unlike our TuningGenie framework, which provides domain independent
optimization, they are tied to domain and language. TuningGenie is quite similar to
Atune-IL [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ], a language extension for auto-tuning. It also uses pragmas and is not
tied to some specific programming language. The main difference of TuningGenie is
due to term rewriting engine that is used for source code transformation. Representing
program code as a term allows modifying program structure in a declarative way.
This feature significantly increases the capabilities of the auto-tuning framework.
      </p>
      <p>
        There are also auto-tuners based on machine learning techniques [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. In paper [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ],
an open-source self-tuning compiler Milepost GCC is described, which exploits
machine learning to predict optimal setting of compilation flags for a program at using
GCC. In [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ] neural networks are used to learn the behavior of a given program
transformation (parametric loop tiling) for different values of input parameter (tile size);
the model is then used to search for optimal parameter values. In the work [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ], a
machine learning approach is applied for automatic optimization of task partitioning
for OpenCL for different input problem sizes and different heterogeneous
architectures consisting of CPUs and GPUs. In our work, we use neural networks for learning
on the results of tuning cycles (program execution time at different values of internal
program parameters) with subsequent replacement of some auto-tuner calls with an
evaluation from the model.
      </p>
    </sec>
    <sec id="sec-5">
      <title>Conclusion</title>
      <p>In this paper, we explore the promising method of software auto-tuning improved by
using statistical modeling and neural networks. The method allows substantially get
rid of the main weakness of the auto-tuning methodology, namely, significantly
accelerate the search for an optimal program version by automatic training a neural
network model on the results of regular tuning cycles and subsequent replacement of
some auto-tuner calls with an evaluation from the model. Furthermore, the use of a
perceptron at the primary analysis stage helps to identify the most important input
parameters (i.e. which have the largest influence on a final result). The approach is
illustrated by the example of performance tuning of a hybrid parallel sorting program
that exploits the developed earlier TuningGenie framework. The results of the
experiment confirmed the efficiency of the proposed approach and the usefulness of its
further development, in particular, the use of more complex approximation functions
and conducting experiments with more computationally and semantically complex
programs.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Naono</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Teranishi</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Cavazos</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Suda</surname>
          </string-name>
          , R.:
          <article-title>Software automatic tuning: from concepts to state-of-the-art results</article-title>
          . Springer, Berlin (
          <year>2010</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Durillo</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Fahringer</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          :
          <article-title>From single- to multi-objective auto-tuning of programs: advantages and implications</article-title>
          .
          <source>Scientific Programming</source>
          ,
          <volume>22</volume>
          (
          <issue>4</issue>
          ),
          <fpage>285</fpage>
          -
          <lpage>297</lpage>
          (
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Doroshenko</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Shevchenko</surname>
            ,
            <given-names>R.:</given-names>
          </string-name>
          <article-title>A rewriting framework for rule-based programming dynamic applications</article-title>
          .
          <source>Fundamenta Informaticae</source>
          ,
          <volume>72</volume>
          (
          <issue>1-3</issue>
          ),
          <fpage>95</fpage>
          -
          <lpage>108</lpage>
          (
          <year>2006</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Andon</surname>
            ,
            <given-names>F.I.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Doroshenko</surname>
            ,
            <given-names>A.Y.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Tseytlin</surname>
            ,
            <given-names>G.O.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Yatsenko</surname>
            ,
            <given-names>O.A.</given-names>
          </string-name>
          :
          <article-title>Algebra-algorithmic models and methods of parallel programming</article-title>
          .
          <source>Akademperiodyka</source>
          ,
          <string-name>
            <surname>Kyiv</surname>
          </string-name>
          (
          <year>2007</year>
          )
          <article-title>(in Russian)</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Doroshenko</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Zhereb</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Yatsenko</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          :
          <article-title>Developing and optimizing parallel programs with algebra-algorithmic and term rewriting tools</article-title>
          . In: Ermolayev,
          <string-name>
            <given-names>V.</given-names>
            ,
            <surname>Mayr</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.C.</given-names>
            ,
            <surname>Nikitchenko</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            ,
            <surname>Spivakovsky</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            ,
            <surname>Zholtkevych</surname>
          </string-name>
          ,
          <string-name>
            <surname>G</surname>
          </string-name>
          . (eds.)
          <source>ICTERI</source>
          <year>2013</year>
          , Communications in Computer and Information Science, vol.
          <volume>412</volume>
          , pp.
          <fpage>70</fpage>
          -
          <lpage>92</lpage>
          . Springer, Cham (
          <year>2013</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Ivanenko</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Doroshenko</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Zhereb</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          :
          <article-title>TuningGenie: auto-tuning framework based on rewriting rules</article-title>
          . In: Ermolayev,
          <string-name>
            <given-names>V.</given-names>
            ,
            <surname>Mayr</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            ,
            <surname>Nikitchenko</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            ,
            <surname>Spivakovsky</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            ,
            <surname>Zholtkevych</surname>
          </string-name>
          ,
          <string-name>
            <surname>G</surname>
          </string-name>
          . (eds.)
          <article-title>ICTERI 2014</article-title>
          .
          <source>Communications in Computer and Information Science</source>
          , vol.
          <volume>469</volume>
          , pp.
          <fpage>139</fpage>
          -
          <lpage>158</lpage>
          . Springer, Cham (
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7. Mitchell,
          <string-name>
            <surname>T.M.:</surname>
          </string-name>
          <article-title>Machine learning</article-title>
          .
          <source>1st edn</source>
          .
          <string-name>
            <surname>McGraw-Hill</surname>
            <given-names>Education</given-names>
          </string-name>
          , New York (
          <year>1997</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Givens</surname>
            ,
            <given-names>G.H.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hoeting</surname>
            ,
            <given-names>J.A.</given-names>
          </string-name>
          :
          <article-title>Computational statistics</article-title>
          . 2nd edn. Wiley, Chichester (
          <year>2012</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Class</surname>
          </string-name>
          <article-title>RecursiveAction (Java SE 9</article-title>
          &amp; JDK 9) - Oracle Help Center, https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/RecursiveAction.html,
          <source>last accessed</source>
          <year>2017</year>
          /12/20.
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Class</surname>
          </string-name>
          <article-title>ForkJoinTask (Java SE 9</article-title>
          &amp; JDK 9) - Oracle Help Center, https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/ForkJoinTask.html,
          <source>last accessed</source>
          <year>2017</year>
          /12/20.
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Pedregosa</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Varoquaux</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Gramfort</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Michel</surname>
            ,
            <given-names>V.</given-names>
          </string-name>
          et al.:
          <article-title>Scikit-learn: machine learning in Python</article-title>
          .
          <source>Journal of Machine Learning Research</source>
          ,
          <volume>12</volume>
          ,
          <fpage>2825</fpage>
          -
          <lpage>2830</lpage>
          (
          <year>2011</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Crawley</surname>
            ,
            <given-names>M.J.</given-names>
          </string-name>
          :
          <article-title>The R book</article-title>
          .
          <source>1st edn</source>
          . Wiley, Chichester (
          <year>2012</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Fletcher</surname>
          </string-name>
          , R.:
          <article-title>Practical methods of optimization. 2nd edn</article-title>
          . Wiley, Chichester (
          <year>2000</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Fawcett</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          :
          <article-title>An introduction to ROC analysis</article-title>
          .
          <source>Pattern Recognition Letters</source>
          ,
          <volume>27</volume>
          (
          <issue>8</issue>
          ),
          <fpage>861</fpage>
          -
          <lpage>874</lpage>
          (
          <year>2006</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <surname>Whaley</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Petitet</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Dongarra</surname>
            ,
            <given-names>J. J.</given-names>
          </string-name>
          :
          <source>Automated empirical optimizations of software and the ATLAS Project. Parallel Computing</source>
          ,
          <volume>27</volume>
          (
          <issue>1-2</issue>
          ),
          <fpage>3</fpage>
          -
          <lpage>35</lpage>
          (
          <year>2001</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16.
          <string-name>
            <surname>Frigo</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Johnson</surname>
          </string-name>
          , S.:
          <article-title>FFTW: an adaptive software architecture for the FF</article-title>
          .
          <source>Acoustics, Speech and Signal Processing</source>
          ,
          <volume>3</volume>
          ,
          <fpage>1381</fpage>
          -
          <lpage>1384</lpage>
          (
          <year>1998</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17.
          <string-name>
            <surname>Schaefer</surname>
            ,
            <given-names>C.A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Pankratius</surname>
            ,
            <given-names>V.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Tichy</surname>
            ,
            <given-names>W.F.</given-names>
          </string-name>
          :
          <article-title>Atune-IL: an instrumentation language for auto-tuning parallel applications</article-title>
          . In: Sips,
          <string-name>
            <given-names>H.</given-names>
            ,
            <surname>Epema</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            ,
            <surname>Lin</surname>
          </string-name>
          ,
          <string-name>
            <surname>H.-X</surname>
          </string-name>
          . (eds.) Euro-Par'
          <year>2009</year>
          . LNCS, vol.
          <volume>5704</volume>
          , pp.
          <fpage>9</fpage>
          -
          <lpage>20</lpage>
          . Springer, Berlin, Heidelberg (
          <year>2009</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          18.
          <string-name>
            <surname>Fursin</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kashnikov</surname>
            ,
            <given-names>Y.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Memon</surname>
            ,
            <given-names>A.W.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chamski</surname>
            ,
            <given-names>Z.</given-names>
          </string-name>
          et al.:
          <string-name>
            <surname>Milepost</surname>
            <given-names>GCC</given-names>
          </string-name>
          <article-title>: machine learning enabled self-tuning compiler</article-title>
          .
          <source>International Journal of Parallel Programming</source>
          <volume>39</volume>
          (
          <issue>3</issue>
          ),
          <fpage>296</fpage>
          -
          <lpage>327</lpage>
          (
          <year>2011</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          19.
          <string-name>
            <surname>Rahman</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Pouchet</surname>
            ,
            <given-names>L.-N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Sadayappan</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          :
          <article-title>Neural network assisted tile size selection</article-title>
          .
          <source>In: 5th International Workshop on Automatic Performance Tuning (IWAPT</source>
          '
          <year>2010</year>
          ). Springer, Berkeley, CA (
          <year>2010</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          20.
          <string-name>
            <surname>Kofler</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Grasso</surname>
            ,
            <given-names>I.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Cosenza</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Fahringer</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          :
          <article-title>An automatic input-sensitive approach for heterogeneous task partitioning</article-title>
          .
          <source>In: 27th ACM International Conference on Supercomputing (ICS'13)</source>
          , pp.
          <fpage>149</fpage>
          -
          <lpage>160</lpage>
          . ACM, New York (
          <year>2013</year>
          )
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>