<!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>Performances of a Parallel CUDA Program for a Biorthogonal Wavelet Filter</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Antony Scivoletto</string-name>
          <email>antonyscivoletto@gmail.com</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Nella Romano</string-name>
          <email>nromano919@gmail.com</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>University of Catania</institution>
          ,
          <addr-line>Viale A. Doria 6, 95125 Catania</addr-line>
          ,
          <country country="IT">Italy</country>
        </aff>
      </contrib-group>
      <fpage>30</fpage>
      <lpage>39</lpage>
      <abstract>
        <p>-Parallel high-performance computing technologies have encountered tremendous growth, especially in the last decade, and they have made a strong impact in a variety of areas concerning mathematical and engineering fields. In this work we analyze the behavior of a parallel algorithm developed to compute a random signal processing through a biorthogonal discrete wavelet filter using CUDA and we compare the parallel implementation against similar sequential CPU code. The simulations are conducted using two computers: the first one is a conventional host; the second one is a server. This comparison allows us to underline the differences between hardware architectures with different specifications in terms of time performance. The experimental results show that if the signal is decomposed into a rather substantial number of samples, parallel code timings on server and a usual host GPU win on the corresponding sequential code on the same machines. Index Terms-GPU programming, performances, wavelet</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>I. INTRODUCTION</title>
      <p>
        The last decades have been featured by large motions in
the perceived value of parallel computing. In such years
highperformance computing technologies have seen substantial
growth and this is the case for general purpose computing on
GPU, or rather GPGPU. The intensive use of GPU
parallelization techniques has given the possibility to implement complex
simulation and hard computational tasks [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ], [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ],
[
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. For much time, one of the most important methods used
to improve the computational capability of devices has been
increasing the processor clock speed. Unfortunately, because
of various fundamental limitations in the manufacturing of
integrated circuits, it is not possible to extract much additional
computational power from existing architectures by increasing
the processor clock speed. Then, supercomputer manufactories
were able to introduce many changes in performance by
strongly increasing the number of processors: they could have
tens or hundreds of thousands of processor cores working
concurrently. CPU manufacturers have announced plans for 12
or 16 cores CPUs. In this way, a big number of simple
multithread cores in GPU cards could offer the potential for strong
speedups regarding several general purpose applications, if
compared with the CPU similar sequential computation,
confirming parallel computing has arrived for good [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ].
      </p>
      <p>
        Nevertheless, the architecture of GPU cards gives rise to
some programming issues, such as sharing resources, which
Copyright c 2016 held by the authors.
are managed through a lock or token. In shared memory
machines, a single address space and global memory are
shared between multiple processors; each processor owns a
local cache, and its values have to be made coherent with
the global memory by the operating system. Data can be
exchanged among processors simply by placing the values
in a predefined location and synchronizing appropriately [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ].
Other issues involved, which complicate development and
have no counter part in the sequential world, can include:
finding and expressing concurrency, managing data
distributions, managing communication among processors, balancing
computational load, and simply implementing the parallel
algorithm correctly. Therefore, implementing parallel programs
is more difficult than implementing sequential ones [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ].
In fact, in sequential programming, the programmer has to
implement a code correctly, and efficient to execute. Parallel
programming involves the same issues, and adds several
additional challenges, some of which are described above.
      </p>
      <p>In this paper we implement a parallel code by CUDA
architecture, subduing a random signal to a biorthogonal discrete
low pass wavelet filter. In particular, this work is structured as
follows. In section 2 we present some essential concepts for
introducing wavelet theory and we refer to specific techniques,
such as subband coding, in order to process a given signal with
the biorthogonal wavelet filter in discrete time case. In section
3 we describe the main features of CUDA architecture, used
in this work for the parallelization procedure. In section 4
some basic concepts on the definition of a digital filter and its
implementation are given through mathematical convolution
operation. Section 5 examines serial and parallel algorithms,
with which wavelet filter implementation and signal processing
are achieved. In section 6 we show the results obtained by
experimental simulations and compare time performance of
two codes executed in two machines with different technical
specifications. Finally, in the last two sections we deduce
consequent results, conclusions and we also report all those
works related to subject matter described in this paper.</p>
    </sec>
    <sec id="sec-2">
      <title>II. WAVELET THEORY</title>
      <sec id="sec-2-1">
        <title>A. Preliminaries</title>
        <p>
          Only in recent years, wavelet theory has been developed as
a unifying framework for a large number of techniques thought
for wave signal processing applications, such as
multiresolution analysis, subband coding and wavelet series expansions.
The idea of treating a signal at various scales and analyzing
it with different resolutions has emerged independently in
many mathematics, physics and engineering fields [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ]. The
interest of the signal processing community became strong
when Doubechies and Mallat, giving a further contribution to
the wavelet theory, established connections to discret signal
processing results. Since then, a number of theoretical as well
as pratical contributions have been made on various aspects
of this topic and nowadays it is growing rapidly [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ], [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ].
        </p>
      </sec>
      <sec id="sec-2-2">
        <title>B. Wavelets in continuos domain</title>
        <p>
          Wavelets are continuos basic functions constructed mainly
in order to satisfy certain mathematical properties. A wavelet
is defined as a function with zero mean value which is both
above and below the x-axis, looking like a “wave” [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ]. It
is possible to give a more rigorous definition of a wavelet. In
fact, if we consider a multiresolution decomposition of L2(R),
that is
;
        </p>
        <p>V0</p>
        <p>Vj</p>
        <p>Vj+1</p>
        <p>
          L2(R)
and we call Wj the orthogonal complement of Vj , then we
can define a wavelet as a function (x) such that the set of
f (x l); l 2 Zg is a Riesz basic of W0 and also must be
subject to the following constrains [
          <xref ref-type="bibr" rid="ref13">13</xref>
          ]:
        </p>
        <p>Z +1
1)
2) k</p>
        <p>(x) dx = 0
1
(x) k2=</p>
        <p>Z +1
(x)</p>
        <p>(x) dx = 1
1</p>
        <p>The idea behind wavelets is that by stretching and
translating one such main wavelet function (t) (called mother
wavelet), we can represent finer parts of a function or a signal
by simple linear combinations:
f (t) =</p>
        <p>
          X bj;k j;k(t)
j;k
where bj;k are called wavelet coefficients of the function f in
the wavelet basis given by the inner product of j;k. Moreover,
a whole family of wavelet functions can be obtained by just
shifting and scaling the mother one by the law [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ]:
j;k = p2j (2j t
k); i; j 2 N
        </p>
        <p>
          In the procedure of wavelet dilatation and translation, we
can see that for a large j, j;k(t) is short and of high
frequency; smaller values for j, instead, give long wavelet
functions of low frequency. This offers us the possibility to
analyze a function in different scales [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ]. Typical examples
of wavelet functions are shown in figure 1.
        </p>
      </sec>
      <sec id="sec-2-3">
        <title>C. Discrete Time Case</title>
        <p>
          Now we focus our attention on discrete time signals, since it
is the case of our interest for the implementation of a wavelet
filter as a parallel program which exploits the computational
capabilities of GPUs. In the discrete time case two
methods were developed independently, namely subband coding
(1)
(2)
andmultiresolution signal analysis. Two notions which are
important for wavelet theory are scale and resolution. Scale is
related to the size of the signal, while resolution refers to the
amount of details present in the signal. In order to understand
better these concepts, we can note that the scale parameter in
discrete wavelet analysis behaves as follows [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ]:
for large scales delated wavelet take a global view of a
subsampled signal;
for small scales, reduced wavelets analyze small details
of the signal.
        </p>
      </sec>
      <sec id="sec-2-4">
        <title>1) Multiresolution analysis: With this method we can de</title>
        <p>rive a lower resolution signal by lowpass filtering with a
halfband low-pass filtering having impulse responce g(n). This
results in a signal y(n) where
y(n) =
k=+1</p>
        <p>X h(k) x(2n</p>
        <p>
          Now based on subsampled version of x(n) we want to
find an approximation, a(n), to the original: this is done by
inserting a zero between every sample, because we need a
signal at the original scale for comparison. In general, a(n)
is not going to be equal to x(n); therefore we compute the
difference between a(n) and x(n) with the following formula:
d(n) = x(n)
a(n)
however there is some redundancy, since a signal sampling
ratefs is mapped into to signals d(n) e y(n) with sampling
ratesfs and fs=2, respectively [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ].
        </p>
        <p>
          2) Subband coding schemes: The method of
multiresolution analysis described in [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ] is characterized by a redundant
set of samples. We now look at a different scheme where
no such redundancy appears. This method is called subbang
coding scheme, first widely used in voice compression. The
idea behind this technique is based on the following
methodology: a pair of filters are used where low pass and a high pass
filter partecipate; we decompose a sequence X(n) into two
subsequences at half rate, or half resolution, and this by means
of orthogonal filter. This process can be iterated on either
or both subsequences. In particular to obtain finer frequency
resolution at lower frequencies, we iterate the scheme on the
lower band only. Each iteration halves the width of the low
band (in fact it increases its frequency resolution by two),
but because of the subsampling by two, its time resolution is
halved as well. Schematically, this is shown in figure 2.
        </p>
        <p>
          An important feature of this discret algorithm is its relatively
low complexity. Actually, the following somewhat surprising
result emerges: regardless the depth of the tree in 2, the
complexity is linear in the number of input samples, with a
constant factor which depends on the length of the filter [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ].
        </p>
      </sec>
      <sec id="sec-2-5">
        <title>D. Biorthogonality</title>
        <p>
          The wavelet filter implemented in this work is the 3.7
biorthogonal one. A biorthogonal wavelet is a wavelet where
the associated wavelet transform is invertible but not
necessarily orthogonal. In the biorthogonal case there are two scaling
functions and ~, which may generate different
multiresolution analysis, according to different wavelet functions and
~, having ~ used in the analysis and used in the syntesis. In
addition, the scaling functions and ~ and wavelet function
and ~ are related by duality in the following sense [
          <xref ref-type="bibr" rid="ref15">15</xref>
          ]:
Z
        </p>
        <p>j;k(x) ~j0;k0 (x) dx = 0
as soon as j 6= j0 or k 6= k0 and even</p>
        <p>Z</p>
        <p>
          0;k(x) ~0;k0 (x) dx = 0
as soon as k 6= k0 [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ]. About biorthogonal wavelet filter,
by using two wavelets, one for decomposition and the other
for reconstruction, interesting properties are derived. Unlike
orthogonal wavelets, biorthogonal ones require two different
filters: one for the analysis and other one for syntesis of an
input. The first number indicates the order of the syntesis
filter while the second number refers to the order of the
analysis filter [
          <xref ref-type="bibr" rid="ref17">17</xref>
          ]. Unfortunately, frequency responses from
biorthogonal filters may now not show any symmetry and
the energy of the decomposed signal may also not equal the
energy of the original signal [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ]. Nevertheless, there are some
reasons behind using biorthogonal wavelets related to some
requirements to satisfy. One such condition is that they should
have compact support: if this constrain were not satisfied, then
we would need to use an IIR filters to approximate the function
but IIR filters are more difficult to treat and they also require
extra computing power.
        </p>
        <p>III. GPU PARALLEL COMPUTING WITH CUDA</p>
        <p>
          The advent of multicore CPUs and manycore GPUs has
allowed the development of applications that transparently
scale its parallelism to take advantage of the increasing number
of processor cores [
          <xref ref-type="bibr" rid="ref18">18</xref>
          ]. The launch of the Nvidia CUDA
technology has opened a new era for GPGPU computing
allowing the design and implementation of parallel GPU
oriented algorithms without any knowledge of OpenGL, DirectX
or graphics pipeline [
          <xref ref-type="bibr" rid="ref19">19</xref>
          ]. CUDA (Compute Unified Device
Architecture) is a novel technology of general purpose
computing on the GPU, which makes users develop general GPU
programs easily. CUDA GPU has the following advantages
[
          <xref ref-type="bibr" rid="ref18">18</xref>
          ], [
          <xref ref-type="bibr" rid="ref19">19</xref>
          ]:
general programming environment: CUDA uses C
programming tools and C compiler, which make programs
have better compatibility and portability;
more powerful parallel computing capability: CUDA
graphic card employs more transistors for computing;
higher bandwidth: it can be strongly affected by the
choice of memory in which data is stored, how the data
is laid out and the order in which it is accessed;
instruction operation: CUDA GPU supports integer and
bit operation.
        </p>
        <p>According to these considerations, programmable GPUs
have evolved into a highly parallel, manycore processor with
considerable computational power.</p>
        <p>
          Comparing the performance of GeForce GTX 680, GeForce
GTX 580 and GeForce GTX 480 among Sandy Bridge and
Bloomfield Intel CUPs around about 2009, we can notice
since 2001 the theoretical floating point capability on GPUs
has increased more rapidly than in CPUs; furthermore, the
memory bandwidth follows a similar trend, mainly looking at
years since 2003 [
          <xref ref-type="bibr" rid="ref20">20</xref>
          ]. The main difference in floating point
capability between the CPU and GPU is due to the
specialization of the second one for compute-intensive highly parallel
computation. A CUDA-enabled GPU is composed of several
MIMD (multiple instruction multiple data) multiprocessors
that contain a set of SIMD processors (single instruction single
data). Each multiprocessor has a shared memory that can
be accessed from each of its processors, and also shares a
bigger global memory common the global multiprocessors
[
          <xref ref-type="bibr" rid="ref21">21</xref>
          ]. Shared memory buffers reside physically on the GPU
as opposed to residing in off-chip DRAM, so because of this,
the latency to access shared memory tends to be far lower than
typical buffers [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ].
        </p>
        <p>
          CUDA hardware architecture has the following novel
features [
          <xref ref-type="bibr" rid="ref19">19</xref>
          ]:
general write/read global memory: GPU can acquire data
from any location or the global memory and also put data
to any location, almost as supple as CPU;
shared memory placed on chip: it can make threads in the
same multiprocessor getting data immediately available
and avoiding accessing global memory frequently;
thread synchronization: threads in a thread group can be
synchronized to each other, so they can communicate and
collaborate to resolve complex problems.
        </p>
        <p>
          In CUDA programming model, an application consists of
a host program that executes on the CPU and other parallel
kernel programs executing on the GPU. A kernel program
is executed by a set of parallel threads, where a thread is a
subdivision of a process in two or more sub-processes, which
are executed concurrently by a single processor computer
system (multithreading). The host program can dynamically
allocate device global memory to the GPU and copy data
to/from such a memory from/to the memory on the CPU.
Moreover, the host program can dynamically fix the number of
threads used for running of a kernel program. A set of threads
creates a block, and each block has its own shared memory,
which can be accessed only by each thread on the same block
[
          <xref ref-type="bibr" rid="ref21">21</xref>
          ]. Note that interactions between CPU and GPU should be
minimized in order to avoid communication bottlenecks and
delays due to data transfers.
        </p>
        <p>IV. SIGNAL PROCESSING BY WAVELET FILTER</p>
        <p>As already widely stated, the main target of this paper is
the implementation and performance analysis of an algorithm
built for emulating a randomic signal processing through a 3.7
biorthogonal wavelet filter. However, before entering in the
description and performance analysis of different algorithms
used for both sequential and GPU parallel computing versions,
we want to give the theoretical basis about mathematical
meaning of a digital FIR filter.</p>
      </sec>
      <sec id="sec-2-6">
        <title>A. Digital filter and Convolution</title>
        <p>It is extremely useful to observe that any type of FIR digital
filter can be interpreted mathematically as the convolution
product between a function f , which represents the signal
to scan, and a function h, which is the impulse response
of LTI system through which the signal passes, in our case
represented by the filter. In the case, such as that of our
interest, in which two discrete time functions S and h are
given, then it is possible to define the convolution operation
as follows:</p>
        <p>Y (j) =</p>
        <p>N
X S(j
i) h(i)
(4)
i=0</p>
        <p>In other words, this operation can also be seen as the
application of a function h, which represents the filter, to
a function S that instead symbolizes the signal to filter. In
particular, the terms h(i) are called filter coefficients, while N
is the order of this filter.</p>
        <p>The convolution of a discrete time signal may be described
by a sequence of steps achieved in the following way:
1) function S is reflected: S(i) ! S( i);
2) S is scrolled over h with a shift of k: S(k i);
3) for each shift j all products between S and h are added.</p>
      </sec>
      <sec id="sec-2-7">
        <title>B. 3.7 biorthogonal wavelet filter</title>
        <p>
          Applications of wavelet decomposition techniques in
numerical analysis of a signal seems very promising because it
highlights the “zooming” property, which allows a very good
representation of critical points, such as irregularity,
discontinuos, and so on [
          <xref ref-type="bibr" rid="ref20">20</xref>
          ]. Wavelet transform can be realized
simply and effectively through a filter bank. In particular,
a decomposition phase, adopted in this work, provides a
low pass and high pass filtering, followed by decimation by
two; the reconstruction phase, instead, processes separately
inputs, through expansion and filtering, and then they are
summed. These operations have to be iterated according to
the number of decomposition levels with which we want to
achieve wavelet transform [
          <xref ref-type="bibr" rid="ref22">22</xref>
          ].
        </p>
        <p>
          The following table shows the sixteen 3.7 biorthogonal
decomposition wavelet filter coefficients taken into account
in this work [
          <xref ref-type="bibr" rid="ref23">23</xref>
          ].
        </p>
        <p>Filter coefficient
h0
h1
h2
h3
h4
h5
h6
h7
h8
h9
h10
h11
h12
h13
h14
h15</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>V. ALGORITHMS</title>
      <p>Once understood how we can build a digital filter by a
mathematical point of view, we see now how to have it in
C language. We propose two different versions of code whose
target is the translation of convolution operation, previously
described, between the signal and the wavelet filter. The first
version refers to a programming strategy that uses a parallel
CUDA architecture, where the heart of the program, called
kernel, is defined in host memory as a global function, and it
is executed in GPU memory, or rather in device. Later we will
analyze the temporal performance of the two programs and
compare them, eventually to highlight differences and observe
if it might be advantageous using an implementation strategy
or another one.</p>
      <sec id="sec-3-1">
        <title>A. Parallel code in CUDA</title>
        <p>The first implementation we want to present is related to the
construction of a wavelet filter with a parallel programming
model. The parallel code is implemented in C language;
however we introduce changes to a conventional C code and
take advantage of all typical CUDA structures by executing
certain functions in GPU device. Once loaded C libraries and
&lt;cuda.h&gt; library for device functions, we fix the maximum
number of threads that draws each block in device memory.
Obviously, this amount of threads is linked to hardware
features of GPU cards. As regards the simulations presented
in this paper, we use two graphics cards: a 480-core GeForce
and a 1536-core Tesla Kepler. The number of threads discends
by these specifications, calculating it as the ratio between the
total amount of data to process and the number of threads per
block.</p>
        <p>We are now ready to describe the global main function
which, as such, is called in host, and that is after performed
in device: this function is exactly the kernel.
// kernel definition
__global__ void wavelet(float *sign, float *fil, float*y,
int m) {
int id = blockIdx.x * blockDim.x + threadIdx.x;
if (id&gt;=sample) return;
int P = m*sample;
for (int i=0; i&lt;filter; i++)
if ((id-i) &gt; 0) y[P+id]+= sign[id-i]* fil[i];
else y[P+id]+= sign[i-id]* fil[i];
int div = (int) powf(2,m);
sign[id] = sign[id-(id%div)];
return;
}</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Listing 1: kernel definition</title>
      <p>In the kernel, an instruction which performs the convolution
operation between the signal S and h filter is implemented. In
fact, if filter represents the number of wavelet filter coefficients
(in our case f ilter = 16) and sample is the amount of
randomic signal samples taken into account, then each
idth component of output signal y is obtained as the sum of
the products between the i-th component of the filter and
the (id i)-th component of signal; id is the thread index
with which we exploit computational capability of various
thread in GPU memory and whose dimension should cover
the whole length of signal. In other words, a wavelet filter can
be graphically thought as a floating window, initially aligned
with the first sample of signal (id = 0), and comes slid up to
cover all samples.</p>
      <p>
        Obviously, when probing the entire signal, there will be
situations in which, according to the values assumed by index
id and based on i-th coeffiient position of the filter, the
difference id i will be negative; this would require the
translation of the signal for “negative” istants, i.e. points where
the signal does not exist: this is known as boundary problem.
Therefore, it is necessary to extend the signal at instants in
which it is undefined; this can be done in several ways. The
strategy adopted here is the symmetrical extension, particularly
suitable for biorthogonal filters [
        <xref ref-type="bibr" rid="ref22">22</xref>
        ].
      </p>
      <p>For this reason, in wavelet function there is a conditional
instruction which chooses the (id i)-th sample of S or
(i id)-th one, to avoid “boundary problem”. As we can see by
code 1, wavelet function takes as input not only the
point-tofloat variables sign, fil, y, but also another parameter, m, that
is the number of current iteration. In fact, as we shall soon see,
the purpose of this paper is adopting subband coding technique
in a tree-structure, iterating the kernel a number of times equal
to num iter in order to isolate step by step residuals and details
of signal and get different levels of resolution. Therefore we
achieve also the scaling procedure organizing step by step
samples in groups of 2m elements such that they assume the
same value in each group. This operation is implemented as
int div=(int)powf(2,m);
sign[id]= sign[id-(id%div)];</p>
    </sec>
    <sec id="sec-5">
      <title>Listing 2: Scaling istructions</title>
      <p>Inside the int main (), actual variables corresponding to
formal variables are defined and, for each of them, memory
allocation is carried out. Also we introduce other three
variables dev sign, dev fil, dev y that play a similar task in GPU
device
// allocation in host memory
sign_host = (float *) malloc(sample*sizeof(float));
fil_host = (float *) malloc(filtro*sizeof(float));
y_host = (float *) malloc(sample*sizeof(float));
// allocation in device memory
cudaMalloc((void**)&amp;dev_sign, sample*sizeof(float));
cudaMalloc((void**)&amp;dev_fil, filtro*sizeof(float));
cudaMalloc((void**)&amp;dev_y, sample*sizeof(float));</p>
    </sec>
    <sec id="sec-6">
      <title>Listing 3: Malloc and CudaMalloc</title>
      <p>Later, after loading the samples of the signal and filter
coefficients, respectively on the arrays sign host and fil host,
we proceed with data transfer on device using cudaMemcpy
commands. In fact, they constitute a bottleneck in the
performance of a code and therefore should be used as sparingly
as possible. For this reason we decide to accumulate the data
of num iter iterations in a single output array y whose size
is equal to num iter sample. After we carry out another
cudaMemcpy to return output data from host to device
//Data transfer from host to device
cudaMemcpy(dev_sign, sign_host, sample*sizeof(float),
cudaMemcpyHostToDevice);
cudaMemcpy(dev_fil, fil_host, filtro*sizeof(float),
cudaMemcpyHostToDevice);</p>
    </sec>
    <sec id="sec-7">
      <title>Listing 4: Cudamemcpy istructions</title>
      <p>Finally, we save output data for each of single iterations
and we can free host and device allocate memory through
free(...) and Cudafree(...) commands. Function clock(...),
called from C library &lt;time.h&gt;, is useful to measure the time of
this and the other program described in the following section.</p>
      <sec id="sec-7-1">
        <title>B. Sequential program</title>
        <p>Another version of code that performs the same task refers
to a sequential programming model. By this we mean the
transposition of signal filtering in a conventional program
written in C language. In this case the first thing to do is
defining the function which achieves convolution product and
corresponds to the parallel code kernel, as shown below. As we
can observe, such a function is similar to the kernel described
above. Here, thread index disappears and is replaced by an
index with the same name but referring to a for loop whose
element y(id) is computed in a sequential way.
void wavelet(float *sign, float *fil, float*y, int m) {
for (int id=0; id&lt;sample; id++) {
int P = m*sample;
for (int i=0; i&lt;filtro; i++)
if ((id-i) &gt; 0) y[P+id]+= sign[id-i]* fil[i];
else y[P+id]+= sign[i-id]* fil[i];
int div = (int) pow(2,m);
sign[id] = sign[id-(id%div)];
}
}
return;</p>
      </sec>
    </sec>
    <sec id="sec-8">
      <title>Listing 5: sequential function</title>
      <p>Clearly all typical CUDA instructions have disappeared;
nevertheless, in order to compare fairly this code with parallel
one, we need to replace them with similar instructions that
emulate the same behavior. This explains why instead of
cudaM alloc we find three additional variablesd sign host,
d fil host, and d y host allocated in host memory which
substitute arrays dev sign, dev fil and dev y. Then, after
execution finishes, cudaMemcpy are replaced by assignments
listed below, unnecessary for the results, but useful to take
into account the evaluation of time (and performance)
d_sign_host = sign_host;
d_fil_host = fil_host;
d_y_host = y_host;</p>
      <p>Finally, in this model we use clock( ) function in order
to measure execution time of the program. The goal now is
making benchmark of two codes and comparing results.</p>
    </sec>
    <sec id="sec-9">
      <title>VI. EXPERIMENTAL RESULTS</title>
      <p>Now we analyse the performance for sequential and parallel
codes. In order to pursue this target, we change the number of
samples that makes up our examined signal and we evaluate
the time trend which results increasing gradually the number
of samples. The simulations of both codes will be conducted
on two different technical specification computers. In fact the
first machine is used as a normal PC for student laboratory
applications; the other one is dedicated to specific applications as
a server, which has got high reliability, increased performance
and additional features. For this reason, in order to distinguish
them, we denote the first computer as PC, the second one as</p>
      <sec id="sec-9-1">
        <title>Server.</title>
      </sec>
      <sec id="sec-9-2">
        <title>A. Technical specifications</title>
        <p>We describe the main features of two machines and their
respective CPU and graphics card.</p>
        <p>
          1) PC: It has got an AMD Athlon 64X2 with frequency
CPU clock up to 2.9 GHz and NVIDIA GeForce GTX 480
GPU. This GPU shows the following engine and memory
specifications [
          <xref ref-type="bibr" rid="ref24">24</xref>
          ]: it has a number of CUDA cores egual to
480, with a graphic clock of about 700MHz and a fill rate
texture of 42 billion per second. The interfaces are designed for
PCI Express 2.0x16 accelerator, with a peak bandwith of up to
2 GByte per second and with a 1536 MByte GDDR5 standard
memory, where memory locations are connected through 384
bit memory interface.
        </p>
        <p>2) Server: In server we find a Intel Xeon CPU having a
clock frequency up to 3.4 GHz. About GPU, here is a NVIDIA
Tesla Kepler K10. This card offers a total of 8 GByte GDDR5
on-board memory, of which 4 GByte for GPU, and supports
PCI Express Gen 3 bus interface.</p>
      </sec>
      <sec id="sec-9-3">
        <title>B. Simulations</title>
        <p>Since technical features of PC GPU are very different than
Server one, it is clear that for the parallel code we have to
adjust the number of threads per block, according to the type
of used GPU: if we work with GeForce, this parameter will
have to be equal to 480; if the code is executed on server with
Tesla Kepler K10 card, then we should put it equal to 1536.</p>
        <p>The simulation of the parallel code on PC offers the result
represented graphically in Figure 3a.</p>
        <p>Figure 3a shows an almost linear trend throughout the range
from 1000 to 10 milion of samples, with a computation time
varying from 150 to 300 ms for the first 10000 samples. Start
from 5 milion of samples, the computing time increases of
about 20 seconds; in the range of equal amplitude to previous
one, from 5 to 10 milion of samples, the computing time
increment is about 15 seconds compared to the theoretical
expected 20s that we should obtain if the curve had not
undergone the level-shift down. A similar trend is given in
Figure 3b for the simulations of parallel code on the server. In
this case, for 10 milion of samples computing time is initially
larger of about one order of magnitude, growing from there
linearly up to 9 milion of samples, where the execution time
of the program is 17:4s. Subsequently, from 9 to 10 milion
of samples, the computing time increases of only 200 ms.</p>
        <p>A comparison between PC and server runs for parallel and
sequential version is shown in 4a and 4b:</p>
        <p>We can see that, for PC for a number of samples less than
15000, sequential code timing is below the curve relative to the
parallel code; in the range between 20000 and 70000 samples
the two curves intersect several times, showing an almost
swinging behavior; instead from 70000 samples the CPU line
is above GPU one and increasing the number of samples their
distance is larger and larger, and at the 10 million samples it
reaches 25 seconds. Server simulations show, instead, parallel
code starts having performance better than sequential one only
when they have reached 3 milion of samples, a value much
higher than the 70000 seen for the server. We should note in
this case the gap between two curves is very small: in fact in
the range up to 3 milion samples the sequential is faster than
parallel of about 2s; once crossed the point where the two
codes have similar performance, the GPU starts to work better,
gaining a time advantage of about 4:5s in the neighborhood
of 10 million samples.</p>
        <p>Figure 5 gives a global overview of the CPUs and GPUs
behavior in PC and Server. As clearly shown in this graph,
reaching an amount of samples high enough (almost 3
million), the best performance in terms of saved time for program
execution is when we implement and execute the parallel code
using server GPU: this result was quite predictable because
with this card we use 1536 cores compared to 480 of GeForce
30
[]e25
s
m
ilt
a
itton20
a
u
p15
m
o
C
10
5
00
60
50
6.9
][
s
iem6.85
T
l
a
iton 6.8
a
t
u
p
om6.75
C
6.7
6.65</p>
        <p>X: 3.121e+006
Y: 6.818
1 2 3 Nu4mber o5f Samp6les 7 8 9 x 10160 1 2 3 Nu4mber o5f Samp6les 7 8 9 x 10160
(a) Computing time of parallel code in PC for varying amount of (b) Computing time of parallel code in Server for varying amount of
samples samples
GPU. Nevertheless, by a careful observation, though GPU
server performance are better than GeForce one, being able to
earn between 10 and 25s ahead of the second one, it is equally
true that there aren’t considerable differences from what it
happens by exploiting the server CPU potential than Kepler
GPU: in this case the separation between the Intel Xeon CPU
curve and Tesla Kepler relating one is only a few seconds.</p>
        <p>
          This result is due to the server, because of its features and
applications, has got hardware equipment more advanced than
a normal PC; in fact Xeon CPU, with its 6 cores per socket and
a clock frequency up to 3 GHz, can provide very satisfactory
results which are not very different than ones offered by Tesla
Kepler GPU. On the other hand the difference between the use
of a parallel code and a sequential one is more pronounced
when we look at a PC with an average CPU and we compare
it with GeForce GTX 480 GPU, which belongs to a
highend market and with its 1536 Mbytes of installed RAM, its
GDDR5 video memory and high operating frequencies, it is
certainly one of the most important products made by NVIDIA
corporation [
          <xref ref-type="bibr" rid="ref24">24</xref>
          ].
        </p>
        <p>According to what argued so far, some significant
information can be derived by plotting all the different ratio
combinations between GPU and CPU timing for PC and
server. From Figure 6a we observe clearly that for the first
20000 samples the sequential code on the CPU is faster than
GPU program; the situation is reversed past this value of
samples, from which parallel code becomes approximately 1.5
times faster than sequential one.</p>
        <p>As shown in figure 6b for the server, we have a
similar situation. However, here the GPU shows its advantages
Comparison among serial and parallel codes for PC and SERVER</p>
        <p>NVIDIA GeForce GTX−480 GPU
NVIDIA Kepler K10 1536−Core GPU
AMD Athlon CPU
INTEL XEON CPU</p>
        <p>PC
1
2
3</p>
        <p>4 5 6
Number of Samples</p>
        <p>SERVER
7
8
9
after passing 3 milion of samples. Moreover, in this graph
the performance of parallel code are better than about 1.5
times, compared with sequential one in correspondence of
the maximum limit of our observation range. The situation
is a bit different when we make mixed ratios among GPU
performance of a machine and CPU performance of the other
one.</p>
        <p>If we take into account figure 7a, we see a downward trend,
where in correspondance of an amount of samples equal to
1000, the times of server GPU are greater than PC CPU, even
over two orders of magnitude. The performance of examined
GPU and CPU are equal when we reach 500000 samples.</p>
        <p>Going forward, this ratio becomes thiner and thiner, until it
settles around 0.3 in the range from 9 to 10 million samples.</p>
        <p>CPU and GPU ratio for PC</p>
        <p>AMD Athlon CPU/ NVIDIA GeForce GPU</p>
        <p>CPU and GPU ratio for SERVER</p>
        <p>INTEL XEON CPU/ NVIDIA KEPLER K10 GPU</p>
        <p>A monotonically similar trend is shown in the graph 7b.
However, for reason seen previously, the ratio between GPU time of
PC and CPU time of server is always maintained higher than
one, demonstrating GeForce performance are always inferior
if we compare them with the Intel Xeon CPU. Finally, if we
compare to each other the execution times of two GPUs, we
observe that initially the curve remains below the unit in the
range from 1000 to about 800000 samples, indicating PC GPU
works better than Server one, with values 10 times lower.</p>
        <p>Instead, in the remaining part of observation range, GeForce
execution time is about twice than Tesla Kepler K10 (see figure
8).</p>
        <p>PC and SERVER GPU ratio
U
/PG10−1
U
P
C
10−2
10−1303
101
r100
e
v
r
e
s
U
P
G
/
c
p
U
PG10−1
10−1203</p>
        <p>105
Number of Samples
106</p>
        <p>107
Fig. 8: Ratio between PC and Server GPU</p>
      </sec>
    </sec>
    <sec id="sec-10">
      <title>VII. RELATED WORKS Now we remark some works closer to this one, that have been carried out in parallel computing context, in particular</title>
      <p>U
/PC101
U
P
G
U
P
C
/
U
P
G
101
104 105 106 107 101003 104 105 106 107</p>
      <p>Number of Samples Number of Samples
(a) Mixed Ratio between NVIDIA Tesla K10 GPU and AMD Athlon (b) Mixed Ratio between NVIDIA GeForce GPU and Intel Xeon CPU
CPU times times
reflecting about GPU card potentials applied to wavelet filters.</p>
      <p>
        In [
        <xref ref-type="bibr" rid="ref25">25</xref>
        ] the authors deepen the concept based on an algorithm
centered on GPU cards to reconstruct 3D wavelet using
programs fragments to minimize the transfer of data and
processing overhead fragment; for this pourpose they have
proposed a novel scheme that uses tile boards as a primary
layout to organize 3D wavelet coefficients.
      </p>
      <p>
        In article [
        <xref ref-type="bibr" rid="ref26">26</xref>
        ], the authors present an algorithm that
performs SIMD complete discrete wavelet transform (DWT)
convolution on a GPU, which brings significant improvement
performance on a normal PC, without additional costs. Although
the forward and inverse wavelet transforms are mathematically
different, the algorithm they proposed unifies them to an
almost identical process that can be efficiently implemented
on GPU. DWT has a wide range of applications, by signal
processing in video and image compression. For this reason, in
[
        <xref ref-type="bibr" rid="ref27">27</xref>
        ] the authors have shown that this transformation, by means
of the lifting system, can be performed in memory mode
and efficient computation on GPU, through CUDA computing
paradigm of Nvidia. In particular their design exploits three
major hardware architectures for 2D DWT (row-column,
linebased, block-based) and describes a hybrid method between
the row and column-based methods on blocks.
      </p>
      <p>
        Another work, in [
        <xref ref-type="bibr" rid="ref28">28</xref>
        ], presents an improved version of
an algorithm suitable to compute the 2D DWT on GPU.
      </p>
      <p>In their work the authors have adapted this method for an
existing algorithm computing the vertical transform pass. By
taking advantage of the computational power of a GPU when
implementing a wavelet transform, they demonstrate the time
of the computation can be substantially reduced.</p>
      <p>
        Work [
        <xref ref-type="bibr" rid="ref29">29</xref>
        ], proposes a method which analyzes the behavior
of several parallel algorithms developed to compute the two
dimensional DWT, in particular using both openMP over
a multicore platform and CUDA over a GPU. They also
have found that significant execution time improvements are
achieved on both multicore platforms and GPUs. Likewise in
the paper [
        <xref ref-type="bibr" rid="ref30">30</xref>
        ], the authors explore the potential of OpenCL
in accelerating the DWT computation and analyze the
programmability, portability and performance aspects of this
language; their experimental analysis is done using NVIDIA
and AMD drivers that support OpenCL.
      </p>
      <p>
        The authors in paper [
        <xref ref-type="bibr" rid="ref31">31</xref>
        ] present an overview of wavelet
based multiresolution analysis, discussing the continuos
wavelet transform in its simplest form and looking at
orthogonal, biorthogonal and semiorthogonal wavelets. Many authors
have applied the strategy of parallel computing using wavelets
to image encoding field. In the paper [
        <xref ref-type="bibr" rid="ref32">32</xref>
        ] the computation
steps in JPEG2000 are examined, particularly in the Tier-1,
and novel, GPGPU compatible, parallel processing methods
through wavelets for the sample-level coding of the images are
developed. In work [
        <xref ref-type="bibr" rid="ref33">33</xref>
        ] closer to the previous one, the authors
focus their attention on accelerating JPEG2000 encoder by
using GPGPU.
      </p>
      <p>
        Finally, [
        <xref ref-type="bibr" rid="ref34">34</xref>
        ] presents a GPGPU framework with the
corresponding parallel computing solution for wavelet based
image denoising by using off-the-shelf consumer-grade
programmable GPUs. Their experiment results show that
framework gain applicability in data parallelism and satisfaction
performances in accelerating computations for wavelet-based
denoising.
      </p>
    </sec>
    <sec id="sec-11">
      <title>VIII. CONCLUSIONS</title>
      <p>In this work we have analyzed the computational
capacity of a parallel code written in CUDA environment which
implements the filter process of a randomic signal using a
biorthogonal wavelet filter, and we have compared it with a
sequential code that performs the same task; we have
executed both codes on two computers having different technical
specifications.</p>
      <p>Simulations make it clear that, except the case in which
the number of samples is very low, the adoption of a parallel
programming technique is certainly advantageous in terms of
execution time. In particular, over a number of 3 million of
samples, the GPU Server performance predominates on CPU
of the same computer and on both GPU and CPU related to
PC, confirming the strong potential of parallel computing in
terms of efficiency, computational capacity and execution time.</p>
      <p>
        The potential for future GPU perfomance increases presents
great opportunities for demanding applications, including
computational graphics, computer vision, and a wide range of
highperformance computing applications [
        <xref ref-type="bibr" rid="ref35">35</xref>
        ].
      </p>
    </sec>
    <sec id="sec-12">
      <title>ACKNOWLEDGMENT</title>
      <p>The authors would like to thank Giacomo Capizzi and
Christian Napoli to lead them in the Parallel GPU computing
with CUDA field and for the support in drafting and reviewing
this paper.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>G.</given-names>
            <surname>Pappalardo</surname>
          </string-name>
          and E. Tramontana, “
          <article-title>Automatically discovering design patterns and assessing concern separations for applications,”</article-title>
          <source>in Proceedings of ACM Symposium on Applied Computing (SAC)</source>
          , Dijon, France,
          <year>April 2006</year>
          , pp.
          <fpage>1591</fpage>
          -
          <lpage>1596</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>C.</given-names>
            <surname>Napoli</surname>
          </string-name>
          ,
          <string-name>
            <given-names>G.</given-names>
            <surname>Pappalardo</surname>
          </string-name>
          , E. Tramontana, and G. Zappala, “
          <article-title>A CloudDistributed GPU Architecture for Pattern Identification in Segmented Detectors Big-Data Surveys,”</article-title>
          <source>The Computer Journal</source>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>F.</given-names>
            <surname>Bonanno</surname>
          </string-name>
          , G. Capizzi,
          <string-name>
            <given-names>G. L.</given-names>
            <surname>Sciuto</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Napoli</surname>
          </string-name>
          , G. Pappalardo, and E. Tramontana, “
          <article-title>A novel cloud-distributed toolbox for optimal energy dispatch management from renewables in igss by using wrnn predictors and gpu parallel solutions,” in Power Electronics, Electrical Drives, Automation and Motion (SPEEDAM</article-title>
          ),
          <source>2014 International Symposium on. IEEE</source>
          ,
          <year>2014</year>
          , pp.
          <fpage>1077</fpage>
          -
          <lpage>1084</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>F.</given-names>
            <surname>Bonanno</surname>
          </string-name>
          , G. Capizzi,
          <string-name>
            <given-names>G. Lo</given-names>
            <surname>Sciuto</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Napoli</surname>
          </string-name>
          , G. Pappalardo, and E. Tramontana,
          <article-title>“A cascade neural network architecture investigating surface plasmon polaritons propagation for thin metals in openmp</article-title>
          ,”
          <source>in Proceedings of International Conference on Artificial Intelligence and Soft Computing (ICAISC)</source>
          ,
          <source>ser. Springer LNCS</source>
          , vol.
          <volume>8467</volume>
          ,
          <string-name>
            <surname>Zakopane</surname>
          </string-name>
          , Poland,
          <year>June 2014</year>
          , pp.
          <fpage>22</fpage>
          -
          <lpage>33</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>C.</given-names>
            <surname>Napoli</surname>
          </string-name>
          ,
          <string-name>
            <given-names>G.</given-names>
            <surname>Pappalardo</surname>
          </string-name>
          , E. Tramontana,
          <string-name>
            <given-names>R.</given-names>
            <surname>Nowicki</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Starczewski</surname>
          </string-name>
          , and M. Woz´niak, “
          <article-title>Toward work groups classification based on probabilistic neural network approach,”</article-title>
          <source>in Proceedings of International Conference on Artificial Intelligence and Soft Computing (ICAISC)</source>
          , ser. Springer LNCS, Zakopane, Poland,
          <year>June 2015</year>
          , vol.
          <volume>9119</volume>
          , pp.
          <fpage>79</fpage>
          -
          <lpage>89</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>M.</given-names>
            <surname>Woz</surname>
          </string-name>
          ´niak,
          <string-name>
            <given-names>D.</given-names>
            <surname>Połap</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Gabryel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Nowicki</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Napoli</surname>
          </string-name>
          , and E. Tramontana, “
          <article-title>Can we process 2d images using artificial bee colony?</article-title>
          ”
          <source>in Proceedings of International Conference on Artificial Intelligence and Soft Computing (ICAISC)</source>
          , ser. Springer LNCS, Zakopane, Poland,
          <year>June 2015</year>
          , vol.
          <volume>9119</volume>
          , pp.
          <fpage>660</fpage>
          -
          <lpage>671</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>J.</given-names>
            <surname>Sanders</surname>
          </string-name>
          and
          <string-name>
            <given-names>E.</given-names>
            <surname>Kandrot</surname>
          </string-name>
          ,
          <string-name>
            <surname>CUDA BY EXAMPLE</surname>
          </string-name>
          ,
          <article-title>An Introduction to General-Purpose GPU Programming, NVIDIA</article-title>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          <article-title>[8] Introduction to parallel programming</article-title>
          . [Online]. Available: courses.cs.washington.edu
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>E.</given-names>
            <surname>Tramontana</surname>
          </string-name>
          , “
          <article-title>Managing Evolution Using Cooperative Designs and a Reflective Architecture,” in Reflection and Software Engineering</article-title>
          , ser. Springer LNCS,
          <year>2000</year>
          , vol.
          <year>1826</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>O.</given-names>
            <surname>Rioul</surname>
          </string-name>
          and
          <string-name>
            <given-names>M.</given-names>
            <surname>Vetterli</surname>
          </string-name>
          , “Wavelets and
          <string-name>
            <given-names>Signal</given-names>
            <surname>Processing</surname>
          </string-name>
          ,” IEEE SP magazine,
          <year>October 1991</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>C.</given-names>
            <surname>Napoli</surname>
          </string-name>
          , G. Pappalardo, and E. Tramontana, “
          <article-title>An agent-driven semantical identifier using radial basis neural networks and reinforcement learning</article-title>
          ,” in XV Workshop ”From Objects to Agents
          <source>” (WOA)</source>
          , vol.
          <volume>1260</volume>
          .
          <string-name>
            <surname>Catania</surname>
          </string-name>
          , Italy: CEUR-WS,
          <year>September 2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>J.</given-names>
            <surname>Akhtar</surname>
          </string-name>
          ,
          <article-title>Optimization of biorthogonal wavelet filters for signal and image compression</article-title>
          ,
          <year>February 2001</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>C.</given-names>
            <surname>Napoli</surname>
          </string-name>
          , G. Pappalardo, and E. Tramontana, “
          <article-title>A Hybrid Neuro-Wavelet Predictor for QoS Control</article-title>
          and Stability,”
          <source>in Proceedings of Advances in Artificial Intelligence (AI*IA)</source>
          ,
          <source>ser. Springer LNCS</source>
          , vol.
          <volume>9119</volume>
          ,
          <string-name>
            <surname>Torino</surname>
          </string-name>
          , Italy,
          <year>December 2013</year>
          , pp.
          <fpage>527</fpage>
          -
          <lpage>538</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>[14] [Online]. Available: http://www.bssaonline.org</mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>M. A.</given-names>
            <surname>Salem</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Ghamry</surname>
          </string-name>
          , and
          <string-name>
            <given-names>B.</given-names>
            <surname>Meffert</surname>
          </string-name>
          , “
          <article-title>Daubechies versus biorthogonal wavelets for moving object detection in traffic monitoring systems</article-title>
          ,”
          <year>2009</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>S.</given-names>
            <surname>Mallat</surname>
          </string-name>
          , A Wavelet Tour of Signal Processing,
          <year>October 2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>M. P.</given-names>
            <surname>Chaudhary</surname>
          </string-name>
          and G. Lalit, “
          <article-title>Lifting Schemem Using HAAR and Biorthogonal Wavelets For Image Compression,”</article-title>
          <source>Internetional Journal of Engineering Reseach and Applications</source>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18] “
          <article-title>Cuda c programming guide version 4</article-title>
          .2,” pp.
          <fpage>1</fpage>
          -
          <lpage>5</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>Z.</given-names>
            <surname>Yang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Zhu</surname>
          </string-name>
          , and
          <string-name>
            <given-names>Y.</given-names>
            <surname>Pu</surname>
          </string-name>
          , “
          <source>Parallel Image processing Based on CUDA,” in Proceedings of International Conference on Computer Science and Software Engeneering</source>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <surname>NVIDIA CUDA C Programming</surname>
          </string-name>
          <article-title>Guide</article-title>
          ,
          <year>April 2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <given-names>A.</given-names>
            <surname>Fornaia</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Napoli</surname>
          </string-name>
          , G. Pappalardo, and E. Tramontana, “
          <article-title>An AO system for OO-GPU programming</article-title>
          ,
          <source>” in Proceedings of the 16th Workshop ”</source>
          From Object to Agents” (
          <issue>WOA15</issue>
          ), Naples, Italy,
          <year>June 2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <string-name>
            <given-names>L.</given-names>
            <surname>Verdoliva</surname>
          </string-name>
          , “La trasformata wavelet,”
          <fpage>2009</fpage>
          -
          <lpage>2010</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>[23] [Online]. Available: http://wavelets.pybytes.com/wavelet/bior3.7</mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>[24] [Online]. Available: http://www.nvidia.it/object/geforce-family-it.html</mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [25]
          <string-name>
            <given-names>A.</given-names>
            <surname>Garcia and H.-W. Shen</surname>
          </string-name>
          , “
          <article-title>Gpu-Based 3D Wavelet Recostruction With Tileboarding,” The Visual Computer</article-title>
          , vol.
          <volume>21</volume>
          , no.
          <issue>8-10</issue>
          , pp.
          <fpage>755</fpage>
          -
          <lpage>763</lpage>
          ,
          <year>2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          [26]
          <string-name>
            <surname>T.-T. Wong</surname>
            , C.-S. Leung,
            <given-names>P.-A.</given-names>
          </string-name>
          <string-name>
            <surname>Heng</surname>
            , and
            <given-names>J.</given-names>
          </string-name>
          <string-name>
            <surname>Wang</surname>
          </string-name>
          , “
          <source>Discrete Wavelet Transform On Consumer-Level Graphics Hardware,” IEEE Transactions on Multimedia</source>
          , vol.
          <volume>9</volume>
          , no.
          <issue>3</issue>
          , pp.
          <fpage>668</fpage>
          -
          <lpage>673</lpage>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          [27]
          <string-name>
            <given-names>W.</given-names>
            <surname>Van Derlaan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Jalba</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J.</given-names>
            <surname>Roerdink</surname>
          </string-name>
          , “
          <source>Accelereting Wavelet Lifting On Graphics Hardware Using Cuda,” IEEE Transactions on Parallel and Distribuited Systems</source>
          , vol.
          <volume>22</volume>
          ,
          <year>August 2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          [28]
          <string-name>
            <given-names>H.</given-names>
            <surname>Moen</surname>
          </string-name>
          , “
          <article-title>Wavelet transforms and efficient implementation on the GPU</article-title>
          ,” May
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref29">
        <mixed-citation>
          [29]
          <string-name>
            <given-names>V.</given-names>
            <surname>Galiano</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Lopez</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Malumbres</surname>
          </string-name>
          , and
          <string-name>
            <given-names>H.</given-names>
            <surname>Migallun</surname>
          </string-name>
          , “
          <article-title>Parallel strategies for 2D Discrete Wavelet Transform in shared memory systems</article-title>
          and GPUs,” Springer Science,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref30">
        <mixed-citation>
          [30]
          <string-name>
            <given-names>B.</given-names>
            <surname>Sharma</surname>
          </string-name>
          and
          <string-name>
            <given-names>N.</given-names>
            <surname>Vydyanathan</surname>
          </string-name>
          , “
          <article-title>Parallel discrete wavelet transform using the Open Computing Language: a performance and portability study</article-title>
          ,”
          <source>in Proceedings of IEEE International Symposium on Parallel and Distribuited Processing</source>
          ,
          <year>April 2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref31">
        <mixed-citation>
          [31]
          <string-name>
            <given-names>B.</given-names>
            <surname>Jawerth</surname>
          </string-name>
          and
          <string-name>
            <given-names>W.</given-names>
            <surname>Sweldens</surname>
          </string-name>
          , “
          <article-title>An Overview Of Wavelet Based Multiresolution Analyses,” SIAM review</article-title>
          , vol.
          <volume>36</volume>
          , no.
          <issue>3</issue>
          , pp.
          <fpage>377</fpage>
          -
          <lpage>412</lpage>
          ,
          <year>1994</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref32">
        <mixed-citation>
          [32]
          <string-name>
            <given-names>R.</given-names>
            <surname>Le</surname>
          </string-name>
          ,
          <string-name>
            <surname>I. Bahar</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J.</given-names>
            <surname>Mundy</surname>
          </string-name>
          , “
          <article-title>A Novel Parallel Tier-1 Coder For Jpeg2000 Using Gpus,” Application Specific Processors</article-title>
          , IEEE, june
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref33">
        <mixed-citation>
          [33]
          <string-name>
            <given-names>M.</given-names>
            <surname>Ahmadvand</surname>
          </string-name>
          and
          <string-name>
            <given-names>A.</given-names>
            <surname>Ezhdehakosh</surname>
          </string-name>
          , “
          <article-title>Gpu-based implementation of jpeg2000 encoder,”</article-title>
          <source>in Proceedings of the International Conference on Parallel and Distributed Processing Techniques and Applications (PDPTA)</source>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref34">
        <mixed-citation>
          [34]
          <string-name>
            <given-names>Y.</given-names>
            <surname>Su</surname>
          </string-name>
          and
          <string-name>
            <given-names>Z.</given-names>
            <surname>Xu</surname>
          </string-name>
          , “
          <article-title>Parallel implementation of wavelet-based image denoising on programmable pc-grade graphics hardware</article-title>
          ,
          <source>” Signal Processing</source>
          , vol.
          <volume>90</volume>
          , no.
          <issue>8</issue>
          , pp.
          <fpage>2396</fpage>
          -
          <lpage>2411</lpage>
          ,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref35">
        <mixed-citation>
          [35]
          <string-name>
            <given-names>S. W.</given-names>
            <surname>Keckler</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W. J.</given-names>
            <surname>Dally</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Khailany</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Garland</surname>
          </string-name>
          , and
          <string-name>
            <given-names>D.</given-names>
            <surname>Glasco</surname>
          </string-name>
          , “
          <article-title>GPUs and the Future of Parallel Computing,” IEEE Computer Society</article-title>
          , September/
          <year>October 2011</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>