<!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>MIOpen: An Open Source Library For Deep Learning Primitives</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>ul Fultz[</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>l Low</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>o Liu[</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>mil N</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>syrov[</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>rminov[</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>sh Sh</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>silii Filippov[</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Jing Zh</string-name>
        </contrib>
        <contrib contrib-type="author">
          <string-name>AMD Inc. Mayank.Daga@amd.com</string-name>
        </contrib>
      </contrib-group>
      <abstract>
        <p>Deep Learning has established itself to be a common occurrence in the business lexicon. The unprecedented success of deep learning in recent years can be attributed to: an abundance of data, availability of gargantuan compute capabilities offered by GPUs, and adoption of open-source philosophy by the researchers and industry. Deep neural networks can be decomposed into a series of different operators. MIOpen, AMD's open-source deep learning primitives library for GPUs, provides highly optimized implementations of such operators, shielding researchers from internal implementation details and hence, accelerating the time to discovery. This paper introduces MIOpen and provides details about the internal workings of the library and supported features. MIOpen innovates on several fronts, such as implementing fusion to optimize for memory bandwidth and GPU launch overheads, providing an auto-tuning infrastructure to overcome the large design space of problem configurations, and implementing different algorithms to optimize convolutions for different filter and input sizes. MIOpen is one of the first libraries to publicly support the bfloat16 data-type for convolutions, allowing efficient training at lower precision without the loss of accuracy.</p>
      </abstract>
      <kwd-group>
        <kwd>Convolution</kwd>
        <kwd>Deep Learning</kwd>
        <kwd>GPU</kwd>
        <kwd>HIP</kwd>
        <kwd>Machine Learning</kwd>
        <kwd>MIOpen</kwd>
        <kwd>OpenCL®</kwd>
        <kwd>Performance</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>
        Deep Learning has burgeoned into one of the most important technological
breakthroughs of the 21st century. The use of deep learning has garnered immense success in
applications like image and speech recognition, recommendation systems, and language
Copyright © 2020 for this paper by its authors. Use permitted under Creative Commons
License Attribution 4.0 International (CC BY 4.0).
translation. This in turn advances fields like autonomous driving and disease diagnosis.
GPUs have played a critical role in the advancement of deep learning. The massively
parallel computational power of GPUs has been influential in reducing the training time
of complex deep learning models hence, accelerating the time to discovery [
        <xref ref-type="bibr" rid="ref29">29</xref>
        ]. The
availability of open-source frameworks like TensorFlow and PyTorch is another
cornerstone for the fast-paced innovation in deep learning [
        <xref ref-type="bibr" rid="ref1 ref24">1, 24</xref>
        ].
      </p>
      <p>
        The deep learning frameworks decompose the models as either a computational
graph or a sequence of operations [
        <xref ref-type="bibr" rid="ref12 ref22">12, 22</xref>
        ]. These high-level operations are then
compiled down to a series of hardware specific high-performance primitives. These
primitives in deep learning are akin to BLAS (Basic Linear Algebra Subprograms) [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ] in
linear algebra and high performance computing. Availability of a library which
provides highly optimized implementations of such primitives enables the deep learning
researchers to focus on their science and leaves the burden of developing such
primitives on the hardware vendors. The library then provides a simple and callable
application programming interface (API) to enable seamless integration with client libraries
and be flexible so that new features may be added easily.
      </p>
      <p>
        MIOpen is AMD’s deep learning primitives library which provides highly
optimized, and hand-tuned implementations of different operators such as convolution,
batch normalization, pooling, softmax, activation and layers for Recurrent Neural
Networks (RNNs), used in both training and inference [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]. Moreover, MIOpen is fully
open-source including all its GPU kernels; complementing AMD’s open-source ROCm
stack [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. MIOpen is the first to extend the open-source advantage into GPU vendor
libraries thereby, continuing to embark on the same ethos as the deep learning
community.
      </p>
      <p>
        As deep learning has gained critical acclaim over the years, substantial research
has been conducted to accelerate it. One optimization technique called fusion has been
recognized to be more potent than others [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ]. Fusion allows to fuse or collapse several
neural network layers thereby, optimizing on 1) memory bandwidth requirements by
requiring less data to be moved between host and GPU memories, and 2) GPU kernel
launch overheads by launching fewer GPU kernels compared to the vanilla, non-fused
neural network. Aside from discrete primitives, MIOpen also offers a fusion API which
allows the frameworks to fuse some of the operations mentioned above. MIOpen fusion
can be used to accelerate both convolution and recurrent neural networks.
      </p>
      <p>
        Another area that has flourished with the popularity of deep learning is open-source
graph compilers [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ], [
        <xref ref-type="bibr" rid="ref26">26</xref>
        ], [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ], [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. Graph compilers further the relevance of deep
learning to wide-spread applications by generating the implementations of
aforementioned operators instead of relying on hardware specific libraries. However, generating
high-performance implementations of two operators, convolution and GEMM, is
extremely cumbersome without inherent knowledge of the underlying hardware.
Therefore, the graph compilers rely on libraries like MIOpen for these operators. MIOpen’s
open-source nature enables a plethora of optimization opportunities which were not
possible before. For example, fusing an operator generated by the compiler with MIOpen’s
convolutions. MIOpen facilitates these optimization by breaking down complex
operators like convolutions into several simple and small operators and providing
high
      </p>
      <p>MIOpen: An Open Source Library For Deep Learning Primitives 3
performance implementations of these simple operators to the graph compiler. This
MIOpen feature is called composable kernels.</p>
      <p>
        The primary aim of MIOpen is to provide access to high-performance kernels,
support several data-types, and also support as many hardware targets as required. To that
end, MIOpen supports four different data-types: float32, float16, bfloat16,
and int8, and two programming models: OpenCL® [
        <xref ref-type="bibr" rid="ref23">23</xref>
        ] and HIP. The kernels in
MIOpen are backed by both high-level language as well as hand-tuned assembly
implementations. MIOpen also provides an auto-tuning infrastructure to achieve maximum
performance on the user’s hardware and software environment.
      </p>
      <p>This document provides an under-the-hood look at the MIOpen library providing
detailed information about the functionality of the library as well as introduce MIOpen’s
capabilities to users and developers. The rest of the paper is organized as follows:
Section 2 describes some prior work, Section 3 describes the overall design philosophy of
the library and provides details about kernel compilation, abstractions used to localize
those details in the library, tuning infrastructure for improving kernel performance and
MIOpen’s support for OpenCL® and HIP. This is followed by Section 4 which provides
details about the supported operations; primarily the convolution operation. Section
5 describes MIOpen’s Fusion API for merging different operations for increased
performance, this is followed by some usage statistics and performance comparisons in
Section 6. Section 7 presents conclusion and future work.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Related Work</title>
      <p>
        Developing hardware-optimized libraries for most critical and time-sensitive operations
is a well-known practice. For linear algebra such libraries are known as BLAS (Basic
Linear Algebra Subsystem) and have different implementations for different systems [
        <xref ref-type="bibr" rid="ref18 ref28 ref5">5,
18, 28</xref>
        ]. In similar spirit different deep learning libraries have been written, to make
it easier for client applications to implement different deep learning primitives. Alex
Krischevsky’s cuda-convnet is one of the initial libraries to implement convolutions
and inspired many others [
        <xref ref-type="bibr" rid="ref27">27</xref>
        ], [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]. Chetlur et al. developed cuDNN, a deep neural
network library for nvidia GPUs [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]. MIOpen falls in this category since it provides a
C programming language based API for deep learning primitives. While these libraries
aim to accelerate deep learning primitives on GPUs, research also been conducted to
improve the performance of inference only loads on different CPUs such as
MKLDNN [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ].
      </p>
      <p>
        Most of the above mentioned libraries focus on lower level optimization
opportunities. An orthogonal approach is to abstract this detail behind a domain specific language
(DSL). This technique has already been successfully applied to other domains such as
computer vision and linear algebra [
        <xref ref-type="bibr" rid="ref13 ref14 ref25">13, 14, 25</xref>
        ]. Vasilache et al. developed Tensor
Comprehensions, which takes a similar approach and designs a language which can infer
tensor dimensions and summation indices automatically [
        <xref ref-type="bibr" rid="ref27">27</xref>
        ]. However, such an
approach makes it complicated to support a wide array of platforms and hardware targets
as is required of MIOpen.
2.1
      </p>
      <sec id="sec-2-1">
        <title>MIOpen and higher level frameworks</title>
        <p>
          The above libraries are augmented by a community of frameworks which enable
researchers and practitioners to express their computation pipeline using a host language
(typically Python™ or some other higher level language) [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ] [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]. These frameworks
in turn call out libraries such as MIOpen for efficient implementation of the primitives
required to implement the computation in those graphs. Frameworks strive to support a
wide array of hardware and applications, for instance both TensorFlow and PyTorch
already support MIOpen as a backend aimed at AMD GPUs. Thus a user can seamlessly
change the hardware target without changing their application code.
3
        </p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Overall Design</title>
      <p>This section describes the MIOpen’s design philosophy using the convolution operation
as an example.
3.1</p>
      <sec id="sec-3-1">
        <title>Kernels and Solvers</title>
        <p>Mapping a problem description to a particular kernel requires MIOpen to determine
the file which contains the required GPU kernel, the name of the kernel in the file
and the compiler arguments required to compile it. Typically, there is more than one
kernel which can perform similar operations. However, each kernel has a unique set of
constraints and may result in different performance due to differing code optimizations
and input dimensions of the problem.</p>
        <p>All this information is grouped in MIOpen classes collectively called solvers. These
classes together solve for the best convolution kernel given a problem description. This
construct creates a layer of abstraction between the rest of the MIOpen library and
kernel specific details, thus all the details of a kernel are completely localized.</p>
        <p>If a developer wishes to add a new kernel to the MIOpen, all that is required is to
add the source code for the kernel and implement the associated solver, thereafter the
kernel may be selected automatically.
3.2</p>
      </sec>
      <sec id="sec-3-2">
        <title>Auto tuning infrastructure</title>
        <p>In general, any high-performance code leverages auto-tuning for choosing the
parameters that may change with the underlying architecture as well as the problem description
thereby, impacting performance. MIOpen is not an exception to this rule. This requires
that all tunable kernels be tuned for known configuration to achieve maximum
performance. Once known, these tuning parameters can be shipped with MIOpen or, the user
may employ the same infrastructure to tune MIOpen kernels for custom configurations.</p>
        <p>A solver encapsulates the constraints for the tuning parameters as well as the
interface machinery to launch tuning instances. The tuning parameters create a grid of
possible values of the kernel tuning parameters and the tuning infrastructure compiles
and launches a unique kernel for each of these combinations using a pruned search
space approach. Once a kernel is tuned and the optimum tuning parameters are known,
they are serialized to a designated directory on the user’s system for future retrieval.</p>
        <p>MIOpen: An Open Source Library For Deep Learning Primitives 5
3.3</p>
      </sec>
      <sec id="sec-3-3">
        <title>Kernel compilation and caching</title>
        <p>
          Launching a kernel requires setting up the compilation parameters and invoking a
devicecode compiler to generate the binary object. MIOpen device-code consists of kernels
written in OpenCL® , HIP [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ] and GCN assembly [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ], which may be compiled using
clang [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ].
        </p>
        <p>Since compiling a kernel is a costly and time-consuming procedure, MIOpen
employs two levels of caching to improve the runtime performance of the library. This
design choice is tightly coupled with how device-code compilers compile and load
compute-kernels from the binaries.</p>
        <p>
          Once an kernel file is compiled, it is cached to disk to avoid future compilations
of the same source-file with the same parameters. Due to the caching effects described
above, it is recommended that the user’s application performs a warmup iteration so
that MIOpen’s different caches can be populated. Such runs will ensure that subsequent
network invocations are accurately timed without the effects of disk I/O or compilation
delays. This limitation is not unique to MIOpen and is also applicable to other
highperformance libraries.
MIOpen supports applications that use the OpenCL® and HIP programming models [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ].
All the APIs remain consistent from the client application’s perspective, the only
difference is in the creation of miopenHandle structure, which is created either with a HIP
stream or an OpenCL® device context. Internally the HIP backend compiles the kernel
using an appropriate complier depending on the kernel source type. Subsequently, the
compiled binary object is loaded and passed off to the runtime for execution.
        </p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Machine Learning Primitives</title>
      <sec id="sec-4-1">
        <title>Convolution</title>
        <p>Most modern neural networks employ convolution as a central operation. Its usefulness
and popularity make it a critical piece of the machine learning puzzle, particularly in
image processing.</p>
        <p>
          The numerical complexity of the convolution operation and it’s diverse set of inputs
make it difficult to generalize accross multiple hardware architectures. Different
algorithms have been proposed to compute the convolution of a filter and an image, among
them MIOpen provides implementation for the Winograd algorithm [
          <xref ref-type="bibr" rid="ref17">17</xref>
          ], a direct
algorithm and using the matrix-matrix multiplication (GEMM) operation [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ] as well as the
Fast Fourier Transform.
        </p>
        <p>The best performing algorithm is rarely readily apparent on a given architecture for
a set of input and filter dimensions. To assess the relative performance of these kernels
and return the best performing kernel, MIOpen employs the find step before the actual
convolution operation. For this step, the user constructs the necessary data structures
for the input/output image tensors as well as the convolution descriptor specifying the
properties of convolution such as striding, dilation, and padding. The user then calls the</p>
        <p>MIOpen convolution Find API which allows MIOpen to benchmark all the applicable
kernels for the given problem configuration, this information is returned in an array of
type miopenConvAlgoPerf t. This enables the library to adjust for any variations
in the user hardware and also allows the user to balance the trade-off between execution
time and additional memory that may be required for some algorithms.</p>
      </sec>
      <sec id="sec-4-2">
        <title>Types of Supported Convolutions</title>
        <p>Transpose Convolution Transposed Convolution (also known as deconvolution or
fractionally-strided convolution) is an operation typically used to increase the size of the
tensor resulting from convolution. The standard convolution operation reduces the size
of the image, which is desirable in classification tasks. However, tasks such as image
segmentation require the output tensor to have the same size as the input. MIOpen
supports transpose convolution required by such networks and may be enabled by setting
the miopenConvolutionMode t in miopenConvolutionDescriptor t to
miopenTranspose.</p>
        <p>Depthwise convolution In depthwise convolution, the input is separated along the
depth (channels) and then is convolved with a filter that is also separated along the same
axis. The results are stacked into a tensor. Separating out the process of finding spatial
correlation and cross channel correlations, results in fewer parameters as compared to
regular convolution. Smaller and more efficient neural networks with depthwise
separable convolutions have applications in training on embedded systems such as mobile
phones.</p>
        <p>
          Grouped convolutions Group convolutions were introduced in Alexnet [
          <xref ref-type="bibr" rid="ref15">15</xref>
          ], to
reduce the memory required for convolution operation. Grouped convolutions are able to
achieve accuracy similar to non-grouped convolutions while having fewer parameters.
Further details may be found in [
          <xref ref-type="bibr" rid="ref15">15</xref>
          ].
        </p>
        <p>
          The function miopenSetConvolutionGroupCount may be used to set the
group count for a groupwise convolution. To perform a depthwise convolution use the
same function to set group count to the number of channels [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ].
        </p>
        <p>Composable Kernels Different variations of the convolution operation discussed above
as well as the variety of algorithms that may be used to implement them make it
difficult to develop efficient kernels. One solution to tackle this complexity is to break
down these operations into reusable modules that can be universally used by different
implementations of different algorithms, and express a kernel as a composition of these
modules.</p>
        <p>Development work would fall into one of the following categories: 1) describe an
algorithm with a hardware-agnostic expression, 2) decide how to map the
hardwareagnostic expressions into hardware-dependent modules, 3) implement and optimize the
hardware-dependent modules for specific hardware. Breaking down these primitives
into smaller modules opens new doors to optimization that may fuse these modules
together.</p>
        <p>MIOpen: An Open Source Library For Deep Learning Primitives 7</p>
        <p>This new kernel programming model is referred to as composable kernels in MIOpen.
MIOpen v2.0 includes an implementation of the implicit GEMM convolution
algorithm, using the composable kernel programming approach. Further details about this
novel programming paradigm will be published in the future.
4.2</p>
      </sec>
      <sec id="sec-4-3">
        <title>Batch Normalization</title>
        <p>Batch normalization is a very successful technique for accelerating deep neural
network training. There are two versions of batch normalization supported in MIOpen:
Per-activation and Spatial batch normalization. Per-activation batch
normalization is typically positioned after a fully connected layer in a network. Batch
normalization for convolution layers is termed spatial in that it learns separate scaling( i)
and bias( i) parameters for each channel, the resulting transform is applied to all the
activations in a single feature map.</p>
        <p>
          MIOpen supports the batch normalization operation for both training and inference.
They all accept the mode parameter from the miopenBatchNormMode t enum,
Which has two modes miopenBNPerActivation, which does element-wise
normalization for a fully connected layer and miopenBNSpatial which does
normalization for convolutions layers. For more information see [
          <xref ref-type="bibr" rid="ref20">20</xref>
          ] and [
          <xref ref-type="bibr" rid="ref21">21</xref>
          ].
4.3
        </p>
      </sec>
      <sec id="sec-4-4">
        <title>Recurrent Neural Networks</title>
        <p>MIOpen supports three RNN types prevalent in the industry and research: vanilla RNN,
LSTM and, GRU and two kinds of activation function for the hidden state of vanilla
RNN neuron: Rectified Linear Unit (ReLU) and hyperbolic tangent (Tanh).
Furthermore, information through the RNN may flow in the forward direction (unidirectional
RNNs) or both in the forward and backward directions (bi-directional RNNs). MIOpen
supports all three RNN types in the unidirectional miopenRNNunidirection as
well as the bidirectional model miopenRNNbidirection. Some RNN layers take
input sequences directly from the output of a previous layer while others require a
transform to align the intermediate vector dimension or simply to achieve better results.
MIOpen satisfies this requirement by supporting two input types: 1)
miopenRNNlinear, which performs a linear transform before feeding the input to the neuron, and 2)
miopenRNNskip, which allows a direct input into the neuron. Similarly, bias to the
neural network may be added or removed by choosing the mode
miopenRNNWithBias or miopenRNNNoBias.</p>
        <p>The dependence of current state on the previous state as well as different RNN
configurations make it difficult to achieve high computational efficiency on a GPU
platform. Prevalent frameworks such as TensorFlow encapsulate the state updating
functions of the RNN neuron in a cell format to achieve better compatibility in different
modes, though the impact of the data layouts and computation procedures on
performance is neglected. MIOpen handles the RNN computation by taking advantage of
two powerful ROCm platform GEMM libraries (1) rocBLAS for the HIP backend, and
(2) MIOpenGEMM for the OpenCL® backend, which are augmented by specialized
MIOpen kernels for other primitive functions.</p>
        <p>MIOpen achieves high computational efficiency for RNNs by batching together
different time steps and performing them as single GEMM operation. The is made possible
due to the independent input vectors at different time points.</p>
        <p>In addition to the operations mentioned above, other operations required to support
popular neural network architectures are also supported by MIOpen.
5</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Fusion API</title>
      <p>Most neural networks are data-flow graphs where data flows from one direction and
is operated upon as it moves from one layer to another. While conceptually data is
flowing only in one direction, the underlying kernels implementing these operations
have to read data from the global memory, operate on the data and then write the result
back for layers down the pipeline. This is necessary due to the limited on-chip memory
of the GPUs given the large image and filter sizes in neural network architectures.</p>
      <p>However, not all operations require that data be read from and written back to the
global memory each time. That is some operations may be fused to increase the compute
efficiency of these kernels. This merger of the operations to be performed by a single
kernel may be termed as kernel-fusion.</p>
      <p>As a simple example let us consider an addition operation followed by a rectified
linear unit (ReLU) operation. In this case, the intermediate result need not be written
back to the main memory, and both the operations may be performed while the
individual data elements are in the on-chip memory. Another common sequence of operations
is convolution followed by a bias (addition) and ReLU operation. It must be kept in
mind that fusions for other operators are much more involved such as the fusion of the
convolution and batch normalization operation.</p>
      <p>
        The MIOpen library offers the fusion API to facilitate the efficient fusion of such
operations; it allows the user to specify a sequence of operations that are desired to
be fused. Once the user specifies this sequence, MIOpen decides the applicable kernel
and compiles it; all this information is encapsulated in the
miopenFusionPlanDescriptor data structure [
        <xref ref-type="bibr" rid="ref21">21</xref>
        ].
      </p>
      <p>
        If merging of the required fusion sequence is feasible, the compilation step of the
fusion plan will return success; thereafter the user would supply the runtime arguments
for the kernels such as parameters for different operations. Following which, the user
would execute the fusion plan with data pointers for the input and output data. The
advantage of separating the compilation step from the argument structure is that the
fusion plan which has been compiled once, need not be compiled again for different
input values. Further details and example code can be found at [
        <xref ref-type="bibr" rid="ref20">20</xref>
        ].
6
      </p>
    </sec>
    <sec id="sec-6">
      <title>Results</title>
      <p>This section highlights the performance improvements that MIOpen is able to offers
particularly in convolution as well as some supported fusions. To date, the primary
beneficiary of Machine Learning progress has been machine vision as well as
Natural Language processing. In machine vision, the convolution operation is the primary</p>
      <p>
        MIOpen: An Open Source Library For Deep Learning Primitives 9
workhorse due to the low number of parameters required to learn as compared to regular
neural networks as well as the favorable mathematical properties. However, the
parameters associated with the convolution operations in different deep convolution neural
networks have changed considerably. The early CNNs employed larger filter sizes to
reduce the height and width of the feature maps and simultaneously increase the number
of feature maps. For instance, LeNet employed filters of size 5 5 while, Alexnet [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ]
contained filters of size 5 5 as well as 11 11. However, recently networks have
almost exclusively relied on smaller filter sizes namely only 1 1 and 3 3 coupled
with striding to reduce the size of the feature map.
      </p>
      <p>Figure 1 shows the relative speedup of different convolution configurations as
compared to MIOpen’s im2col+GEMM implementation. The configurations shown therein
have been selected randomly from different popular networks such as GoogLeNet,
Inception v3, and Inception v4 for image classification. The y-axis in Figure 1 shows log
of the speedup obtained by MIOpen, while the x-axis shows the labels for different
configurations. Each label shows, respectively, the filter height, filter width, input
channels, image height, image width, output channels, padding (height) and padding (width)
separated by a hyphen (-).</p>
      <p>Figures 1a, 1c and 1e depict the performance gains for kernels with filter height and
width equal to 1 (1 1 convolutions) in the forward, backwards-data and
backwardsweights directions respectively. While mathematically 1 1 convolutions may be
described as a pure GEMM operation, still MIOpen may provide substantial performance
benefit in certain cases. Similarly, Figures 1b, 1d and 1f show the performance benefit
attained for non-1 1 kernels in the forward, backward-data and backward-weights
directions respectively.</p>
      <p>As mentioned in Section 4 MIOpen employs the Winograd algorithm for applicable
convolutions while the 1 1 convolutions are primarily serviced by kernels written
in GCN ISA. Due to the efficiency of the Winograd algorithm, MIOpen can speed
up many 3 3 convolutions, however, on larger filter sizes it is not as effective due
to granularity loss. Wherein MIOpen’s other convolutional kernels step in to provide
speedup, however, in some cases, this speedup is not substantial. The MIOpen team is
continuously working on new algorithms to improve performance in these areas.
7</p>
    </sec>
    <sec id="sec-7">
      <title>Conclusions and Future Work</title>
      <p>This paper identified some of the challenges faced by a high performance computing
library and some of the mechanisms implemented in MIOpen to address these challenges
were presented. The open source nature of MIOpen makes it easy for researchers and
academics to experiment and implement novel solutions to these problems, the authors
look forward to constructive feedback from the community.</p>
    </sec>
    <sec id="sec-8">
      <title>Acknowledgements</title>
      <p>The MIOpen team would like to gratefully acknowledge the valuable contributions of
Alex Lyashevsky, James Newling, and the GitHub user ghostplant as well as the
support of the open source community.</p>
      <p>(a) 1x1 filter size (Forward)</p>
      <p>(b) non 1x1 filter sizes (Forward)
(c) 1x1 filter size (Backward Data)</p>
      <p>(d) non 1x1 filter sizes (Backward Data)
(e) 1x1 filter size (Backward Weights) (f) non 1x1 filter sizes (Backward
Weights)</p>
      <p>MIOpen: An Open Source Library For Deep Learning Primitives 11</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Abadi</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Barham</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chen</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chen</surname>
            ,
            <given-names>Z.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Davis</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Dean</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Devin</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ghemawat</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Irving</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Isard</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          , et al.:
          <article-title>TensorFlow: A system for large-scale machine learning</article-title>
          .
          <source>In: 12th fUSENIXg Symposium on Operating Systems Design and Implementation (fOSDIg 16)</source>
          . pp.
          <fpage>265</fpage>
          -
          <lpage>283</lpage>
          (
          <year>2016</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          <article-title>2. AMD GCN ISA</article-title>
          . https://developer.amd.com/resources/developer-guides- manuals ,
          <source>last accessed</source>
          <year>2020</year>
          /07/15
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>AMD</given-names>
            <surname>HIP</surname>
          </string-name>
          . https://github.com/ROCm-Developer-Tools/HIP, last accessed
          <year>2020</year>
          /08/13
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <given-names>AMD</given-names>
            <surname>Inc: ROCm - Open Source</surname>
          </string-name>
          <article-title>Platform for HPC and Ultrascale GPU Computing</article-title>
          , https: //github.com/ROCmSoftwarePlatform, last accessed
          <year>2020</year>
          /08/14
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Belter</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Jessup</surname>
            ,
            <given-names>E.R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Karlin</surname>
            ,
            <given-names>I.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Siek</surname>
            ,
            <given-names>J.G.</given-names>
          </string-name>
          :
          <article-title>Automating the generation of composed linear algebra kernels</article-title>
          .
          <source>In: Proceedings of the Conference on High Performance Computing Networking, Storage and Analysis</source>
          . p.
          <fpage>59</fpage>
          .
          <string-name>
            <surname>ACM</surname>
          </string-name>
          (
          <year>2009</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Chen</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Moreau</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Jiang</surname>
            ,
            <given-names>Z.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Shen</surname>
            ,
            <given-names>H.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Yan</surname>
            ,
            <given-names>E.Q.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wang</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hu</surname>
            ,
            <given-names>Y.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ceze</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Guestrin</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Krishnamurthy</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>TVM: end-to-end optimization stack for deep learning</article-title>
          .
          <source>arXiv preprint arXiv:1802</source>
          .04799 pp.
          <fpage>1</fpage>
          -
          <lpage>15</lpage>
          (
          <year>2018</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Chetlur</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Woolley</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Vandermersch</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Cohen</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Tran</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Catanzaro</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Shelhamer</surname>
          </string-name>
          , E.: cuDNN:
          <article-title>Efficient Primitives for Deep Learning</article-title>
          . arXiv pp.
          <fpage>1</fpage>
          -
          <lpage>9</lpage>
          (
          <year>2014</year>
          ). https://doi.org/10.1002/polb.23894, http://arxiv.org/abs/1410.0759
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Clang</surname>
          </string-name>
          <article-title>: a C language family frontend for LLVM, http</article-title>
          : / / clang . llvm . org/ last accessed 2020/07/18
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Hochreiter</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Schmidhuber</surname>
            ,
            <given-names>J.: Long</given-names>
          </string-name>
          <string-name>
            <surname>Short-Term Memory</surname>
          </string-name>
          .
          <source>Neural Computation</source>
          <volume>9</volume>
          (
          <issue>8</issue>
          ),
          <fpage>1735</fpage>
          -
          <lpage>1780</lpage>
          (
          <year>1997</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Howard</surname>
            ,
            <given-names>A.G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Zhu</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chen</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kalenichenko</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wang</surname>
            ,
            <given-names>W.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Weyand</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Andreetto</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Adam</surname>
          </string-name>
          , H.:
          <article-title>MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications</article-title>
          . arXiv preprint arXiv:
          <volume>1704</volume>
          .04861 (
          <year>2017</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Intel</surname>
            <given-names>MKL</given-names>
          </string-name>
          -DNN, https://software.intel.com/en- us/articles/introducing- dnn
          <string-name>
            <surname>-</surname>
          </string-name>
          primitives
          <string-name>
            <surname>-</surname>
          </string-name>
          inintelr-mkl
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Jia</surname>
            ,
            <given-names>Y.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Shelhamer</surname>
            ,
            <given-names>E.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Donahue</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Karayev</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Long</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Girshick</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Guadarrama</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Darrell</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          :
          <article-title>Caffe: Convolutional architecture for fast feature embedding</article-title>
          .
          <source>arXiv preprint arXiv:1408.5093</source>
          (
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Kjolstad</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kamil</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chou</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Lugato</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Amarasinghe</surname>
            ,
            <given-names>S.:</given-names>
          </string-name>
          <article-title>The tensor algebra compiler</article-title>
          .
          <source>Proceedings of the ACM on Programming Languages 1(OOPSLA)</source>
          ,
          <volume>77</volume>
          (
          <year>2017</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Kjolstad</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kamil</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ragan-Kelley</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Levin</surname>
            ,
            <given-names>D.I.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Sueda</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chen</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Vouga</surname>
            ,
            <given-names>E.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kaufman</surname>
          </string-name>
          , D.M.,
          <string-name>
            <surname>Kanwar</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Matusik</surname>
            ,
            <given-names>W.</given-names>
          </string-name>
          , et al.:
          <article-title>Simit: A language for physical simulation</article-title>
          .
          <source>ACM Transactions on Graphics (TOG) 35(2)</source>
          ,
          <volume>20</volume>
          (
          <year>2016</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <surname>Krizhevsky</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Sutskever</surname>
            ,
            <given-names>I.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hinton</surname>
          </string-name>
          , G.E.:
          <article-title>ImageNet classification with deep convolutional neural networks</article-title>
          .
          <source>In: Advances in neural information processing systems</source>
          . pp.
          <fpage>1097</fpage>
          -
          <lpage>1105</lpage>
          (
          <year>2012</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16.
          <string-name>
            <surname>Lattner</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Pienaar</surname>
            ,
            <given-names>J.: MLIR</given-names>
          </string-name>
          <article-title>Primer: A Compiler Infrastructure for the End of Moore's Law</article-title>
          .
          <source>Google Research</source>
          (
          <year>2019</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17.
          <string-name>
            <surname>Lavin</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Gray</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          :
          <article-title>Fast algorithms for convolutional neural networks</article-title>
          .
          <source>In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition</source>
          . pp.
          <fpage>4013</fpage>
          -
          <lpage>4021</lpage>
          (
          <year>2016</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          18.
          <string-name>
            <surname>Lawson</surname>
            ,
            <given-names>C.L.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hanson</surname>
          </string-name>
          , R.J.,
          <string-name>
            <surname>Kincaid</surname>
            ,
            <given-names>D.R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Krogh</surname>
            ,
            <given-names>F.T.</given-names>
          </string-name>
          :
          <article-title>Basic linear algebra subprograms for fortran usage</article-title>
          .
          <source>vol. 5</source>
          , pp.
          <fpage>308</fpage>
          -
          <lpage>323</lpage>
          . ACM New York, NY, USA (
          <year>1979</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          19.
          <string-name>
            <surname>Leary</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wang</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          :
          <article-title>XLA: TensorFlow, compiled</article-title>
          .
          <source>TensorFlow Dev Summit</source>
          (
          <year>2017</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          20. MIOpen: Documentation, https://rocmsoftwareplatform.github.io/MIOpen/doc/html, last accessed
          <year>2020</year>
          /08/14
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          21.
          <article-title>MIOpen: AMD's library for high performance machine learning primitives</article-title>
          , https://github. com/ROCmSoftwarePlatform/MIOpen, last accessed
          <year>2020</year>
          /05/15
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          22.
          <string-name>
            <surname>MLIR</surname>
          </string-name>
          <article-title>: Multi-level Intermediate Representation for Compiler Infrastructure</article-title>
          . https://github. com/tensorflow/mlir, last accessed
          <year>2020</year>
          /09/03
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          23.
          <string-name>
            <surname>Munshi</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>The OpenCL specification</article-title>
          .
          <source>In: Hot Chips 21 Symposium (HCS)</source>
          ,
          <year>2009</year>
          IEEE. pp.
          <fpage>1</fpage>
          -
          <lpage>314</lpage>
          . IEEE (
          <year>2009</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          24.
          <string-name>
            <surname>Paszke</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Gross</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Massa</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Lerer</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Bradbury</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Chanan</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Killeen</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Lin</surname>
            ,
            <given-names>Z.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Gimelshein</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Antiga</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          , et al.:
          <article-title>Pytorch: An imperative style, high-performance deep learning library</article-title>
          .
          <source>In: Advances in neural information processing systems</source>
          . pp.
          <fpage>8026</fpage>
          -
          <lpage>8037</lpage>
          (
          <year>2019</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          25.
          <string-name>
            <surname>Ragan-Kelley</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Barnes</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Adams</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          , Paris, S.,
          <string-name>
            <surname>Durand</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Amarasinghe</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          :
          <article-title>Halide: a language and compiler for optimizing parallelism, locality, and recomputation in image processing pipelines</article-title>
          .
          <source>Acm Sigplan Notices</source>
          <volume>48</volume>
          (
          <issue>6</issue>
          ),
          <fpage>519</fpage>
          -
          <lpage>530</lpage>
          (
          <year>2013</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          26.
          <string-name>
            <surname>Rotem</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Fix</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Abdulrasool</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Catron</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Deng</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Dzhabarov</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Gibson</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hegeman</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Lele</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Levenstein</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          , et al.:
          <article-title>Glow: Graph lowering compiler techniques for neural networks</article-title>
          .
          <source>arXiv preprint arXiv:1805</source>
          .
          <volume>00907</volume>
          (
          <year>2018</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          27.
          <string-name>
            <surname>Vasilache</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Zinenko</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Theodoridis</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Goyal</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>DeVito</surname>
            ,
            <given-names>Z.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Moses</surname>
            ,
            <given-names>W.S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Verdoolaege</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Adams</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Cohen</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Tensor Comprehensions: Framework-Agnostic High-Performance Machine Learning Abstractions</article-title>
          .
          <source>arXiv 2</source>
          (
          <year>2018</year>
          ), http://arxiv.org/abs/
          <year>1802</year>
          .04730
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          28.
          <string-name>
            <surname>Whaley</surname>
            ,
            <given-names>R.C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Dongarra</surname>
            ,
            <given-names>J.J.:</given-names>
          </string-name>
          <article-title>Automatically tuned linear algebra software</article-title>
          .
          <source>In: SC'98: Proceedings of the 1998 ACM/IEEE conference on Supercomputing</source>
          . pp.
          <fpage>38</fpage>
          -
          <lpage>38</lpage>
          . IEEE (
          <year>1998</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref29">
        <mixed-citation>
          29.
          <string-name>
            <surname>You</surname>
            ,
            <given-names>Y.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Zhang</surname>
            ,
            <given-names>Z.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hsieh</surname>
            ,
            <given-names>C.J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Demmel</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Keutzer</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          :
          <article-title>ImageNet training in minutes</article-title>
          .
          <source>In: Proceedings of the 47th International Conference on Parallel Processing</source>
          . p.
          <fpage>1</fpage>
          .
          <string-name>
            <surname>ACM</surname>
          </string-name>
          (
          <year>2018</year>
          )
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>