<!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>Toward GPU Accelerated Data Stream Processing</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Marcus Pinnecke</string-name>
          <email>pinnecke@ovgu.de</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>David Broneske</string-name>
          <email>dbronesk@ovgu.de</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Gunter Saake</string-name>
          <email>saake@ovgu.de</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="editor">
          <string-name>Stream Processing; GPU; Large Windows; Circular Buffer</string-name>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Institute for Technical and, Business Information Systems, University of Magdeburg</institution>
          ,
          <country country="DE">Germany</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2015</year>
      </pub-date>
      <fpage>78</fpage>
      <lpage>83</lpage>
      <abstract>
        <p />
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>In recent years, the need for continuous processing and
analysis of data streams has increased rapidly. To achieve high
throughput-rates, stream-applications make use of
operatorparallelization, batching-strategies and distribution. Another
possibility is to utilize co-processors capabilities per operator.
Further, the database community noticed, that a
columnoriented architecture is essential for efficient co-processing,
since the data transfer overhead is smaller compared to
transferring whole tables.</p>
      <p>However, current systems still rely on a row-wise
architecture for stream processing, because it requires data structures
for high velocity. In contrast, stream portions are in rest
while being bound to a window. With this, we are able
to alter the per-window event representation from row to
column orientation, which will enable us to exploit GPU
acceleration.</p>
      <p>To provide general-purpose GPU capabilities for stream
processing, the varying window sizes lead to challenges. Since
very large windows cannot be passed directly to the GPU, we
propose to split the variable-length windows into fixed-sized
window portions. Further, each such portion has a
columnoriented event representation. In this paper, we present a
time and space efficient, data corruption free concept for this
task. Finally, we identify open research challenges related to
co-processing in the context of stream processing.</p>
    </sec>
    <sec id="sec-2">
      <title>1. INTRODUCTION</title>
      <p>
        Traditional Database Management Systems (DBMS) are
designed to process a huge collection of data in rest. Queries
are assumed to run once, deliver a single result set and then
terminate immediately. This approach has been shown to
be not suitable anymore to meet the requirements of new
applications where high velocity data has to be processed
continuously or complex operations are preformed on high
volume data [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. Real-time Stream Processing Systems (SPS)
support high velocity and high volume [
        <xref ref-type="bibr" rid="ref25">25</xref>
        ] in combination
with data flow graphs to achieve continuous computations
over data streams in real-time. High throughput is achieved
by distributed computing, parallelization, batching strategies
and buffer management [
        <xref ref-type="bibr" rid="ref1 ref21 ref3">1, 3, 21</xref>
        ].
      </p>
      <p>
        Research of the database community showed that the use
of GPUs as co-processors are promising for data-intensive
systems [
        <xref ref-type="bibr" rid="ref13 ref14">14, 13</xref>
        ]. Since a graphic card has a dedicated memory,
each data to process has to be transferred from main memory
to the graphic card memory and, after processing, vise versa.
Since this transfer takes time, the transfer-cost might be a
bottleneck for some applications [
        <xref ref-type="bibr" rid="ref22">22</xref>
        ]. A columnar DBMS
is a suitable architecture for GPU acceleration, because it
avoids transferring unneeded data (compared to a row store)
and also favors data compression [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ]. Since the content of
a data stream changes rapidly, structured data-based SPSs
process a stream of events as a stream of tuples [
        <xref ref-type="bibr" rid="ref15 ref2 ref21 ref25 ref3">2, 3, 15,
21, 25</xref>
        ]. Nevertheless, there is one fundamental
bufferingtechnique called windowing that bounds a possible infinite
data to finite portions. As stream-operators process a stream
of windows either with a tuple-at-a-time or batch-at-a-time
approach, we propose to focus on enabling efficient GPU
accelerated operators for structured data in general and, hence,
we address on-demand capabilities to convert regular
lengthvariable windows into fixed-sized window portion-streams of
columnar represented events.
      </p>
      <p>In this paper, we address a strategy to enable this capability
rather than a discussion of GPU-based operators itself. First,
we show windowing in stream processing and graphic cards
acceleration in DBMSs (Section 2). Afterwards, we continue
with our main contributions:
• We examine a concept that splits any stream of
variablelength windows into a stream of fixed-size window
portions with columnar representation (Section 3)
• We identify open research challenges in context of
coprocessor-ready stream processing (Section 4)
We will finish with related work (Section 5) and our
conclusion that sums up the paper’s content (Section 6).
2.</p>
    </sec>
    <sec id="sec-3">
      <title>BACKGROUND</title>
      <p>
        Motivated by the work of Karnagel et al., who showed a
throughput increase for band join computations over streams
using GPU acceleration [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ], we believe that a
generalpropose GPU-ready stream processing framework should
be established. The reasons are (1) it enables a single
system for regular row-oriented stream processing via CPU and
efficient column-oriented stream processing via GPU and,
hence, the load can be shared between both devices, (2) it
allows us to run streaming applications on CPU, on GPU,
or in mixed-mode and (3) it provides a further abstraction
to achieve what should be done rather than how should it
be done. Since time-based windows vary in length, it is not
capable to send their contents directly to the GPU. Moreover,
the current event presentation leads to memory usage
overhead. To highlight these issues in more detail, we examine
in the following stream processing and windowing as well as
GPU acceleration in the context of DBMSs.
2.1
      </p>
    </sec>
    <sec id="sec-4">
      <title>Data-Intensive Systems and GPUs</title>
      <p>With the advent of general-purpose computing on graphics
processing units (GPGPU), the usage of a GPU to solve
arbitrary problems have become popular. Because of its
high parallelism, a GPU can outperform a CPU by orders of
magnitude. However, such performance improvements are
only possible, if considering the special architecture of the
GPU and its programming model.
2.1.1</p>
      <sec id="sec-4-1">
        <title>GPU Architecture</title>
        <p>Considering the GPU as an arbitrary co-processor for data
processing, we have to care about two things: the GPU
execution model and the data transfer cost. The overall execution
model using OpenCL or CUDA uses a host process (on the
CPU) and a kernel process (mainly a function with implicit
parallelism) on the (co-)processor (here the GPU). The host
with its host code manages data transfer and schedules the
execution on the co-processor. To execute a kernel process
on the GPU, there are four things to be done: (1) allocate
enough memory for the input and output data, (2) copy the
input data to the allocated device memory, (3) execute one
or more kernel programs and (4) copy output data back to
the host. Hence, batch-processing using a columnar event
representation is the right choice for stream processing on
the GPU, because the overhead of steps (2) and (4) will be
too high otherwise.
2.1.2</p>
      </sec>
      <sec id="sec-4-2">
        <title>Application Scope</title>
        <p>
          Since data copying is an essential step to use a GPU, it
is also the biggest bottleneck. For this, the host process
(executed on the CPU) schedules the data transfer and
provide necessary data over the PCI-Express Bus. However,
compared to the bandwidth between the GPU memory and
its cores, the bandwidth of the PCI-Express Bus is very
low [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]. Hence, the GPU is most efficient for compute-bound
problems, where data transfer plays only a minor role [
          <xref ref-type="bibr" rid="ref22">22</xref>
          ].
2.1.3
        </p>
      </sec>
      <sec id="sec-4-3">
        <title>GPU Acceleration in Databases</title>
        <p>
          Unregarded the high transfer costs, executing database
operations on the GPU has shown notable performance benefits.
For instance, the specialized sort implementation of
Govindaraju et al. [
          <xref ref-type="bibr" rid="ref13">13</xref>
          ], GPUTeraSort, achieves a speedup of 10
compared to a CPU implementation. Also, specialized GPU
join algorithms perform 3-8x better than reported CPU join
implementations [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ]. However, there are also operations,
e.g., selections, that executed on the GPU may also harm
performance, because they are not fully parallelizable [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ].
        </p>
        <p>
          Since not all operators benefit from GPU acceleration,
further database research in the direction of load-balancing
between co-processors is needed to get a benefit for the
operators of a whole query plan, e.g., in CoGaDB [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ]. This
attempt relates to our effort in creating an adaptive system
that also distributes its work between the CPU and GPU.
2.2
        </p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Stream Processing</title>
      <p>
        Stream processing is a paradigm to continuously process,
analyze and monitor a (possibly infinite) sequence of data,
that is called a stream. Since traditional DBMSs assume data
in-rest, exact results, queries initiated by humans and no
realtime services for applications, they are not adequate for this
task [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. Therefore, around 2003, the database community
researched adequate systems for stream processing. The
academic projects Aurora and it’s fork Borealis are notable here,
because they provide an innovative model to deal with data
streams and provide well-engineered strategies for
scheduling, load shedding, high availability, high performance, and
dynamic query management capabilities [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ].
      </p>
      <p>Since stream processing is data-driven, a user defined
query consumes streams and produces streams containing the
results. Those queries are online until they are terminated
manually. This is in contrast to traditional DBMS queries,
which terminate after their execution automatically. Those
queries over streams are a loosely coupled data-flow network
of operators.
2.2.1</p>
      <sec id="sec-5-1">
        <title>Windowing</title>
        <p>Since a stream is a possible infinite sequence of data, it is
infeasible to store the complete input data in main memory.
Therefore, one fundamental concept is a buffering technique
called windowing that provides finite stream portions.
2.2.2</p>
      </sec>
      <sec id="sec-5-2">
        <title>Window Types</title>
        <p>
          There are many window variations due to the fact that
there are many approaches about what to buffer (time-based
or count-based for instance), how to handle new data, when
to release old data, and when to trigger an operator [
          <xref ref-type="bibr" rid="ref15 ref2 ref3">2, 3,
15</xref>
          ].
        </p>
        <p>If a window buffers a data stream on a count -based
approach, the stream of outgoing windows has a fixed-length
each. For instance, a count-based jumping window contains
a fixed number of tuples and is updated after receiving a
predefined number of new tuples. Hence, it contains tuples
that occur in a variable time span such that the count of
tuples in a window is stable.</p>
        <p>On the other hand, if a data stream is buffered by a
time-based approach, the tuple count inside a window varies.
For instance, a time-based jumping window contains input
data related to a given time span (e.g., five minutes) and
is updated automatically after a certain time has passed,
e.g. two minutes. Hence, it contains tuples that occur in a
fixed time span such that the count of tuples in a window is
variable.</p>
        <p>
          Since a time-based approach is probably more common
than its count-based counterpart [
          <xref ref-type="bibr" rid="ref24">24</xref>
          ], the varying length is
critical in view of GPU-acceleration since (1) GPU memory
is fixed-size allocated and (2) time-based windows might
contain thousands of tuples when the time span is large
enough and many events occur per instant. As a result, the
complete batch might be too large for graphic card memory.
2.2.3
        </p>
      </sec>
      <sec id="sec-5-3">
        <title>Large-Scale Window Management</title>
        <p>
          We examine in the following large-scale window
maintenance and processing as well as load distribution in
traditional stream processing.
Maintaining. To maintain large-scale windows in
regular stream processing, the window might be partly swapped
to disk. For instance, the storage manager in Aurora tries to
hold the most relevant content in main memory while low
prioritized ranges are paged to disk using a special
replacement policy [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]. Besides holding large-scale windows, another
important issue is to process these windows.
        </p>
        <p>
          Processing model. One common approach is a
tuple-at-atime approach [
          <xref ref-type="bibr" rid="ref15 ref20 ref21 ref25">15, 20, 21, 25</xref>
          ] that does not care aboituemt the
actual number of tuples in a window, since the requiredn-s1paceitem
depends on a single tuple. On the other hand, providing the n
ability to consume more than one tuple at a time using a
batch-like approach [
          <xref ref-type="bibr" rid="ref11 ref2">2, 11</xref>
          ] could be achieved by iteration
over the window’s content inside the operator, utilizing the
built-in RAM/disk swapping facilities. Here, an operator
consumes k elements as a single block in each iteration, by
setting some pointers into the window, until the window
has been fully consumed [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ]. Obviously, the event
representation is unchanged, since it is optim…ized for CPU processing.
Figure 1 sfhroewsshdtiffueprelnetsprocessing approaches. The left
hand side shows the content of a stream thasti zisea =seqnuence
of i = 1, ..., 7 tuples (ai, bi) per time. Here, more than one
tuple occur in one instant. The next column shows the actual
window content, when applying a time-based window over
k2
two time instants. These windows are processed either in a
tuple-at-a-time or batch-at-a-time processing manner. The
left column for batching shows the actual construction that
hold k tuples (row-orientated) per batch by the traditional
stream processing approach.
        </p>
        <p>
          Load Distribution. To increase the throughput per
operator, load distribution strategies can be used such that
the load to process a window can be shared. This could
be achieved per-window (blocks are processed by parallel
running operators [
          <xref ref-type="bibr" rid="ref23 ref25">23, 25</xref>
          ]) or per-block (a single operator
processes partitions of each block in parallel [
          <xref ref-type="bibr" rid="ref17 ref19">17, 19</xref>
          ]).
3.
        </p>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>GPU-READY STREAM PROCESSING</title>
      <p>We introduce an operation that we call bucketing which
transforms the output of windows such that they can
efficiently consumed by GPU-based operators. To distinguish
between what a stream-operator consumes, namely a window,
we call what a GPU-operator consumes a bucket. We explore
the differences in the following sub section. In contrast to
windowinng l=ogick,*t,hese buckets are fixed-size in length
independent from the window they listen to, such that we can
pipe the woiffnd0ow content bucket by bucket to the GPU-based
= 0
operators. Moreover, we will examine how to flip the event
itemrepresentation from row to column and vise versa efficientUlys,ing relative a
1to avoid unnecessary transfer costs to the graphic card. if the newest tu
position p, eac</p>
      <p>We target fixed-sized bucketing of windows with a dedAif-terwards offs
icteamted operator since this task should not be in the respontsoi-offset_i + siz
b2ility of any GPU-based operator for several reasons, such as
redundant logicomffi2ght occur otherwise. To show our strategy,
we will introduce it step by step. We explore the differences
to windowing first and show afterwards how buckets can be
created efficiently. The latter approach is more general since
we not address the representation-flipping here. How the
transformaotffio1n between row- and column-orientation could
be achieved is explained afterwards.
k3.11 Motivation</p>
      <p>Since SPSs are tuple-oriented, their primary data structure
to express an entity’s content is a tuple. Although it is a
common structure, it might not be efficient in terms of
GPU data transfer cost and memory consumption. Consider
for example a stream R with schema R = {A, B} where
dom(A) = char(50) and dom(B) = int. R could contain
a tuple (the, 268) for instance. Further assume a size of 54
bytes per tuple, where 4 bytes are used for the int data
type. If an operation only requires B-values, sending entire
tuples will waste ≈ 93% of data transfer time and graphic
card memory. Therefore, we focus on flipping the event
representation and bounding the size of windows to avoid
out-of-memory situations when employing the graphic card.
3.2</p>
    </sec>
    <sec id="sec-7">
      <title>Buckets vs. Windows</title>
      <p>Windowing is one of the fundamental concepts of stream
processing. To be clear about where our proposed operator is
different, we examine similiarities and differences of buckets
and windows.</p>
      <p>First of all, the purpose of both concepts is different.
Window operators are used to bound a (infinite) stream of data
to a collection of data, called a window, that can be
processed by set-oriented operators. Hence, a window operator
consumes a stream of events and produces a stream of
windows. As mentioned earlier, the actual window length can
vary depending on a given policy, such as in the time-based
approach. In contrast, our operator consumes a stream of
windows, each might vary in length, and partitions each
window into portions of a user-defined size k. At the same
time, the row-wise representation is changed to columnar
representation. Each such portion is called a bucket.</p>
      <p>Assume a stream R with schema R = {A, B} and consider
the right hand side of Figure 1. As one can see, regular
batching with a batch-size k = 3 contains at most tree tuples
(a, b, c) ∈ R per batch entry, while a bucket of size three
contains exactly |R| tuples each with most k components.
These components per tuple are from the same domain,
while the components of a window tuple are mixed-domains.
Therefore, a bucket’s tuple t with components from a domain
T can forwarded directly to GPU since t is, sloppy saying,
an array of length k and type T .
3.3</p>
    </sec>
    <sec id="sec-8">
      <title>Portioning Variable-Length Windows</title>
      <p>Whereas windowing a continuous data stream leads to
several strategies to match different policies, bucketing a window
is relatively straightforward. At any time, during runtime
or initialization, the subscribers S1, ..., Sm that request to
consume buckets are known. Also their individual bucket
sizes ki = size(Si) ∈ N+ are known. We receive a window ω
of some size. Therefore, our task is to forward ω in portions
of size ki to each Si until ω is completely consumed. We
assume here w.l.o.g. that the bounds of each window are
marked and that the length of each row-oriented tuple is
fixed.
3.3.1</p>
      <sec id="sec-8-1">
        <title>Algorithm</title>
        <p>Let k∗ := max{k1, ..., km}. We propose to use a fixed-size
circular buffer CB that is able to hold items (here, tuple) at
k∗ positions. For each subscriber Si we construct a range that
we call slicei := (offi, ki) that contains Si’s current offset
offi and its desired portion size ki &gt; 0. Each slicei points
inside CB – its range starts at offi and ends at offi + ki − 1.</p>
        <p>At initialization, we set offi = 0 for all i and h = 0. Every
time ω outputs a tuple, this tuple is inserted into CB. This
insertion operation moves the internal head pointer h of CB
further. Hence, h points to the position that will be written
next. If h = k∗ holds, h is set to 0 since CB is a circular
buffer. If after insertion the condition (h ≡ offi + ki) mod k∗
for a given subscriber Si holds, the subscriber is notified. In
case of a notification to Si, Si’s offset offi is moved to h.1
When ω is completely read into CB, all Si are finally notified
1Notably, each slicei moves as a count-based jumping window of
sized length ki and jump size ki over the content of ω until ω is
fully consumed.
k1
n = k*,
off0 = 0
off1
off2
about the eventually remaining portion in slicei and about
the end of the operation. Afterwards each offi is set to h
such that it is reset to consume the next window. Figure 2
shows such a buffer for m = 3 subscribers.</p>
        <p>If a new subscriber Si+1 occurs during runtime, we set its
offi+1 = h. Since new data is more important than old data,
Si+1 starts consequentially with an empty portion. However,
if the bucket size of Si+1 is greater than the definied k∗, CB
has to be resized.
3.3.2</p>
      </sec>
      <sec id="sec-8-2">
        <title>Data Corruptions</title>
        <p>Data corruption is overwriting data that has not been sent
to subscribers. This is equivalent to a rearrangement of the
time order of the data inside at least one slicei. This order
is inducted by the order of the insertion operations into CB.</p>
        <p>We claim that there can be no data corruption and proceed
by contraposition. Assume using our construction and a data
corruption. Then at least one slicei contains two items a
and b with b was inserted after a into CB but slicei states a
before b. This happens only if there is a confusion in slicei’s
view, since data is written sequentially and ordered into a
circular buffer CB and slicei points inside CB. A confusion
occurs, if CB’s head pointer h moves one step after insertion,
but from perspective of slicei, h moved more than one step.
Consequentially, the range of slicei is smaller than expected,
since there should be an one-to-one mapping between the
actual move of h and the perceived moved of h by slicei.
This happens if the range of slicei could not be embedded
into CB at once and was wrapped around. That happens
if CB is too small. This is a contradiction, since CB is as
large as the longest requested portion in our construction.
Therefore, there is no data corruption possible.
3.4</p>
      </sec>
    </sec>
    <sec id="sec-9">
      <title>Flipping the Event Representation</title>
      <p>We showed how to achieve an efficient window splitting
without changes in the event representation in the previous
sub section. Now, we will utilize our approach to flip
roworiented windows into a stream of column-oriented buckets.</p>
      <p>Since the complexity of portioning any variable-length
window is mainly driven by the actual window length, we
suppose to utilize this concept for representation flipping.</p>
      <p>The schema S = {A1, . . . , An} for the contents in a window
is known. Hence, maintaining one circular buffer as in Section
3.3 for each attribute Ai ∈ S splits each incoming tuple into
its components. We propose to use a bucketing-operator that
is responsible for portioning the incoming windows such that
it holds n circular buffers, each buffering one attribute of
the incoming tuple. Since external subscribers S1, ..., S` are
known to the bucketing-operator, the operator adds itself
as ”internal” subscriber to each 1 ≤ j ≤ n circular buffers,
delegates the desired sizei for each external Si to all buffers.
This leads to notification of all circular buffers to the operator
at the same time once sizei is achieved for some external
subscriber Si. Now, the operator packages the n portions
delivered to it into a collection, that is send to the external
subscriber.</p>
      <p>This allows a chain of operators where each consumes and
produces a column-oriented event representation. To convert
back to row-oriented event representation, another operator
performs the described operations backwards. Hence, to
revert the representation flip, another operator reads buckets
and outputs them as a stream of regular tuples.</p>
      <p>We propose to run these constructions in dedicated
operators, since this allows sharing the costs of window portioning
between several external subscribers and reverting the
operation.</p>
    </sec>
    <sec id="sec-10">
      <title>OPEN RESEARCH CHALLENGES</title>
      <p>Based on existing research and related work, we cannot
completely answer all relevant aspects. Therefore, we present
two open research challenges in the following section.
4.1</p>
    </sec>
    <sec id="sec-11">
      <title>Stream Processing on Modern Hardware</title>
      <p>
        We propose an additional bucketing-operator to support
event representation changes and window portioning to target
GPU-specialized counterparts of existing stream operators.
On the other hand, current trends in hardware bring further
co-processors (e.g., Intel Xeon Phi or FPGA) with special
characteristics into view. Consequently, these co-processors
could be used to accelerate stream processing in addition to
the GPU. With the increasing amount of different devices,
we have to take care of optimized algorithms and execution
models for the respected processor to also reach optimized
performance [
        <xref ref-type="bibr" rid="ref7 ref8">7, 8</xref>
        ]. An essential part is to tune a given
operator to the used (co-)processor, because each processing
device has its own set of optimizations that can be applied [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ].
Furthermore, with the availability of different devices, we
have to decide where to execute a given operator to reach
optimal performance. Here, it is not only important to
find the device with the best performance for the given
operator, but also to distribute the load between the devices
similar to the work of Breß et al. [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. As far as we can see,
further research should be investigated to find limitations
and benefits for applied modern hardware in this context.
4.2
      </p>
    </sec>
    <sec id="sec-12">
      <title>Scheduler for Heterogeneous Devices</title>
      <p>
        As proposed by Breß et al. [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], in the context of GPU
acceleration for columnar databases, heterogeneous devices with
dedicated memory are an opportunity since data transfer
from one memory to another is optional. Utilizing OpenCL’s
possibility to execute kernels on different devices, Karnagel
et al. suggest to use a unified kernel and a load balancer that
partitions the incoming data and distributes them either to
the CPU or GPU depending on the load [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ]. This load
balancer contains a job queue and a dictionary that maps tasks
to several states. OpenCL takes free jobs as soon as a device
is available and deploys it to a specific device on its own.
An interesting question is, how an advanced load balancer
improves execution performance even further, if the targeted
device runs a specialized kernel. This could be achieved with
a more high-level load balancer that could decide on its own
when to send jobs to device with an unified kernel, and when
to to a dedicated device with highly optimized execution
code that fits most to the device architecture.
5.
      </p>
    </sec>
    <sec id="sec-13">
      <title>RELATED WORK</title>
      <p>
        The design space of DBMSs using GPU as co-processor
is well explored [
        <xref ref-type="bibr" rid="ref26 ref5">5, 26</xref>
        ] and already applied in many
applications [
        <xref ref-type="bibr" rid="ref10 ref13 ref22 ref4">4, 10, 13, 22</xref>
        ]. He et al. present a novel design and
implementation of relational join algorithms for GPUs by
introducing a set of data-parallel primitives [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ]. Stream
processing could benefit from this research results in context
of DBMSs, but first progress is made. Karnagel et al. show
that a stream band-join might be computed faster with a
speedup of nearly 70x using a graphic card [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ]. For Complex
Event Processing, an approach similar to stream processing,
Cugola et al. suggest in 2012 to run the pattern detection
automaton on parallelized hardware. They conclude that
GPU acceleration can bring speedups in this context but also
highlight limitations due to memory restrictions [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ]. Hence,
current approaches for GPU accelerated stream processing
focus on specific topics; instead, we suggest an approach
to enable GPU-ready stream processing in general. While
we focus on a strategy to handle variable-length windows
to enable GPU-operators over fixed-sized batches with a
column-orientation (”buckets”), Karnagel et al. use a load
balancer that mainly deploys band-join computation tasks
to both CPU and GPU. Although these tasks also contain
tuple-batches from the input sources, our approach has
another focus since we do not actually address load balancing
and construct batches outside the responsibility of a specific
operator or balancer. Hence, we provide a stream of buckets,
built from a stream of windows, that can be consumed by
any operator. Bucket streams can be shared by different
operators and can form an operator chain before the buckets
are converted back to a regular tuple stream.
      </p>
      <p>
        To enable GPU processing capabilities it is reasonable to
process batches, since a GPU might outperform a CPU only
if a bulk of data is present at once. Some SPSs do only
support a tuple-at-a-time approach [
        <xref ref-type="bibr" rid="ref15 ref25">15, 25</xref>
        ] such that an
internal buffering per operator is required. However, our
approach enables those architectures to convert
tuple-at-atime windows to bucket streams. Other SPSs such as Aurora
offer batch-processing. Here, each operator stores its
output in an output queue that is accessible by subscribers
via pointers indicating the current ranges in-use. Aurora
cleans up these queues, if a tailed range is not used by any
subscriber anymore [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. Since Aurora manages windowing
with output queues, these queues vary as the window content
and processing performance of subscriber vary. In contrast,
our approach uses a fixed-sized circular buffer and performs
window portioning and event representation changes rather
than managing window states as Aurora.
      </p>
    </sec>
    <sec id="sec-14">
      <title>CONCLUSION</title>
      <p>In this paper we motivated and introduced a concept for a
dedicated stream processing operator, the bucketing-operator,
that consumes a stream of length-varying windows and
produces a stream of fixed-sized window portions with a
columnoriented event representation. We motivated the revertible
event representation transposition to match the GPU
architecture better, since a GPU uses the SIMD approach and
otherwise we would waste memory and increase transfer costs.
However, we suggest a strategy to perform bucketing using a
fixed-sized circular buffer for each attribute of a given schema.
This approach is efficient in time and space, since it mainly
depends linearly on the actual window content length and
could be stored in a predefined sized buffer per-attribute.
We ensured here, that data corruption cannot occur using
our construction.</p>
      <p>Finally, we identified two research questions for
processing data streams on modern hardware and scheduling for
heterogeneous devices.</p>
    </sec>
    <sec id="sec-15">
      <title>ACKNOWLEDGMENTS</title>
      <p>We thank Bernhard Seeger for fruitful discussions that
heavily influenced this work.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>D.</given-names>
            <surname>Abadi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Carney</surname>
          </string-name>
          , U. C¸ etintemel, M. Cherniack,
          <string-name>
            <given-names>C.</given-names>
            <surname>Convey</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Erwin</surname>
          </string-name>
          , E. Galvez,
          <string-name>
            <given-names>M.</given-names>
            <surname>Hatoun</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J. h.</given-names>
            <surname>Hwang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Maskey</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Rasin</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Singer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Stonebraker</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Tatbul</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Xing</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Yan</surname>
          </string-name>
          , and
          <string-name>
            <given-names>S.</given-names>
            <surname>Zdonik</surname>
          </string-name>
          . Aurora:
          <article-title>A data stream management system</article-title>
          .
          <source>In SIGMOD, page 666</source>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>A.</given-names>
            <surname>Arasu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Babcock</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Babu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Cieslewicz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Ito</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Motwani</surname>
          </string-name>
          ,
          <string-name>
            <given-names>U.</given-names>
            <surname>Srivastava</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J.</given-names>
            <surname>Widom</surname>
          </string-name>
          . Stream:
          <article-title>The stanford data stream management system</article-title>
          . Springer,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>A.</given-names>
            <surname>Biem</surname>
          </string-name>
          , E. Bouillet,
          <string-name>
            <given-names>H.</given-names>
            <surname>Feng</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Ranganathan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Riabov</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Verscheure</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Koutsopoulos</surname>
          </string-name>
          , and
          <string-name>
            <given-names>C.</given-names>
            <surname>Moran</surname>
          </string-name>
          .
          <article-title>IBM infosphere streams for scalable, real-time, intelligent transportation services</article-title>
          .
          <source>SIGMOD'10</source>
          , pages
          <fpage>1093</fpage>
          -
          <lpage>1104</lpage>
          , NY, USA,
          <year>2010</year>
          . ACM.
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>S.</given-names>
            <surname>Breß</surname>
          </string-name>
          .
          <article-title>The design and implementation of CoGaDB: A column-oriented GPU-accelerated DBMS</article-title>
          . Datenbank-Spektrum,
          <volume>14</volume>
          (
          <issue>3</issue>
          ):
          <fpage>199</fpage>
          -
          <lpage>209</lpage>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>S.</given-names>
            <surname>Breß</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Heimel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Siegmund</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Bellatreche</surname>
          </string-name>
          , and
          <string-name>
            <given-names>G.</given-names>
            <surname>Saake.</surname>
          </string-name>
          <article-title>Exploring the design space of a GPU-aware database architecture</article-title>
          .
          <source>In GID Workshop @ ADBIS</source>
          , pages
          <fpage>225</fpage>
          -
          <lpage>234</lpage>
          . Springer,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>S.</given-names>
            <surname>Breß</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Siegmund</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Heimel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Saecker</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Lauer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Bellatreche</surname>
          </string-name>
          , and
          <string-name>
            <given-names>G.</given-names>
            <surname>Saake</surname>
          </string-name>
          .
          <article-title>Load-aware inter-co-processor parallelism in database query processing</article-title>
          .
          <source>DKE</source>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>D.</given-names>
            <surname>Broneske</surname>
          </string-name>
          .
          <article-title>Adaptive reprogramming for databases on heterogeneous processors</article-title>
          .
          <source>In SIGMOD/PODS Ph.D. Symposium. ACM</source>
          ,
          <year>2015</year>
          . to appear.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>D.</given-names>
            <surname>Broneske</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Breß</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Heimel</surname>
          </string-name>
          , and
          <string-name>
            <given-names>G.</given-names>
            <surname>Saake</surname>
          </string-name>
          .
          <article-title>Toward hardware-sensitive database operations</article-title>
          .
          <source>In EDBT</source>
          , pages
          <fpage>229</fpage>
          -
          <lpage>234</lpage>
          . OpenProceedings.org,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>D.</given-names>
            <surname>Broneske</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Breß</surname>
          </string-name>
          , and
          <string-name>
            <given-names>G.</given-names>
            <surname>Saake</surname>
          </string-name>
          .
          <article-title>Database scan variants on modern CPUs: A performance study</article-title>
          .
          <source>In IMDM@VLDB, LNCS</source>
          , pages
          <fpage>97</fpage>
          -
          <lpage>111</lpage>
          . Springer,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>I.</given-names>
            <surname>Buck</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Foley</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Horn</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Sugerman</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Fatahalian</surname>
          </string-name>
          , M. Houston, and
          <string-name>
            <given-names>P.</given-names>
            <surname>Hanrahan</surname>
          </string-name>
          .
          <article-title>Brook for GPUs: Stream computing on graphics hardware</article-title>
          .
          <source>In SIGGRAPH</source>
          , pages
          <fpage>777</fpage>
          -
          <lpage>786</lpage>
          ,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>S.</given-names>
            <surname>Chandrasekaran</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Cooper</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Deshpande</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. J.</given-names>
            <surname>Franklin</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J. M.</given-names>
            <surname>Hellerstein</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Hong</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Krishnamurthy</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S. R.</given-names>
            <surname>Madden</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Reiss</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M. A.</given-names>
            <surname>Shah</surname>
          </string-name>
          . TelegraphCQ:
          <article-title>Continuous dataflow processing</article-title>
          .
          <source>In SIGMOD</source>
          , pages
          <fpage>668</fpage>
          -
          <lpage>668</lpage>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>G.</given-names>
            <surname>Cugola</surname>
          </string-name>
          and
          <string-name>
            <given-names>A.</given-names>
            <surname>Margara</surname>
          </string-name>
          .
          <article-title>Low latency complex event processing on parallel hardware</article-title>
          .
          <source>J. Parallel Distrib. Comput.</source>
          ,
          <volume>72</volume>
          (
          <issue>2</issue>
          ):
          <fpage>205</fpage>
          -
          <lpage>218</lpage>
          , Feb.
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>N. K.</given-names>
            <surname>Govindaraju</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Gray</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Kumar</surname>
          </string-name>
          , and
          <string-name>
            <given-names>D.</given-names>
            <surname>Manocha</surname>
          </string-name>
          .
          <article-title>GPUTeraSort: High performance graphics co-processor sorting for large database management performance graphics co-processor sorting for large database management</article-title>
          .
          <source>In SIGMOD</source>
          , pages
          <fpage>325</fpage>
          -
          <lpage>336</lpage>
          ,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>B.</given-names>
            <surname>He</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Yang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Fang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Lu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Govindaraju</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Q.</given-names>
            <surname>Luo</surname>
          </string-name>
          , and
          <string-name>
            <given-names>P.</given-names>
            <surname>Sander</surname>
          </string-name>
          .
          <article-title>Relational joins on graphics processors</article-title>
          .
          <source>In SIGMOD</source>
          , pages
          <fpage>511</fpage>
          -
          <lpage>524</lpage>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>B.</given-names>
            <surname>Hoßbach</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Glombiewski</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Morgen</surname>
          </string-name>
          , and
          <string-name>
            <given-names>B.</given-names>
            <surname>Ritter</surname>
          </string-name>
          ,
          <article-title>Franz und Seeger. JEPC: The java event processing connectivity</article-title>
          .
          <source>Datenbank-Spektrum</source>
          ,
          <volume>13</volume>
          (
          <issue>3</issue>
          ):
          <fpage>167</fpage>
          -
          <lpage>178</lpage>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>T.</given-names>
            <surname>Kaldewey</surname>
          </string-name>
          , G. Lohman,
          <string-name>
            <given-names>R.</given-names>
            <surname>Mueller</surname>
          </string-name>
          , and
          <string-name>
            <given-names>P.</given-names>
            <surname>Volk</surname>
          </string-name>
          .
          <article-title>GPU join processing revisited</article-title>
          .
          <source>DaMoN</source>
          , pages
          <fpage>55</fpage>
          -
          <lpage>62</lpage>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>T.</given-names>
            <surname>Karnagel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Habich</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Schlegel</surname>
          </string-name>
          , and
          <string-name>
            <given-names>W.</given-names>
            <surname>Lehner</surname>
          </string-name>
          .
          <article-title>The HELLS-join: A heterogeneous stream join for extremely large windows</article-title>
          .
          <source>In DaMoN</source>
          , pages
          <volume>2</volume>
          :
          <fpage>1</fpage>
          -
          <issue>2</issue>
          :
          <fpage>7</fpage>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>T.</given-names>
            <surname>Karnagel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Schlegel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Habich</surname>
          </string-name>
          , and
          <string-name>
            <given-names>W.</given-names>
            <surname>Lehner</surname>
          </string-name>
          .
          <article-title>Stream join processing on heterogeneous processors</article-title>
          .
          <source>In BTW Workshops</source>
          , pages
          <fpage>17</fpage>
          -
          <lpage>26</lpage>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>H. G.</given-names>
            <surname>Kim</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y. H.</given-names>
            <surname>Park</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y. H.</given-names>
            <surname>Cho</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M. H.</given-names>
            <surname>Kim</surname>
          </string-name>
          .
          <article-title>Time-slide window join over data streams</article-title>
          .
          <source>Journal of Intelligent Information Systems</source>
          ,
          <volume>43</volume>
          (
          <issue>2</issue>
          ):
          <fpage>323</fpage>
          -
          <lpage>347</lpage>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <given-names>J.</given-names>
            <surname>Kra</surname>
          </string-name>
          <article-title>¨mer. Continuous Queries over Data Streams - Semantics and Implementation</article-title>
          .
          <source>PhD thesis</source>
          , Fachbereich Mathematik und Informatik, Philipps-Universita¨
          <source>t Marburg</source>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <given-names>J.</given-names>
            <surname>Kra</surname>
          </string-name>
          <article-title>¨mer and</article-title>
          <string-name>
            <given-names>B.</given-names>
            <surname>Seeger</surname>
          </string-name>
          .
          <article-title>Pipes: a public infrastructure for processing and exploring streams</article-title>
          .
          <source>In Proceedings of the 2004 ACM SIGMOD</source>
          , pages
          <fpage>925</fpage>
          -
          <lpage>926</lpage>
          . ACM,
          <year>2004</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <string-name>
            <given-names>A.</given-names>
            <surname>Meister</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Breß</surname>
          </string-name>
          , and
          <string-name>
            <given-names>G.</given-names>
            <surname>Saake</surname>
          </string-name>
          .
          <article-title>Toward GPU-accelerated database optimization</article-title>
          .
          <source>Datenbank-Spektrum</source>
          ,
          <year>2015</year>
          . To appear.
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <given-names>S. Z.</given-names>
            <surname>Sbz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Zdonik</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Stonebraker</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Cherniack</surname>
          </string-name>
          , U. C. Etintemel,
          <string-name>
            <given-names>M.</given-names>
            <surname>Balazinska</surname>
          </string-name>
          , and
          <string-name>
            <given-names>H.</given-names>
            <surname>Balakrishnan</surname>
          </string-name>
          .
          <article-title>The aurora and medusa projects</article-title>
          .
          <source>IEEE Data Engineering Bulletin</source>
          ,
          <volume>26</volume>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [24]
          <string-name>
            <given-names>M.</given-names>
            <surname>Stonebraker</surname>
          </string-name>
          , U. C¸etintemel, and
          <string-name>
            <surname>S. Zdonik.</surname>
          </string-name>
          <article-title>The 8 requirements of real-time stream processing</article-title>
          .
          <source>SIGMOD Rec</source>
          .,
          <volume>34</volume>
          (
          <issue>4</issue>
          ):
          <fpage>42</fpage>
          -
          <lpage>47</lpage>
          ,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [25]
          <string-name>
            <given-names>A.</given-names>
            <surname>Toshniwal</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Taneja</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Shukla</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Ramasamy</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J. M.</given-names>
            <surname>Patel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Kulkarni</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J</given-names>
            .
            <surname>Jackson</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Gade</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Fu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Donham</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Bhagat</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Mittal</surname>
          </string-name>
          , and
          <string-name>
            <given-names>D.</given-names>
            <surname>Ryaboy</surname>
          </string-name>
          .
          <article-title>Storm@twitter</article-title>
          .
          <source>In SIGMOD</source>
          , pages
          <fpage>147</fpage>
          -
          <lpage>156</lpage>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          [26]
          <string-name>
            <surname>Y.-C. Tu</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Kumar</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          <string-name>
            <surname>Yu</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          <string-name>
            <surname>Rui</surname>
            , and
            <given-names>R.</given-names>
          </string-name>
          <string-name>
            <surname>Wheeler</surname>
          </string-name>
          .
          <article-title>Data management systems on GPUs: promises and challenges</article-title>
          .
          <source>In SSDBM, page 33</source>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>