<!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>Specific Read Only Data Management for Memory Hierarchy Optimization</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Gregory Vaumourin, Dombek Thomas,</string-name>
          <email>{firstname}.{lastname}@cea.fr</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Denis Barthou</string-name>
          <email>denis.barthou@labri.fr</email>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Guerre Alexandre, CEA, LIST, Embedded Computing Laboratory</institution>
          ,
          <addr-line>Gif-sur-Yvette, F-91191</addr-line>
          <country country="FR">France.</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>INRIA Bordeaux Sud-Ouest, LaBRI, Bordeaux Institute of Technology</institution>
          ,
          <addr-line>Bordeaux</addr-line>
          ,
          <country country="FR">France</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2014</year>
      </pub-date>
      <abstract>
        <p>The multiplication of the number of cores inside embedded systems has raised the pressure on the memory hierarchy. The cost of coherence protocol and the scalability problem of the memory hierarchy is nowadays a major issue. In this paper, a speci c data management for read-only data is investigated because these data can be duplicated in several memories without being tracked. Based on analysis of standard benchmarks for embedded systems, this analysis shows that read-only data represent 62% of all the data used by applications and 18% of all the memory accesses. A speci c data path for read-only data is then evaluated by using simulations. On the rst level of the memory hierarchy, removing read-only data of the L1 cache and placing them in another read-only cache improve the data locality of the read-write data by 30% and decrease the total energy consumption of the rst level memory by 5%.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;read-only data</kwd>
        <kwd>memory hierarchy</kwd>
        <kwd>cache</kwd>
        <kwd>data management</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. INTRODUCTION</title>
      <p>
        As demands for higher performance keep growing,
multicore systems have become popular in embedded systems.
Memory system design is a critical problem for multi-core
embedded systems. With the increasing number of cores,
the cost of adopting hardware-controlled caches and
ensuring coherency in embedded systems becomes extremely high.
There are two reasons for this cost increase. Firstly, the
power overhead of automatic memory management in
memory caches is growing prohibitively. It represents almost half
of the overall energy for a single-processor [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. Secondly, the
coherence protocols lack scalability beyond a certain number
of cores.
      </p>
      <p>
        Two basic memory models are used for the memory [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ]:
hardware-managed caches and software-managed
scratch
      </p>
      <p>Data are used in a read-only way either for the whole
application execution like input data, or for a limited scope such
as a function, or a kernel. In the latter case, read-write data
are in a read mode for a long time during the application's
execution. The memory accesses of these data may also
bene t from this speci c memory organization. A data transfer
cost between the two data paths must be considered in this
case.</p>
      <p>The long term perspective is to propose an architecture
where read-only data are removed from the original memory
hierarchy and are managed in a di erent memory
organization. This idea is similar to the one in Harvard architecture
where instruction and data are handled in di erent
memories. This new memory subsystem would be added in
parallel to a classic memory system, and optimized for read-only
data. This solution aims to be transparent for the user and
generic to embedded systems. In order to use this system
transparently, some steps are to be considered during
compilation. The compiler has to detect read-only data, and
may use some user information, such as those provided in
parallel languages like OpenCL, or OpenACC.</p>
      <p>This study considered several scenarios where read-only data
are removed from the original memory organization and
handled in a di erent one. The special management of read-only
data is not optimized yet and will be considered in future
work. Firstly, read-only data are detected and quanti ed
for a whole set of applications. Secondly, by using
simulation, di erent data management are tested and compared
in terms of energy consumption and data locality. The rest
of the paper is organized as follows: Section 2 describes a
quanti cation on read-only data. In Section 3, several
scenarios of memory access separation are introduced. These
scenarios are compared in terms of data locality in Section
4 and in terms of energy consumption in Section 5. Finally,
related works are discussed in Section 6.</p>
    </sec>
    <sec id="sec-2">
      <title>2. READ-ONLY DATA ANALYSIS</title>
      <p>
        The rst step of the evaluation is to show that read-only data
count for a signi cant part of the working set of applications
in embedded systems. This analysis is a trace-driven
analysis on the standard Mibench benchmark [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]. Mibench is
studied because it is a representative set of applications used
in embedded systems. All the applications of the benchmark
are compiled on a x86 platform and are used with their
default input data set given with the applications.
The memory access analysis is performed through traces. A
trace records the ow of memory access occurring during an
execution of the application (including those done in
external libraries and in the stack). The study focuses only on
data, instruction fetches are not recorded. The trace allows
to launch several simulations on the same ow of memory
accesses to compare di erent memory hierarchies and data
management policy.
      </p>
      <p>
        The generation of the trace le is achieved by Maqao [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], a
static instrumentation tool that operates directly on binary
code. It is used to record which address is read/written for
every instruction that access the memory and the size of the
accessed data. The memory trace is compressed on the y
with the zlib library. Statistics about read-only data are
deduced from the trace.
      </p>
      <p>The analysis results are shown in Fig.1. On average, 62% of
used data are in a read-only state but they represent only
18% of the accesses made by the application. The
proportions of read-only data and the number of accesses are very
asymmetrical. It could be partially explained by the fact
that the stack is not removed from the analysis. The data
in the stack represent few data, but the same stack addresses
are used many times. Intuitively, this asymmetry between
access proportion and data proportion suggests that
readonly data are not reused as much as other data and can
cause some pollution in the memory systems.</p>
      <p>This simple analysis shows that read-only data count for a
signi cant proportion of data used by applications in
embedded systems. It is important enough to consider some
speci c memory hierarchy optimizations for these data. In the
following sections, the data path separation between
readonly and read-write data is studied.</p>
    </sec>
    <sec id="sec-3">
      <title>3. SCENARIOS PROPOSITION</title>
      <p>In order to explore the possibility of adding speci c data
path in the memory hierarchy for read-only data, memory
accesses are divided in several categories. Two scenarios of
memory access separation are tested on simulation and
analyzes are performed for comparison between those scenarios.</p>
    </sec>
    <sec id="sec-4">
      <title>3.1 Classification of memory access</title>
      <p>For this study, memory accesses are classi ed as follows: 1)
accesses to read-only data, 2) accesses to detected read areas
or 3) accesses that do not belong to one of the two previous
categories. Read areas are de ned as a group of read accesses
which are not separated from each other by write accesses in</p>
      <sec id="sec-4-1">
        <title>Read7access</title>
      </sec>
      <sec id="sec-4-2">
        <title>Write access</title>
      </sec>
      <sec id="sec-4-3">
        <title>Access7on7Read-only Areas</title>
      </sec>
      <sec id="sec-4-4">
        <title>Access7on7 read-only data</title>
      </sec>
      <sec id="sec-4-5">
        <title>Acces on7</title>
      </sec>
      <sec id="sec-4-6">
        <title>Read-write data Data A</title>
        <p>time and address directions. This corresponds for instance
to a read access to an array region. Read areas are detected
on read-write data and cannot include accesses to read-only
data so an access belongs to only one of three categories
de ned previously. The concept of read areas is introduced
in order to place in the speci c read-only memory,
readwrite data that present read-only behavior during execution.
For example, read areas can be detected with intermediate
results of an algorithm that are generated (written) rst and
then read for the rest of the algorithm.</p>
        <p>For a better understanding, an example of this classi cation
is shown in Fig. 2. It represents the accesses made by an
application during the rst time frames. The data set is
composed of 7 distinct data (A, B, C, D, E, F, G). All the
data are initialized (written) in the rst time frame. Then,
A,B and C are only read (never written to) so they are
considered as read-only data and all accesses to these A,B,C
belong to the rst category. Then, the area detection
algorithm is launched on the remaining accesses and one read
area is detected, the accesses in the dark green area in Fig. 2
belongs to the second category. All other accesses belongs
to the third category.</p>
        <p>A minimal size for the detected area is xed for two main
reasons. First, if this limit is not set, every read memory
access can be considered as a read area on its own.
Second, the proposed detection focuses on big areas of read
access with data reuse, detecting data structures or data
regions more than individual data accesses. After
experimentations, read areas are kept for this study only if more
than 128 memory accesses are done on this area. According
to the de ned classi cation, on Mibench benchmarks, the
repartition shows that on average, 17.8% of all memory
accesses are accesses to read-only data and 6.9% are accesses
to read areas. The remaining 75.3% of the memory accesses
are not concerned by the solution.</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>3.2 Data Management Policy</title>
      <p>As mentioned in the introduction, the possibility of adding
a new data path along the memory hierarchy speci c for the
read-only data is studied. All the other data use a classic
cache hierarchy. The instructions are not considered in these
simulations and are supposed to be handled in a di erent
memory organization. The impact of adding this speci c
memory is studied on the rst level of memory hierarchy.
Fig. 3 shows three di erent scenarios studied in this
anal1 2 3 4 5 6 7 8 9 10 11 12 13 14 Time7Frame
CPU</p>
      <sec id="sec-5-1">
        <title>L2 Cache</title>
      </sec>
      <sec id="sec-5-2">
        <title>L1 Cache:</title>
        <p>- Read-write access
Scenario 1 - Read-only access
(Reference) - Read areas access
ysis. Scenario n 1 is the reference scenario where there is
no speci c management for the read-only data and all the
categories of access use the classic cache memory
organization. In scenario n 2, accesses to read-only data are removed
from the classic way and are handled in the speci c memory.
Scenario n 3 is the same as scenario n 2, but the read areas
accesses are also placed in the speci c memory. Since read
areas are detected on read-write data, the data in read areas
take both paths depending on the timing. During
simulations, the speci c memory is modeled as a simple memory
cache. In order to simulate these scenarios, ve memory
traces are generated, one for each memory of each scenario.
The original full trace of the application is used for the
scenario n 1 as a reference. For scenarios 2 and 3, partial
memory traces are generated from the original trace, accesses are
removed according to the data management policy, in order
to form the memory access ow for each memory. If no read
area is detected, scenarios 2 and 3 are the same. This case
happens for 10 out of 26 benchmarks tested. The L2 cache
is uni ed for all the data. For the rest of the paper, the rst
level cache for read-only data will be called the RO cache
and the rst level cache for read-write data will be called
RW cache. In the following section, two analysis are
presented, a data locality analysis and an energy consumption
analysis, to compare these scenarios.</p>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>4. DATA LOCALITY ANALYSIS</title>
      <p>Data locality is important in order to take advantage of CPU
caching. The data locality can be evaluated by the stack
distance which is computed for all scenarios on all benchmarks.</p>
    </sec>
    <sec id="sec-7">
      <title>4.1 Definition</title>
      <p>
        The stack distance [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] measures the distance in time between
the use and subsequent reuse of the same data location. It
is an indicator of the temporal locality of the data and
depends solely on the software. Bad temporal locality leads
to pollution in the memory hierarchy. The pollution
happens when a data is loaded in the cache and is evicted from
the cache before being reused. In this situation, copying the
data in the cache is a waste. Moreover, it takes the place of
another potentially more interesting data in the cache. The
application should access the data directly through main
memory. For a LRU (least recently used) fully-associative
cache, cache misses can directly be deduced from the stack
distance computation. For more complex caches, the stack
distance remains still a good predictor [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. Generally, the
higher the stack distance is, the higher is the probability
that this access provokes a cache miss. Lots of algorithms
are proposed in literature to compute the stack distance e
ciently. The algorithm implemented for the scenario is based
on the Bennet version [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ].
      </p>
    </sec>
    <sec id="sec-8">
      <title>4.2 Analysis</title>
      <p>To allow a meaningful comparison of di erent scenarios, the
average stack distances are always compared separately for
read-only and read-write data. Three steps are followed for
the analysis:
In a rst step, for each application of Mibench, the stack
distances are computed on the full memory trace of the
scenario 1. Once the stack distances are computed for all
accesses, the average stack distance is computed separately for
accesses to read-only data and accesses to read-write data
(read area accesses are included in the accesses to read-write
data). For all the applications, the average stack distance
of read-only data is 16 times higher than the average stack
distance of read-write data. So, the di erence of locality
is very signi cant, and means that read-only data are less
reused and pollute the classic L1 cache.</p>
      <p>In a second step, the values of the stack distances computed
previously are compared to the stack distance of scenario 2.
The variation of the stack distance for read-only data and
read-write data between the scenario 1 and 2 are shown in
Fig. 4. The decrease of the stack distance for scenario 2
is expected because separating data always leads to global
data locality improvement. The reason is that in each way
of the hierarchy, the number of accesses between two calls to
a same data is reduced. For the RW cache, only 18% of the
accesses are removed and the stack distance is reduced by
30% and for read-only data, 82% of the access are removed
and stack distance is reduced by 38%. This is asymmetric
between the number of removed accesses and the decrease
of the stack distance. Separating read-only and read-write
data improves signi cantly the read-write data locality.
In a third step, a metric is introduced in order to compare
the locality between all the scenarios. For the scenario 1, the
average stack distance of the full trace is computed without
data distinction. For scenario 2 and 3, a weighted sum is
computed by adding average stack distances for read-only
and read-write data in proportion of their respective number
of accesses. It gives a comparable global stack distance for
each scenario. The Fig. 5 shows the variation of the global
stack distance of scenario 2 and 3 compared to scenario 1.
On average, the global stack distance is improved by 19%
for the scenario 2 and 30% for the scenario 3. For almost
every application, the data separation improves the overall
locality.</p>
      <p>These results suggest that it is pro table to separate the
read-only and read-write data in terms of data locality. The
following section studies the proposition with respect to
energy consumption.</p>
    </sec>
    <sec id="sec-9">
      <title>5. ENERGY CONSUMPTION ANALYSIS</title>
      <p>The main motivation of this work is to reduce the energy
consumption of the memory hierarchy. An energy model is
introduced and the three scenarios are simulated to compute
energy consumption. On the contrary to the stack distance,
this analysis depends on the hardware.</p>
    </sec>
    <sec id="sec-10">
      <title>5.1 Energy Consumption Model</title>
      <p>
        The energy consumption of the cache is computed with a
simple energy model. The CPU is not modeled and the
study focuses only on the dynamic energy of the rst level
memories of the memory hierarchy. For each cache, the
dynamic energy consumption is determined as follow:
DynEnergyCache = energyP erAccessCache nbHitsCache
+energyM iss nbM issCache
energyM iss = energyP erAccessL2 + energyCPUStall
+energyCacheBlockFill
(1)
The underlined terms are ignored for the moment. The
energyCPUStall is the energy consummed when the CPU
is stalled while waiting for the memory system to provide
data and the energyCacheBlockFill is the energy for writing
a block into the cache. The energyPerAccessL1 and
energyPerAccessL2 are determined with Cacti v6.5 [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ] and the
cacheHitsL1 and cacheMissL1 are determined by
simulations with the cache simulator dineroIV [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]. For the scenario
2 and 3, the energy consumption of the rst level hierarchy
is the addition of the energy consumption of the RW cache
and the RO cache.
      </p>
    </sec>
    <sec id="sec-11">
      <title>5.2 Analysis</title>
      <p>The energy consumption of all the applications of the Mibench
benchmarks is studied. To simulate with dineroIV and Cacti
the described scenarios, cache designs have to be chosen.
First, the scenario 1 is explored extensively in order to
determine the most e cient design of the classic cache. The
cache's design that minimizes the average energy
consumption on Mibench is a cache of 16KB with 2-way set
associativity. The energy consumption of the scenarios 2 and 3
is compared to this reference. To do a fair comparison
between scenarios, an equivalent storage size at the rst level
of the memory hierarchy for each scenario has to be used. In
Section 4, it has been pointed out that read-only data have
a weak locality, it suggests that the RO cache must have an
important size relatively to the number of memory access it
will handle. The choices for the design for the RW cache and
the RO cache are shown in Table 1. All the applications are
simulated independently in the cache, and the energy
consumption model gives the total energy consummed by each
application for the rst level memories. The energy
consumption of each application is then added to get the total
energy consumption foFerr each scenario of all the Mibench
applications.</p>
      <p>Creating a two caches system instead of one has two
consequences on the energy consumption. The resources are
Variation Scenario 2
Locality
Variation Scenario 3
Locality
0,20
)e 0,16
l
u
o
(J
itno 0,12
p
m
u
sn 0,08
o
C
y
g
r
en 0,04
E
0,00
RO Cache
RW Cache
Scenario 1
not mutualized so some of them can be underutilized
leading to energy consumption increase. On the other hand, a
good data separation decreases the pollution in each cache
which reduces energy consumption. For each application of
the Mibench benchmark, the generated memory traces are
simulated through dineroIV and the energy consumption is
computed for each application. Then, the energy
consumption of each application is added for each scenario. As shown
in Fig. 6 energy consumptions in scenarios 2 and 3 are
approximately the same. There is an improvement of 6.5% of
energy for scenario 2 and 5.0% for scenario 3 compared to
the scenario 1. It shows that read-only data can be
handled in a di erent memory without adding energy overhead.
Indeed, even with conventional caches for the speci c
readonly memory, there is no overhead when dividing L1-cache.
For scenario 3, the cost of switching read accesses between
the RW and the RO cache has been ignored for the
moment so the energy consumption for scenario 3 is probably
under-evaluated compared to a real situation.</p>
    </sec>
    <sec id="sec-12">
      <title>6. RELATED WORK</title>
      <p>
        Proposing special memories on the hierarchy to manage
speci c data is not new. A lot of solutions have been proposed
in literature to automatically use scratchpads memories for
speci c data management. The rest of the data, are often
accessed directly through main memory or can go through
a cache parallel to the scratchpad. Some examples could be
found for the heap [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ], the stack [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ] or array tiles [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
These solutions targeted uni-core systems and also
multicore systems. In [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ], an algorithm for heap management in
scratchpad is proposed. Managing the heap is challenging
since the actual size of the data is known only at runtime.
This solution divides the application in region and a
compiletime analysis is performed on these regions to place the most
used heap variables in the scratchpad. Code is added
automatically to (de)allocate the scratchpad. In [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ], an
extension to the openMP compiler is proposed to place array tiles
on scratchpads. The compiler realizes pattern recognition.
It detects regular and irregular array access patterns and
automatically produces code to activate the DMA transfers
between scratchpads and the main memory in order to
distribute the array tiles on the scratchpads.
      </p>
      <p>
        Partitioning cache is another technique that allows speci c
data management. The solution proposed in [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ] separates
I/O data from CPU data by adding a speci c cache for I/O
data. Even if the technique has di erent motivations, the
work makes an analysis similar to the one presented in this
paper.
      </p>
      <p>
        The speci c data management of read-only data is not widely
studied in literature. Some solutions have been proposed
like in the Fermi and Kepler [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] architecture of the NVIDIA
GPU's architectures. At the rst level of the memory
hierarchy, a speci c read-only cache is added in parallel to a
shared memory and a private L1 cache. The developer or
the compiler needs to indicate the data that will go through
the read-only cache. Another solution is proposed by Guo
et al [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ], on a VS-SPM (virtually shared scratchpad
memories) architecture which proposes a solution of data
management for shared data is proposed. The proposed algorithm
allows the duplication of read-only data in several
scratchpads if the duplication comes with an energy reduction.
      </p>
    </sec>
    <sec id="sec-13">
      <title>7. CONCLUSION</title>
      <p>The paper has an analysis of the opportunity to handle
in di erent caches, data that is read-only, either for the
whole application or a limited amount of time. The results
show that there are some optimization potentials for
speci c data management for read-only data. Even if the
memories where read-only data are placed do not yet exploit
the read-only property, simulations show that the division
between read-only and read-write data on the rst level of
memory hierarchy improves the data locality (in average,
30% on Mibench benchmarks) and does not introduce
energy consumption overhead. The main interest of exploiting
read-only data appears in a multi-core environment, since
they can be shared without being handled by a costly
coherence protocol. The future work will focus on optimizing
the read-only sub-hierarchy in an actual multi-core
environment. Furthermore, the impact of compiler on the detection
of read-only data and read areas need to be evaluated.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>R.</given-names>
            <surname>Banakar</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Steinke</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.-S.</given-names>
            <surname>Lee</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Balakrishnan</surname>
          </string-name>
          , and
          <string-name>
            <given-names>P.</given-names>
            <surname>Marwedel</surname>
          </string-name>
          .
          <article-title>Scratchpad memory: Design alternative for cache on-chip memory in embedded systems</article-title>
          .
          <source>In Proceedings of the Tenth International Symposium on Hardware/Software Codesign, CODES '02</source>
          , pages
          <fpage>73</fpage>
          {
          <fpage>78</fpage>
          , New York, NY, USA,
          <year>2002</year>
          . ACM.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>D.</given-names>
            <surname>Barthou</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. Charif</given-names>
            <surname>Rubial</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Jalby</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Koliai</surname>
          </string-name>
          , and
          <string-name>
            <given-names>C.</given-names>
            <surname>Valensi</surname>
          </string-name>
          .
          <article-title>Performance tuning of x86 openmp codes with maqao</article-title>
          . In M. S. MA~ ijller,
          <string-name>
            <surname>M. M. Resch</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Schulz</surname>
          </string-name>
          , and W. E. Nagel, editors,
          <source>Tools for High Performance Computing</source>
          <year>2009</year>
          , pages
          <fpage>95</fpage>
          {
          <fpage>113</fpage>
          . Springer Berlin Heidelberg,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>B. T.</given-names>
            <surname>Bennett</surname>
          </string-name>
          and
          <string-name>
            <given-names>V. J.</given-names>
            <surname>Kruskal</surname>
          </string-name>
          .
          <article-title>Lru stack processing</article-title>
          .
          <source>IBM J. Res. Dev.</source>
          ,
          <volume>19</volume>
          (
          <issue>4</issue>
          ):
          <volume>353</volume>
          {
          <fpage>357</fpage>
          ,
          <year>July 1975</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>K.</given-names>
            <surname>Beyls</surname>
          </string-name>
          and
          <string-name>
            <given-names>E. H.</given-names>
            <surname>Hollander</surname>
          </string-name>
          .
          <article-title>Reuse distance as a metric for cache behavior</article-title>
          .
          <source>In In processings of the IASTED conference on parallel and distributed computing and systems</source>
          , pages
          <volume>617</volume>
          {
          <fpage>662</fpage>
          ,
          <year>2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>G.</given-names>
            <surname>Chen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Ozturk</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Kandemir</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M.</given-names>
            <surname>Karakoy</surname>
          </string-name>
          .
          <article-title>Dynamic scratch-pad memory management for irregular array access patterns</article-title>
          .
          <source>In Proceedings of the Conference on Design, Automation and Test in Europe: Proceedings, DATE '06</source>
          , pages
          <fpage>931</fpage>
          {
          <fpage>936</fpage>
          ,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <surname>E. G.</surname>
          </string-name>
          <article-title>Co man, Jr</article-title>
          . and
          <string-name>
            <given-names>P. J.</given-names>
            <surname>Denning</surname>
          </string-name>
          .
          <source>Operating Systems Theory. Prentice Hall Professional Technical Reference</source>
          ,
          <year>1973</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>A.</given-names>
            <surname>Dominguez</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Udayakumaran</surname>
          </string-name>
          , and
          <string-name>
            <given-names>R.</given-names>
            <surname>Barua</surname>
          </string-name>
          .
          <article-title>Heap data allocation to scratch-pad memory in embedded systems</article-title>
          .
          <source>J. Embedded Comput.</source>
          ,
          <volume>1</volume>
          (
          <issue>4</issue>
          ):
          <volume>521</volume>
          {
          <fpage>540</fpage>
          ,
          <string-name>
            <surname>Dec</surname>
          </string-name>
          .
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>J.</given-names>
            <surname>Edler</surname>
          </string-name>
          and
          <string-name>
            <given-names>M. D.</given-names>
            <surname>Hill</surname>
          </string-name>
          .
          <article-title>Dinero iv trace-driven uniprocessor cache</article-title>
          .
          <year>1998</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>P.</given-names>
            <surname>Glaskwsky</surname>
          </string-name>
          .
          <article-title>Nvida's fermi: The rst complete gpu computing architecture</article-title>
          .
          <source>White Paper</source>
          ,
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>Y.</given-names>
            <surname>Guo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Q.</given-names>
            <surname>Zhuge</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Hu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Yi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Qiu</surname>
          </string-name>
          , and
          <string-name>
            <given-names>E.-M.</given-names>
            <surname>Sha</surname>
          </string-name>
          .
          <article-title>Data placement and duplication for embedded multicore systems with scratch pad memory</article-title>
          .
          <source>Computer-Aided Design of Integrated Circuits and Systems</source>
          , IEEE Transactions on,
          <volume>32</volume>
          (
          <issue>6</issue>
          ):
          <volume>809</volume>
          {
          <fpage>817</fpage>
          ,
          <year>June 2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>M. R.</given-names>
            <surname>Guthaus</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J. S.</given-names>
            <surname>Ringenberg</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Ernst</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T. M.</given-names>
            <surname>Austin</surname>
          </string-name>
          , T. Mudge, and
          <string-name>
            <given-names>R. B.</given-names>
            <surname>Brown</surname>
          </string-name>
          . Mibench:
          <article-title>A free, commercially representative embedded benchmark suite</article-title>
          .
          <source>In Proceedings of the Workload Characterization</source>
          ,
          <year>2001</year>
          . WWC-4. 2001 IEEE International Workshop, WWC '
          <volume>01</volume>
          , pages
          <fpage>3</fpage>
          <lpage>{</lpage>
          14, Washington, DC, USA,
          <year>2001</year>
          . IEEE Computer Society.
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>J.</given-names>
            <surname>Leverich</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Arakida</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Solomatnikov</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Firoozshahian</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Horowitz</surname>
          </string-name>
          , and
          <string-name>
            <given-names>C.</given-names>
            <surname>Kozyrakis</surname>
          </string-name>
          .
          <article-title>Comparing memory systems for chip multiprocessors</article-title>
          .
          <source>SIGARCH Comput. Archit. News</source>
          ,
          <volume>35</volume>
          (
          <issue>2</issue>
          ):
          <volume>358</volume>
          {
          <fpage>368</fpage>
          ,
          <year>June 2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>A.</given-names>
            <surname>Marongiu</surname>
          </string-name>
          and
          <string-name>
            <given-names>L.</given-names>
            <surname>Benini</surname>
          </string-name>
          .
          <article-title>An openmp compiler for e cient use of distributed scratchpad memory in mpsocs</article-title>
          . Computers, IEEE Transactions on,
          <volume>61</volume>
          (
          <issue>2</issue>
          ):
          <volume>222</volume>
          {
          <fpage>236</fpage>
          ,
          <string-name>
            <surname>Feb</surname>
          </string-name>
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>N.</given-names>
            <surname>Muralimanohar</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Balasubramonian</surname>
          </string-name>
          , and
          <string-name>
            <given-names>N.</given-names>
            <surname>Jouppi</surname>
          </string-name>
          .
          <article-title>Architecting e cient interconnects for large caches with cacti 6.0</article-title>
          .
          <string-name>
            <surname>Micro</surname>
          </string-name>
          , IEEE,
          <volume>28</volume>
          (
          <issue>1</issue>
          ):
          <volume>69</volume>
          {
          <fpage>79</fpage>
          ,
          <string-name>
            <surname>Jan</surname>
          </string-name>
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>A.</given-names>
            <surname>Shrivastava</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Kannan</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J.</given-names>
            <surname>Lee</surname>
          </string-name>
          .
          <article-title>A software-only solution to use scratch pads for stack data</article-title>
          .
          <source>Computer-Aided Design of Integrated Circuits and Systems</source>
          , IEEE Transactions on,
          <volume>28</volume>
          (
          <issue>11</issue>
          ):
          <volume>1719</volume>
          {
          <fpage>1727</fpage>
          ,
          <string-name>
            <surname>Nov</surname>
          </string-name>
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>D.</given-names>
            <surname>Tang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Bao</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Hu</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M.</given-names>
            <surname>Chen</surname>
          </string-name>
          .
          <article-title>Dma cache: Using on-chip storage to architecturally separate i/o data from cpu data for improving i/o performance</article-title>
          .
          <source>In High Performance Computer Architecture (HPCA)</source>
          ,
          <source>2010 IEEE 16th International Symposium on, pages</source>
          <volume>1</volume>
          {
          <fpage>12</fpage>
          ,
          <string-name>
            <surname>Jan</surname>
          </string-name>
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>