<!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>Parallel Computing Solutions for Linear Combination of Filters</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Andrea Cavarra</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Dario Caramagno</string-name>
          <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>23</fpage>
      <lpage>29</lpage>
      <abstract>
        <p>-The GPU (Graphics Processing Unit) are the future of high performance computing and provides a parallel programming model for general purpose applications thanks to CUDA programming interface. The programming model of GPU architecture is significantly different from the traditional CPU one. This paper presents the advantages of GPU architecture by proposing an algorithm for the linear combination of digital filters in image processing, implemented as a parallel GPU version (a sequential CPU version has been also implemented for comparison). The use of parallel processing CUDA architecture has enabled us to take advantage of the GPU allowing an increase of the performance compared to CPU. Index Terms-Matrices Convolution, Image processing, GPGPU, Parallel Computing, CUDA.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>I. INTRODUCTION</title>
      <p>The evolution of computers has allowed to develop more
complex calculations and has improved the performance of
the simulations in scientific fields. Technology has increased
the CPU (Central Processing Unit) frequency with the upper
limit of 3 GHz, processing multiple cores: dual core, quad core
and octa core in a few decades, unfortunately with the limits
due to power dissipation and the increasing temperature.</p>
      <p>
        One of the solutions proposed to push such limits is the
use of the GPU (Graphics Processing Unit). Typically, GPUs
handle the huge amount of data for graphical applications
in three-dimensions with high performances, so the GPGPU
(General-Purpose Computing on GPU) has been introduced.
GPGPU programming has been implemented using two types
of APIs (Application Programming Interface): the complex
OpenGL [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] and DirectX [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ].
      </p>
      <p>In the recent years, the computer house NVIDIA has
developed CUDA (Compute Unified Device Architecture).
This platform is much simpler than the previous APIs and
and it allows to program using a high level programming
language based on C, using a model of parallel computing.
NVIDIA CUDA technology has opened a new era for GPGPU
computing allowing the design and implementation of parallel
GPU-oriented algorithms without needing any knowledge on
OpenGL. The computational power of these architectures,
nowadays, has received a considerable growth compared to
CPUs and due to the GPU ability to perform a huge number
of simple operations in parallel. GPUs have cores much
simpler compared to CPUs. This allows the realization of
Copyright c 2016 held by the authors.</p>
      <p>
        GPU architectures in which the silicon area for control and
management is very reduced compared to that employed in
the CPU and a big increase in the number of cores [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ].
      </p>
      <p>GPUs allow us to compute optimally, in parallel mode,
a code with a certain complexity and for the application of
digital filters in two-dimension arrays. This paper proposes
the use of GPU architecture for the implementation of digital
filters with a parallel code that uses a linear combination of
digital filters processing images. The aim is to compare the
parallel execution speed to the sequential code. The remaining
parts of the paper will be dedicated to explain the parallel and
serial approaches.</p>
      <p>A digital filter performs mathematical operations on
discrete-time sampled signals in order to enhance or reduce
certain characteristics of the signal. Such filters are
implemented by software components, often through mathematical
functions or matrices, and loaded inside the processors with
programmable hardware. Cost and speed are closely dependent
on the used processor.</p>
      <p>The application of digital filters has enormous advantages
over analog filters as the possible transfer functions are much
more flexible for digital filters. The main advantages are:
1) high accuracy due to the absence of physical
components;
2) a digital filter is easier to design and implement
automatically modifing its frequency response and changing
the input;
3) flexibility to change the digital filter parameters, without
changing the system hardware;
4) easy simulation and design of the filters being
implemented by software with a reduction of system
complexity.
these properties are essential to the implementation of a high
quality filter. As mentioned previously these advantages are
accompanied by the limitations of speed and cost, related
to the processor used, and frequency. The frequency limit is
described by Nyquist theorem, using the following formula:
fs &gt; 2B
(1)
which imposes the filter with a maximum limit of the
frequencies in order to reduce the effects of additional aliasing
distortion of the signals. B term is the signal band and fs
is sampling frequency. The digital filters are widely used in
image filtering and image processing. This paper will examine,
implement and test an algorithm to filter digital images with
a GPU implementation.</p>
      <sec id="sec-1-1">
        <title>A. Digital filters for image processing</title>
        <p>Digital filters are an essential tool for image processing.
The digital image can be defined as a two dimensional array
or matrix and each element represents a pixel of the image.
Images are processed by an algorithm. The process of filtering
is also known as convolution of a mask with a standard size
3x3, 5x5 or 9x9, which is a matrix. This mask applies different
mathematical operators by means of a convolution to the image
to achieve digital image processing.</p>
        <p>The use of filters to digital image processing allows us to
make operations like:
1) the extraction of information from the image, such as
the detection of boundaries in images;
2) the exaltation of details, such as the increase of light
intensity or color contrast;
3) the elimination and reduction of disturbances in images.</p>
        <p>This processing brings a high computational cost especially
for large images. For this reason a sequential approach, based
on the CPU, is not very efficient, so parallel approaches have
been introduced to increase performances. This paper presents
an algorithm for the application of a linear combination
of filters to local processing based on a model of parallel
computation on GPU architectures. For our local processing
filters, the image processing method consists of applying a
function to each original pixel values and to an appropriate
range of pixels, within the radius of the filter matrix. This
method is based on the convolution operator for which a brief
explanation is needed.</p>
      </sec>
      <sec id="sec-1-2">
        <title>B. Convolution</title>
        <p>As previously said, the algorithm executes an operation
on an input matrix and pre-established filters, in order to
provide as a resalt a linear combination of the input. The 2D
convolution between two continuous functions, f (x; y) and
g(x; y), is defined by the formula:</p>
        <p>Z 1
f (x; y) g(x; y) =
f ( ; )g(x
; y
)d d
(2)
1
This expression will be brought to the discrete domain, by
assuming f (x; y) and g(x; y) be two discrete arrays of a
limited size, as a double sum expressed by:</p>
        <p>M 1 N 1
f (x; y) g(x; y) = X X f (m; n)g(x
=0 =0
; y
)d d
(3)
for x = 0; 1; : : : ; M 1 and y = 0; 1; : : : ; N 1.</p>
        <p>This convolution operation is defined on discrete-time as
a simple operation of “local media” in a range of amplitude
defined by the kernel size used obtaining a value for the output
matrix for the same position of the source data as shown in
figure 1.</p>
        <p>This operation is done from left to right, for each of the
original matrix element obtaining the matrix of the resulting
convolution. Therefore, the convolution algorithm implements
the digital filtering operation. Then, it suffices to modify the
kernel in order to change the type of filter. We have studied
a digital filtering operation of am image, in ASCII format,
through two filters of ninth order. The next section describes
the convolution operation implemented as a parallel algorithm
that can be executed on a CUDA GPU.</p>
      </sec>
    </sec>
    <sec id="sec-2">
      <title>III. PARALLEL COMPUTING ON GPU</title>
      <p>This paper presents the convolution algorithm
implementation for a bidimensional matrix of input data with a linear
combination of filters using a parallel model. In this work
two versions of the same algorithm are presented in order
to compare the efficiency of the parallel computation and
the sequential one, and then demonstrate how the parallel
computing support is far more suitable for high performance
computing.</p>
      <sec id="sec-2-1">
        <title>A. GPU Architecture</title>
        <p>In recent decades, high performance computing sector has
been having an exponential growth with the widespread use
of GPGPU. The use of GPU in this ever-expanding purview
can exploit the power of parallel computing for increasingly
complex simulations due to the inherent parallel nature of
GPUs.</p>
        <p>CUDA compatible GPUs are, in fact, based on an
architecture made up of a number of MIMD (Multiple Instruction
Multiple Data) multiprocessors called Streaming MultiProcessors,
whose number depends on the specification and class of GPU
performance. This Streaming MultiProcessors are the basic
units of the GPU architecture and are implemented as SIMD
(single instruction multiple data), and called by NVIDIA
as SIMT (Single Instruction Multiple Threads), which has
8 processors said Streaming Processor or CUDA Cores. In
this architecture, each Streaming MultiProcessor is able to
create, manage, schedule and execute groups of 32 threads
called warp. A warp executes one instruction at a time, so
as to maximize the efficiency when all 32 threads of a warp
agree on their execution path. When one or more blocks of
threads are assigned to a multiprocessor to run, they are then
partitioned into warps, scheduled by a warp scheduler and
executed one at a time. Each of these processors can perform
simple mathematical operations (such as addition, subtraction,
multiplication, ect.) for integers or floating point numbers.
Inside each multiprocessor there is also a shared memory,
accessible only by the processors in the same multiprocessor,
caches for instructions and for data, and, finally, a unit for
decoding the instructions.</p>
        <p>
          Each multiprocessor has access to a global memory shared
among all GPU multiprocessors and called Device
Memory [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ]. The programming model in CUDA C organizes the
program in a sequential part executed on the CPU, host,
mainly performing memory allocation and kernel calls, and in
a parallel part called kernel and executed on the GPU, device.
This structure requires the presence, inside the program, of
instructions that are sequentially executed on the host and
interspersed with calls to the kernel that allow us to carry
out entire parts of the program in parallel, on the device, as
is shown in figure 2.
        </p>
        <p>Kernel is the model of parallel execution of the code in
a device and it is defined as a grid divided in to a certain
number of blocks to which it is assigned a multi-processor
for each. Inside each block there is a number of fundamental
computational units defined as thread.</p>
        <p>Kernel, or grid, are sequentially executed between them
while blocks and threads are executed in parallel by adopting
a SIMT data-parallel model. Each of these thread belongs to
a single block and is uniquely identified within the kernel by
assigning it an index. In this manner the memory addressing
will be simplyfied especially in the case of processing
multidimensional data.</p>
        <p>In each of the blocks the kernel also has a shared memory
accessible only to the threads of the same block. The logical
subdivision of a kernel in grid and blocks is a crucial aspect in
a code in CUDA for obtaining the parallelization of code. The
organization and management of the internal threads allows the
implementation of a more efficient code.</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>IV. PRESENTATION OF THE ALGORITHM</title>
      <p>The algorithm developed in this work executes the
convolution operation between an input matrix A and some
preestablished kernels generating an output matrix A~ given by
the linear combination of results obtained using this formula
A =) A~ =
(k1</p>
      <p>A) + (k2</p>
      <p>A) +</p>
      <p>A
(4)</p>
      <p>While this operation is executed, we want to generate the
best parallelized code for the purpose of improving its
performances compared to the serial code version. The algorithm
shown can be summed up in three basic steps:
1) acquisition of input data matrix;
2) convolution of the input matrix with pre-established
kernels;
3) linear combination of the results.</p>
      <p>Obviously, each of these steps is performed by both the
sequential version of the code and then the parallel one.
The following will detail the basic steps previously exposed
focusing our attention on the parallel algorithm.</p>
      <sec id="sec-3-1">
        <title>A. Parallel algorithm solution</title>
        <p>The parallel solution of the algorithm starts in a host by
means of code that acquires the input and takes data from
a text file in ASCII code and store it in an array on shared
memory. Instead of a 2D array for data, complex to manage,
we have used a single dimensional array where the rows of
the input matrix are reported one after the other, then data are
reconstructed by an index. In this way the data will be transfer
from host to GPU with the standard function cudaMemcpy().
After a given number of threads and having organized the
blocks, the call to kernel is performed, in order to do parallel
computations.</p>
        <p>Inside the kernel it is assigned a thread to any given input so
that we can entrust the execution of the code to a set of parallel
threads arranged in blocks and indexed using the following
formula:
id = threadIdx.x + (blockIdx.x*blockDim.x);</p>
        <p>To each thread will be assigned a position in the input
array, and the thread will compute the convolution, in parallel
to other threads in each block. The input data acquired in
the form of array was necessary to implement a mechanism
of jump allowing us to move between the various locations
in the array in order to perform the products between the
elements of the kernel (in our case a simple 3x3 filter), and
the components located in the neighborhood of the source
location. This problem is solved using the radius of the kernel
defined as:</p>
        <p>Kernel_radius = (Kernel_order -1)/2;</p>
        <p>We can identify all the elements lying in the range of the
position of interest. Then kernel radius is subtracted to the
input array index and added a variable that increases cyclically
through a simple for loop. This let us multiply in parallel the
elements of the input with the kernel element lying in the
right position around the central element of the first row of
the kernel, as shown below:
for(i=0;i&lt;N;i++)
s[id]+=A[id-z+(i%3)+(i-(i%3)/3)]*k[i];</p>
        <p>Then the convolution algorithm performs the operation just
described for each row of the kernel:
for each row in kernel;
for each element in kernel row;</p>
        <p>Multiply the element to the
location of the Kernel with
the corresponding element
in the input data matrix.</p>
        <p>Sum results, save them on central position.</p>
        <p>This algorithm is executed as many times as the kernel
number we want to apply to our array of the input data. In our
specific case we chose to apply two kernels of ninth order with
filter function for the input matrix obtained by ASCII encoding
of a two-dimensional image. For a linear combination of the
results we have used, finally, a simple program, add, shown
below:
if(id&lt;((rig-1)*(col-1)))</p>
        <p>sum[id]=(a*s[id]+b*s2[id]+g*A[id]);
else return;</p>
        <p>The add program, called from the host and executed in the
device, sums the results of the two performed convolutions
loaded in arrays s and s2 with the values of the input data A.
Each of these addends is regulated by a default weight which
calibrates the effect of a convolution compareted to the other
in the final matrix indicated with sum array. An input image
having 256 colors has been used as input array, so to ensure
the output image had the same range of color variation, two if
statements impose this condition to the elements of sum array.</p>
        <p>In the following the results and performances of the
measures on the execution time in CUDA C and the C versions
are compared, hence assessing parallel and sequential versions
of the algorithm.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>V. EXPERIMENTAL RESULTS</title>
      <p>A comparison of the execution time using the function clock
belonging library time:h has been performed to the algorithm
in the sequential and parallel versions. The execution time
measures the time interval between the start and the end
time. Matrices of various sizes were used as input data in
order to compute the efficiency of the two implementations
when varying the amount of input data. Such matrices are
matrices representing images, coming from a text file in ASCII
code.</p>
      <p>The sequential algorithm for processing data runs on a AMD
i686 Dual-Core processor with up to 1GHz clock speed, while
for the GPU algorithm we have used a NVIDIA GeForce GTX
480 with 480 CUDA cores and 1536 MB GDDR5 video RAM
with CUDA 4.2. We developed our GPU code using NVIDIA
CUDA API while the CPU code is compiled under nvcc. The
GPU results are compared with the CPU results under Linux.
For our simulations we used a subdivision of kernel in blocks
of 440 threads by applying filters of order 9.</p>
      <p>Table I shows the sizes of the matrices used in data input
and averages, calculated on 20 samples, the execution times
of the sequential and parallel versions.</p>
      <p>Note that the execution time of the algorithm on the
GPU includes the transfer times of data (HostToDevice and
DeviceToHost) and the kernel running time. The experimental
results are represented in Table I and Figure 3.
105
106
107</p>
      <p>108
dimension matrix</p>
      <p>Figure 3 shows the execution times, sequential and parallel,
where the parallel code is faster. The result of this comparison
shows that the parallel code is more efficient. The comparison
between parallel and sequential version has been calculated
as the difference between the Sequential Execution T ime
e il P arallel Execution T ime, and has been reported using
a histogram in which the parallel code presents a significant
performance, while increasing the size of the input image,
hence more benefits in the use of a parallel CUDA architecture
than the typical CPU.</p>
      <p>Figure 4 shows the trend of the difference between the
Sequential Execution T ime and the P arallel Execution
T ime. The trend of this curve is exponential, observing
the parallel version it has an execution time smaller than
the sequential version, with a greater efficiency and better
performances, while increasing the amount of data input. The
more calculations the more benefits are gained from CUDA
parallelism.
data array, have led to the results shown in Table II and plotted
in Figure 6.</p>
      <p>To test the validity of the results, we were carried out
other tests based on the execution of iterated code in order
to simulate the processing of a set of images of equal size,
then measuring the Execution T ime of the whole process.
The results of these tests are shown in Figure 5.</p>
      <p>20
40
60
80</p>
      <p>100</p>
      <p>N umber of Iterations</p>
      <p>The advantages of the use of CUDA architecture are directly
proportional to the increase in computation. The same tests
were performed using a computing architecture more complex
and powerful in order to see if an increase in hardware
performance could lead to different results. Such tests were
performed by loading the source files on a server equipped
with Intel Xenon E5- 2630 with 6 cores 2.6 GHz clock and
RAM 48 GB, NVIDIA Tesla K10 with 2x1536 Cuda cores
and 8 GB GDDR5 video RAM. The two versions of the
algorithm, sequential and parallel, varying the size of the input
4096x4096
8192x8192
9000x9000</p>
      <p>The numbers give the result of an average of 10 samples of
the running times. The results obtained reveal experimentally
that by increasing CPU hardware performance and for images
having smaller sizes, the sequential version is faster than
its parallel version. This is possibly due to CUDA cores of
common GeForce having a low clock speed, determing slower
performances for a few calculations. On the other hand, the
performance of the parallel code is better than the serial
version for the larger processed input array. The tests based
on the execution of iterated code produce the results shown in
Figure 7.</p>
      <p>Tests run on the server estimate the trend when increasing
the amount of input data. A better hardware has obtained better
performance for both versions of the algorithm, producing
however, a difference depending on the size of the input
data array. In fact, the calculation contained in the algorithm
running on the terminal using the GeForce GTX 480 has a
better speedup over the sequential version on CPU. As soon
as the need grows, it is always better the computational
performance with a parallel version. Assuming that the matrices
are 9000x9000, the Tesla K10 has a speedup almost 140x
with respect to the GeForce GTX 480. So the processing
on GPU cards is most often preferable than the computaion
on the CPU, the choice of the GPU itself must be weighted
on the basis of the knowledge of the computational power
needed. The strategy of parallelization brings more efficient
algorithms.</p>
    </sec>
    <sec id="sec-5">
      <title>VI. RELATED WORKS</title>
      <p>
        In recent years the field of GPGPU has aroused great
interest inspiring many research works in order to include
the best strategies that make it possible to exploit the full
potential of the structure of parallel computing and the CUDA
parallel programming model. In this regard it is possible to
see the work [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] aimed to investigate the GPU architecture
and advantages/disadvantages of the CUDA model. Although
the core API for programming graphics cards remain, for
the moment, OpenGL [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] and DirectX [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], the latter is less
prone to general purpose programming. To overcome this
lack CUDA has emerged [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], which though limited only to
NVIDIA graphics cards makes programming easier for general
purpose [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ].
      </p>
      <p>
        A lot of work has been performed for applying the CUDA
model for the image processing field. A paper useful to
understand how to perform image convolution, essential for
image processing, has been produced by Podlozhnyuk [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ], and
other useful for understanding more complex issues are those
produced by Park [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] and Castan˜ o [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ].
      </p>
      <p>
        Finally, the work relating to the performance and application
of parallel programming model is inherent in a huge range of
topics, such as e.g. the work in [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ]–[
        <xref ref-type="bibr" rid="ref17">17</xref>
        ]. In [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ], a parallel
solution for GPU Integrated generation systems (IGSs) has
been achieved, whereas in [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ], it has been described the
realization of a system of distributed and parallel processing
for the identification of events.
      </p>
    </sec>
    <sec id="sec-6">
      <title>VII. CONCLUSION</title>
      <p>This paper has presented an algorithm for the application
of a linear combination of digital filters implemented with
parallel programming for image processing on CUDA
compatible GPUs, and has compared with its sequential version
on the CPU. The solution presented has the aim to exploit
the programming model CUDA parallel, more efficient than
a sequential processing code with an appropriate management
and organization of blocks and thread.</p>
      <p>The tests have shown that the implementation of the parallel
code on the GPU increases in speed compared to serial
implementation of CPU. In general the speed is not less than
40x with peaks higher than 90x. This increase in speed is
also evident with the increase of computational power required
in processing. The execution time of the parallel code also
counts the time of data transfer between the host device and
the penalization of some performance of parallel code which
remains higher than the serial version. It is possible to improve
the result by a more detailed analysis of the strategies of
parallelization in order to manage the computing resources
provided by the GPU architectures.</p>
      <p>For the realization of the C code we have used CUDA
programming interface which has made it easier the GPGPU
approach, and allowing us to exploit very effectively the
potential hidden in GPU computing. The algorithm presented in this
article, though designed for the application of filters on digital
images, is well suited for many applications including mobile
ones that are outside the scope of image processing such
as signal analysis or application of spectral masks sampled
signals.</p>
      <p>Another possible application for our algorithm is that in
the industrial field for the detections of the boundary in an
image useful for the detection of objects. In this case you could
apply the Sobel operator by simply modifying the matrix of
the filter. With this work we have shown only a small part
the great potential of the GPU, which could gain popularity in
the scientific community thanks to the computing power and
to its easy availability, which makes GPGPU one of the best
choices in high performance computing.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>M.</given-names>
            <surname>Woo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Neider</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Davis</surname>
          </string-name>
          , and
          <string-name>
            <given-names>D.</given-names>
            <surname>Shreiner</surname>
          </string-name>
          ,
          <article-title>OpenGL programming guide: the official guide to learning OpenGL, version 1.2</article-title>
          . AddisonWesley Longman Publishing Co., Inc.,
          <year>1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>K.</given-names>
            <surname>Gray</surname>
          </string-name>
          ,
          <article-title>Microsoft DirectX 9 programmable graphics pipeline</article-title>
          . Microsoft Press,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>C.</given-names>
            <surname>Nvidia</surname>
          </string-name>
          , “
          <article-title>Nvidia cuda c programming guide</article-title>
          ,
          <source>” NVIDIA Corporation</source>
          , vol.
          <volume>120</volume>
          , p.
          <fpage>18</fpage>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>J.</given-names>
            <surname>Ghorpade</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Parande</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Kulkarni</surname>
          </string-name>
          ,
          <article-title>and</article-title>
          <string-name>
            <given-names>A.</given-names>
            <surname>Bawaskar</surname>
          </string-name>
          , “
          <article-title>Gpgpu processing in cuda architecture</article-title>
          ,
          <source>” arXiv preprint arXiv:1202.4347</source>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>J.</given-names>
            <surname>Sanders</surname>
          </string-name>
          and
          <string-name>
            <surname>E. Kandrot,</surname>
          </string-name>
          <article-title>CUDA by example: an introduction to general-purpose GPU programming</article-title>
          .
          <source>Addison-Wesley Professional</source>
          ,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>H.</given-names>
            <surname>Nguyen</surname>
          </string-name>
          ,
          <article-title>Gpu gems 3</article-title>
          .
          <string-name>
            <surname>Addison-Wesley Professional</surname>
          </string-name>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>V.</given-names>
            <surname>Podlozhnyuk</surname>
          </string-name>
          , “
          <article-title>Image convolution with cuda,” NVIDIA Corporation white paper</article-title>
          ,
          <source>June</source>
          , vol.
          <year>2097</year>
          , no.
          <issue>3</issue>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>I. K.</given-names>
            <surname>Park</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Singhal</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. H.</given-names>
            <surname>Lee</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Cho</surname>
          </string-name>
          , and
          <string-name>
            <given-names>C. W.</given-names>
            <surname>Kim</surname>
          </string-name>
          , “
          <article-title>Design and performance evaluation of image processing algorithms on gpus,” Parallel and Distributed Systems</article-title>
          , IEEE Transactions on, vol.
          <volume>22</volume>
          , no.
          <issue>1</issue>
          , pp.
          <fpage>91</fpage>
          -
          <lpage>104</lpage>
          ,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <surname>D. Casta</surname>
          </string-name>
          <article-title>n˜o-D´ıez</article-title>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Moser</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Schoenegger</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Pruggnaller</surname>
          </string-name>
          ,
          <article-title>and</article-title>
          <string-name>
            <given-names>A. S.</given-names>
            <surname>Frangakis</surname>
          </string-name>
          , “
          <article-title>Performance evaluation of image processing algorithms on the gpu</article-title>
          ,
          <source>” Journal of structural biology</source>
          , vol.
          <volume>164</volume>
          , no.
          <issue>1</issue>
          , pp.
          <fpage>153</fpage>
          -
          <lpage>160</lpage>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <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="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>R.</given-names>
            <surname>Giunta</surname>
          </string-name>
          , G. Pappalardo, and E. Tramontana, “
          <article-title>Aspects and annotations for controlling the roles application classes play for design patterns</article-title>
          ,”
          <source>in Proceedings of IEEE Asia Pacific Software Engineering Conference (APSEC)</source>
          ,
          <source>Ho Chi Minh</source>
          , Vietnam,
          <year>December 2011</year>
          , pp.
          <fpage>306</fpage>
          -
          <lpage>314</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>G.</given-names>
            <surname>Pappalardo</surname>
          </string-name>
          and E. Tramontana, “
          <article-title>Suggesting extract class refactoring opportunities by measuring strength of method interactions</article-title>
          ,”
          <source>in Proceedings of Asia Pacific Software Engineering Conference (APSEC)</source>
          . Bangkok, Thailand: IEEE,
          <year>December 2013</year>
          , pp.
          <fpage>105</fpage>
          -
          <lpage>110</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <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="ref14">
        <mixed-citation>
          [14]
          <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="ref15">
        <mixed-citation>
          [15]
          <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="ref16">
        <mixed-citation>
          [16]
          <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="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>C.</given-names>
            <surname>Napoli</surname>
          </string-name>
          , G. Pappalardo, and E. Tramontana, “
          <article-title>Improving files availability for bittorrent using a diffusion model</article-title>
          ,”
          <source>in Proceedings of IEEE International WETICE Conference</source>
          , Parma, Italy,
          <year>June 2014</year>
          , pp.
          <fpage>191</fpage>
          -
          <lpage>196</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <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="ref19">
        <mixed-citation>
          [19]
          <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
          <string-name>
            <surname>G.</surname>
          </string-name>
          <article-title>Zappala`, “A clouddistributed gpu architecture for pattern identification in segmented detectors big-data surveys,” The Computer Journal</article-title>
          , p.
          <fpage>bxu147</fpage>
          ,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>