<!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>Simulating Peer to Peer Networks Using GPU High Perfomance Support</article-title>
      </title-group>
      <contrib-group>
        <aff id="aff0">
          <label>0</label>
          <institution>Giovanni Susinni, Giuseppe Greco University of Catania Viale A. Doria 6</institution>
          ,
          <addr-line>95125 Catania</addr-line>
          ,
          <country country="IT">Italy</country>
        </aff>
      </contrib-group>
      <fpage>16</fpage>
      <lpage>22</lpage>
      <abstract>
        <p>-Peer-to-Peer networks are used by many applications to share resources between nodes. We have proposed a parallel version of a simulator for some aspects of a peerto-peer network performing file sharing. Being this analysis computationally expensive for contemporary CPUs, the computing power of Graphic Processing Units allows a great gain in performance during simulation. Specifically, we have used the NVIDIA Computer Unified Device Architecture programming model to simulate the behaviour of a peer-to-peer network performing data transfers, and compute communication delays as well as data updates. Index Terms-P2P networks, GPU computing, CUDA, Performance, Parallel</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>I. INTRODUCTION</title>
      <p>
        In the last few decades, the Peer-To-Peer (P2P) technology
and its many variants, such as BitTorrent, have become popular
Internet applications due to their scalability and robustness [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ],
[
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. Today, the number of devices connected to the Internet
is increasing fast. Therefore, it is important to analyze the
interactions between peers (or nodes hereafter) and some file
sharing issues. The potential huge number of devices in a P2P
network may pose a perfomance problem during the
simulation of data transfers, and on the other hand simulating the
behaviour of novel models for selecting source and destination
peers is a current research field.
      </p>
      <p>A sequential simulation of the behaviour of a P2P network
is viable for a small amount of data and nodes that transfer
data: the results can be achieved in a relatively short time.
However, for an extensive analysis, the sequential approach is
not ideal for computations, having to cope with a lot of data
and transfer nodes. One of the possible solutions is to have
a parallel approach using a Graphic Processing Unit (GPU)
architecture. The multi-core architecture of a GPU, organized
in threads, blocks and grids, shows its great potential for the
said simulation thanks to the lower computation time than the
sequential approach, particularly when increasing the number
of nodes and data transfer (i.e. these are often file fragments).
In this paper, we propose to use GPUs to perform a simulation
of a P2P network that is closer to the real case. To this end,
our work focuses on the implementation, and optimization of
exponentiation operations on GPUs.</p>
      <p>The contribution of this work is threefold: (i) first, we have
developed and analyzed a sequential algorithm, implemented
Copyright c 2016 held by the authors.
in C language, that simulates some aspects of a P2P network;
(ii) second, we have implemented a correspondent GPU
algorithm using the capability of a GPU architecture through
the Computer Unified Device Architecture (CUDA) C/C++
language; (iii) finally, we have compared the results between
the two approaches.</p>
      <p>Our paper is organized as follows: Section 2 provides an
overview of the P2P model, while Section 3 provides an
overview of the CUDA architecture. Section 4 describes the
simulation approaches for the sequential and GPU parallel
versions. Section 5 shows the experimental results and the
comparison of execution measured times. In Section 6 we
analyze the related work, and finally Section 7 provides
conclusions and possible future work.</p>
    </sec>
    <sec id="sec-2">
      <title>II. BACKGROUND ON P2P NETWORKS An effective network architecture should exhibit the following features [3]: Provably good perfomance;</title>
      <p>Low overhead;
Quality of Service (QoS) of peers;
Autonomy;</p>
      <p>Robustness.</p>
      <p>
        Over time, the more traditional client-server model based on
a centralized approach has become a decentralized architecture
for P2P networks [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. Indeed the continuos growth of users
and bandwidth has been accompanied by increasing requests
of a diversified wealth of applications, with a remarkable effort
in terms of resources to be used to achieve these challenges.
      </p>
      <sec id="sec-2-1">
        <title>A. Definition and Properties of P2P Networks</title>
        <p>
          A distributed network architecture is a P2P network if its
participants share a part of their own hardware resources, as
processing power, network link capability, storage capacity [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ].
P2P networks are organized as overlay topologies on top of
the underlying physical network and are formed by peers
connecting to each other in either a structured or unstructured
manner [
          <xref ref-type="bibr" rid="ref6">6</xref>
          ].
        </p>
        <p>
          The P2P network must have the following properties [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ]:
Resource sharing: each peer contributes with system
resources to the operation of the P2P system. Ideally, this
resource sharing is proportional to the peers use of the
P2P system, but many systems suffer from the free rider
problem.
Networked : all nodes are interconnected with other nodes
in the P2P system, and the full set of nodes are members
of a connected graph. When the graph is no longer
connected, the overlay network becomes partitioned.
Decentralization : the behavior of the P2P system is
determined by the collective actions of peer nodes, and there
is no central control point. Some systems however secure
the P2P system using a central login server. The ability to
manage the overlay [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ] and monetize its operation may
require centralized elements.
        </p>
        <p>Symmetry : nodes assume equal roles in the operation of
the P2P system. In many designs this property is relaxed
by the use of special peer roles such as super peers or
relay peers.</p>
        <p>Autonomy : participation of the peer in the P2P system is
determined locally, and there is no single administrative
context for the P2P system.</p>
        <p>Scalable : this is a pre-requisite of operating P2P systems
with millions of simultaneous nodes, and means that the
resources used at each peer exhibit a growth rate as a
function of overlay size that is less than linear. It also
means that the response time does not grow more than
linearly as a function of overlay size.</p>
        <p>
          Self-organization : the organization of the P2P system
increases over time using local knowledge and local
operations at each peer, and no peer dominates the system.
Biskupski, Dowling, and Sacha [
          <xref ref-type="bibr" rid="ref8">8</xref>
          ] argue that existing
P2P systems do not exhibit most of the properties of
selforganization.
        </p>
        <p>Stability : within a maximum variability rate, the P2P
system should be stable, i.e., it should maintain its
connected graph and be able to route deterministically
within a practical hop-count bounds.</p>
      </sec>
      <sec id="sec-2-2">
        <title>B. System model</title>
        <p>Figure 1 provides a conceptual representation of the P2P
overlay topology. Since P2P networks are fault-tolerant, not
susceptible to single-point-of-failure, P2P overlay topologies
are multiply-connected. Broadly, there are three classes of P2P
systems:</p>
        <p>Pure P2P Systems, in which 2 nodes/devices interact
with each other without requiring the intervention of any
central server or service.</p>
        <p>Hybrid P2P Systems, in which peers rely partially on a
central server to provide certain services, although the
interaction between peers still takes place independently.
Federated P2P Systems, in which peer interactions take
place inside pre-defined domains, such as within an
organization.</p>
        <p>In this classification we have an increasing degree of
centralization.</p>
        <p>
          Moreover, P2P systems can either be: (i) structured [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ],
where the overlay graph is well structured and a mathematical
scheme (e.g. Distributed Hash Tables) is applied to make sure
that g nodes are added in a manner which maintains the
structure; or (ii) unstructured, where the overlay is a random
graph type and new nodes are added to the network in an
unpredictable manner. Structured P2P Systems are formed on
the basis of node-identifiers, guaranteeing information retrieval
in bounded time for simple queries and are self-organizing
in the face of failures, whereas unstructured P2P systems
can support large complex queries, but do not guarantee
information retrieval in bounded time with not so efficient
self-organization capabilities.
        </p>
        <p>In this paper we consider a Structured and Pure P2P
network.</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>III. CUDA</title>
      <p>CUDA is a parallel computing platform and programming
model invented by NVIDIA. It enables an increase in
computing performance by harnessing the power of GPUs. With
millions of CUDA-enabled GPUs sold to date, software
developers, scientists and researchers are finding broad-ranging uses
for GPU computing with CUDA. Here are a few examples:
(i) identify hidden plaque in arteries (heart attacks are the
leading cause of death worldwide); (ii) analyze air traffic
flow, the National Airspace System manages the nationwide
coordination of air traffic flow. Computer models help identify
new ways to alleviate congestion and keep airplane traffic
moving efficiently. Using the computational power of GPUs,
a team at NASA obtained a large performance gain, reducing
analysis time from ten minutes to three seconds. The speed-up
is the result of the parallel GPU architecture, which however
require developers to port compute-intensive portions of the
application to the GPU using the CUDA Toolkit.</p>
      <p>CUDA works, conceptually, according to the architectural
model shown in Figure 2. The graphic chip, in the CUDA
model, is constituted by a series of multiprocessors, called
Streaming MultiProcessor. The number of multiprocessors
depends on the characteristics specific to the class and
performance of each GPU. Each processor can perform a
mathematical operation (sum, multiplication, subtraction, etc.) on
integers or floating point single-precision numbers (32-bit). In
each processor there are also two multi-unit. Special functions
are given (that perform transcendent as sine, cosine, reverse
etc.) and, only for chips based on GT200 architecture, a single
unit in floating-point double-precision (64-bit) is available. In
a multiprocessor there is a shared memory accessible by all
streaming processors, cache for instructions. The other types
of memory, as shown in the picture, are accessible by each
processor and represent the main repository for large amounts
of data to be saved in the GPU. In the following we analyze
the parts of code in the GPU using the libraries provided by
NVIDIA.</p>
      <sec id="sec-3-1">
        <title>A. Kernel and hierarchy of threads</title>
        <p>CUDA programming indicates as a kernel function a portion
of code that runs in parallel, N times.</p>
        <p>The individual run of the kernel is performed by a simple
unit called thread. CUDA threads are simpler than CPU
threads, so the code is considered to be faster. To determine
the number of threads that run a single kernel there is a logical
organization and a two-level hierarchy. In the top level they
depend on the size of a grid. The grid is a two-dimensional
level comprising blocks that in turn have a three-dimensional
structure that is specified by the number of threads.</p>
        <p>Once a kernel is launched it receives two structures
specifying the additional parameters for the size of grid and blocks.
This listing shows the syntax to launch a kernel function
named kernelfunction().
dim3 blocksize(x, y, z);
dim3 gridsize (x, y);
kernelfunction &lt;&lt;&lt;gridsize, blocksize&gt;&gt;&gt;(parameters);
Listing 1. Kernel syntax</p>
        <p>The logical division in grid and blocks is a crucial aspect
in the design and code, in CUDA. In addition to the limits
imposed by the hardware, there are other precautions that
should be taken into account to make code more efficient.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>IV. P2P SIMULATION</title>
      <p>A P2P-based application is a distributed application that
provides tasks or work loads to peers, which have the same
privileges. Peers give a portion of their resources available to
other network participants, they need not a central coordination
server. A P2P system can be used in many application
domains, e.g. in social contexts, like sharing files and resources.
Today, given the large diffusion of P2P networks we need to
simulate and assess the performance of novel transfer
protocols, in terms of the computation time and how many nodes
are involved into the communication. Generally, according to
the increase of nodes and files, the computation time increases.</p>
      <sec id="sec-4-1">
        <title>A. Issues of P2P Network Simulation</title>
        <p>In our simulation, we suppose that each peer communicates
with others. Each peer has some file fragments and shares
them, while at the same time receives the missing parts of
some files. The peers and file fragments are represented in an
array with N peers and M fragments, while the latency times of
communication between nodes (namely ping) are in an array
N*M, named p.</p>
        <p>On top of figure 3 it is shown the initial state of the peers,
in terms of availability of file fragments. We can see that a
single node has some file fragments: 0 represent the absent
state, while the 1 represent the available state. On the bottom
it is shown the final state of the peers, after the fragments have
been transferred between peers.</p>
      </sec>
      <sec id="sec-4-2">
        <title>B. Sequential simulation</title>
        <p>The first approach is the sequential one. Listing 2 shows the
algorithm in C language, with the selection of peers that will
receive the file fragments and update their state (from absent
to available). Constant N is the number of peers, and M is the
number of fragments. Array rics contains the destination
peer indexes. There are MAXINS destination peers for a
source peer, which are sequentially counted starting from the
index of the source peer.</p>
        <p>The update of file fragments consists of comparing for each
source peer, having index tidx, its fragments availability, as
determined by array f, with the fragments availability of a
peer having index rics[i]. If the difference between source
and destination is equal to zero, there will not be an update,
else the source will send missing fragments to the destination
peer. To approximate the real case, in the simulation we use
the latency times for each fragment transfer, both in download
and in upload. In this analysis we assume that the transfer is
ideal, i.e. no loss of packets occurs. The simulation has to
consider each source peer, file fragment and destination peer,
therefore we have three nested for cicles.</p>
        <p>This approach is viable for a few peers and fragments, i.e.
the results can be obtained in a small amount of time. However,
the sequential approach is not appropriate for many peers and
fragments, the solution is then a parallel approach using a GPU
architecture.
void chooseNode(int tidx, int *rics){
for (int i=0; i &lt; MAXINS; i++)</p>
        <p>rics[i] = ((tidx + i + 1) % N);
}
int checkFr(int *f, int tidx, int *rics, int tidy, int i){
if (f[tidx*N + tidy] - f[rics[i]*N + tidy]) return 1;
return 0;
}
}</p>
        <p>}
void selection(float *p, int *f) {
int rics[MAXINS];
unsigned long tidx;
unsigned long tidy;
for (tidx=0; tidx &lt;= N; tidx++) {
chooseNode(tidx, rics);
for (tidy=0; tidy &lt;= M; tidy++)
for (int i=0; i &lt; MAXINS; i++)
if (checkFr(f, tidx, rics, tidy, i))
if (p[tidx*N + tidy] &lt;= tstep*(tidx*N + tidy))</p>
        <p>f[rics[i]*N + tidy] = 1;</p>
        <p>Listing 2. Sequential algorithm updating fragments availability</p>
      </sec>
      <sec id="sec-4-3">
        <title>C. GPU Simulation</title>
        <p>
          The multi-core architecture of GPU, organized in threads,
blocks and grids [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ]–[
          <xref ref-type="bibr" rid="ref15">15</xref>
          ], shows its great potential by
achieving a lower execution time than the sequential approach,
particularly with the increase of nodes and file fragments.
CUDA is essentially C/C++ language with a few extensions
that allow one to execute functions on the GPU using many
threads in parallel [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ]. In CUDA, the host refers to the CPU
and its memory, while the device refers to the GPU and its
memory. Code that runs on the host can manage memory on
both the host and device, and also launches kernels which
are functions executed on the device. Kernels are executed
by many GPU threads in parallel [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ], [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ]. The use of
tokens BlockIdx.x, ThreadIdx.x, BlockDim.x allows us to take
advantage of indexes of threads and blocks [
          <xref ref-type="bibr" rid="ref14">14</xref>
          ].
        </p>
        <p>Indeed the kernel is executed in parallel by threads, which
are organized in blocks, with a 3D structure, and grids with
a 2D structure. For simulating a P2P network we use a 2D
array, with ThreadIdx.x indicating the nodes and ThreadIdx.y
indicating the fragments. As in the sequential algorithm, we
check on each peer whether fragments are available. We use
the device function checkFr() for this, whose body is the same
as the corresponding function in listing 2. If the fragment is
avalaible, the state of the peer can be updated in due time. This
global function runs in parallel in each GPU’s core thanks to
indexes tidx and tidy.
__global__ void selection(float *p, int *f){
int rics[MAXINS];
unsigned long tidx = blockIdx.x*blockDim.x + threadIdx.x;
unsigned long tidy = blockIdx.y*blockDim.y + threadIdx.y;
}
chooseNode(tidx, rics);
for (int i = 0; i &lt; MAXINS; i++)
if (checkFr(f, tidx, rics, tidy, i))
if (p[tidx*N + tidy] &lt;= tstep*(tidx*N + tidy))
f[rics[i]*N + tidy] = 1;</p>
        <sec id="sec-4-3-1">
          <title>Listing 3. Parallel algorithm in CUDA C</title>
          <p>The keyword global indicates a kernel function that runs on
the device and is called from host code, and runs in multiple
instances on several blocks and threads. Listing 3 shows the
kernel function for our simulation.
cudaMalloc((void**)&amp;dev_p,N*M*sizeof(float));
cudaMalloc((void**)&amp;dev_f,N*M*sizeof(int));
cudaMalloc((void**)&amp;dev_dt,N*M*sizeof(float));</p>
        </sec>
        <sec id="sec-4-3-2">
          <title>Listing 4. Library function cudaMalloc()</title>
          <p>cudaMemcpy(dev_p,ping,N*M*sizeof(float),
cudaMemcpyHostToDevice);
cudaMemcpy(output,dev_f,N*M*sizeof(float),
cudaMemcpyDeviceToHost);</p>
        </sec>
        <sec id="sec-4-3-3">
          <title>Listing 5. Library function cudaMemcpy()</title>
          <p>
            Library function cudaMalloc() allocates a given size of
bytes of linear memory on the device and returns *devPtr, a
pointer to the allocated memory (see Listing 4). The allocated
memory is suitably aligned for any kind of variable. Function
cudaMalloc() returns a cudaErrorMemoryAllocation in case of
failure [
            <xref ref-type="bibr" rid="ref17">17</xref>
            ]. Therefore, we can allocate the necessary space to
transfer the data from CPU to GPU. In CUDA C/C++ library
function cudaMemcpy() allows us to transfer data from host
to device and vice versa [
            <xref ref-type="bibr" rid="ref17">17</xref>
            ] (see Listing 6).
          </p>
          <p>In function main() we invoke our kernel function selection()
(see Listing 6), which allows to transfer the data from host to
device. This performs the GPU computation, and then there is
a cudaMemcpy() function call, copying from device to host
the data indicating updated nodes.
500</p>
          <p>The input arrays of ping times, node and their fragment
availability are initially loaded from files. Every time-step the
kernel is called and the output array is updated according to
the latency time.</p>
          <p>V. RESULTS FOR THE SEQUENTIAL AND GPU VERSIONS
From the analysis of sequential and the GPU execution
times, we can see that the result is very different with a
high number of nodes and file fragments. With a small
number of nodes, the sequential computation is faster than
the parallel one, because the allocation in memory, that the
CUDA compiler does through the GPU’s cores, is an expensive
process, but this impact is smaller with the increase of nodes
and data. The execution time has been obtained from the
average of ten measures.</p>
          <p>
            The sequential algorithm for processing data is executed on
a AMD(R) Athlon 64 X2 processor with up to 2.9 GHz clock
speed and 4GB of DDR3L-1333 RAM, while for the GPU
algorithm we used a Nvidia(R) GeForce(TM) GTX 480 with
480 CUDA cores and 1536 MB GDRR5 video RAM [
            <xref ref-type="bibr" rid="ref18">18</xref>
            ].
          </p>
          <p>Figure 4, 5 and 6 show the execution times for the
sequential (CPU) and parallel (GPU) versions, when considering
a number of destination nodes equal to 1/25, 1/10 and 1/5,
respectively, of the total nodes N . Indeed with a low N the
perfomance of the CPU version are better because for the
execution of the GPU version the memory allocation from
host to device is a costly operation.</p>
          <p>Figure 7 shows the comparison of three simulations, to
appreciate the increasing difference in terms of execution time
between the two approaches, with a strong dependence on
the number of destination hosts MAXINS. Table I shows the
actual measured times for all considered scenarios.
e 100
m
i
t
n
o
i
t
u
c
ex 50
E</p>
          <p>0
e 100
m
i
t
n
o
i
t
u
c
ex 50
E
0</p>
          <p>Fig. 6. GPU and CPU execution time with MAXINS=1/5 of total nodes
Figure 8 shows the ratio between execution times on CPU
and GPU when varying the numer of MAXINS. The highest
ratio is when the number of destination peers is highest. This
indicates that the parallel version performs much better than
the sequential version. Figure 9 provides the execution times
on CPU and GPU with 50 destination nodes, when varying
the number of peers. GPU performances are alway better than
CPU performances, and when the number of peers is the
highest also is the gain by resorting to GPU. Table II shows
the actual measured times for the latter scenarios considered.</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>VI. RELATED WORKS</title>
      <p>
        Nowadays, computational resources are available on
demand and tools are needed to coordinate their use [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ]–[
        <xref ref-type="bibr" rid="ref21">21</xref>
        ].
Several works aim at proposing ways to make development
easier in such complex systems [
        <xref ref-type="bibr" rid="ref22">22</xref>
        ]–[
        <xref ref-type="bibr" rid="ref27">27</xref>
        ]. Several studies have
analysed the behaviour of P2P networks from the point of view
= GP UMaxins = N=25
= CP UMaxins = N=25
= GP UMaxins = N=10
= CP UMaxins = N=10
= GP UMaxins = N=5
= CP UMaxins = N=5
= M axins = N=25
= M axins = N=10
= M axins = N=5
100x100
250x250
20
15
10
5
0
15
10
5
0
      </p>
      <p>Fig. 9. GPU and CPU execution times with MAXINS=50 nodes
of shared files, i.e. how to have users contribute with contents
that can be uploaded by other users, respecting the latency
time in download and upload.</p>
      <p>
        Some works have studied the problem of computation in
P2P networks using the GPU approach vs the CPU approach.
In [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] authors analyze that heterogeneous nodes can have
multiple types of computing elements, and the performance
and characteristics of each computing element can be very
different. For the simulation of the shared file fragments,
we assume an ideal case without giving priority to any file
fragments. Instead in [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], [
        <xref ref-type="bibr" rid="ref28">28</xref>
        ], authors propose to apply a
mathematical model for the diffusion of fragments on a P2P
in order to take into account both the effects of peer distances
and the changing availability of peers over time.
      </p>
      <p>
        In this paper we developed two approaches: the first one
is the sequential one, which we have implemented as C
language. The second is the parallel approach, which uses
CUDA C/C++ language. In [
        <xref ref-type="bibr" rid="ref29">29</xref>
        ] some authors present FLAP, a
tool to generate CUDA parallel code from sequential C code.
This tool uses patterns to generate parallel CUDA code.
      </p>
      <p>
        In our paper an important focus is the performance in terms
of time, with a comparison between GPU and CPU
computation. In [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] the authors proposed three parallel algorithms that
maximize the parallelism of processes, i.e., the power of GPUs
is fully utilized. With their implementation of the algorithms,
they are able to achieve up to 12 times the speedup over the
highly optimized CPU counterpart, using the NVIDIA GPU
and the CUDA programming model.
      </p>
    </sec>
    <sec id="sec-6">
      <title>VII. CONCLUSION</title>
      <p>We have presented a sequential and a parallel solution for
the simulation of a P2P network and tested them in an ideal
scenario, i.e. without collisions or missing data, and achieved
considerable perfomance gains by using parallelism. Indeed in
each simulated setting we appreciated that the GPU solution
has a lower execution time than the sequential one for updating
a peer state. This becomes more evident with the increase
of peers and fragments. Particularly, the perfomance of the
sequential approach is worst when increasing the number
of destination peers, having an exponential increase of the
execution time, versus the linear trend of a GPU solution.</p>
      <p>In the future we can improve the simulation by including
non-ideal effects as collisions, higher latency times in uploads
and downloads, and the transfer of larger data other than our
binary data.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>K.</given-names>
            <surname>Zhao</surname>
          </string-name>
          ,
          <string-name>
            <given-names>X.</given-names>
            <surname>Chu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Wang</surname>
          </string-name>
          , and
          <string-name>
            <given-names>Y.</given-names>
            <surname>Jiang</surname>
          </string-name>
          , “
          <article-title>Speeding Up Homomorpic Hashing Using GPUs Communications,</article-title>
          ”
          <source>in Proceedings of IEEE International Conference on Communications (ICC)</source>
          ,
          <year>2009</year>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>5</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <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="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>Y</given-names>
            <surname>.-K. R. Kwok</surname>
          </string-name>
          ,
          <string-name>
            <surname>Peer-</surname>
          </string-name>
          to-Peer Computing: Applications, Architecture, Protocols, and Challenges. CRC Press,
          <year>2011</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>R.</given-names>
            <surname>Steinmetz</surname>
          </string-name>
          and
          <string-name>
            <given-names>K.</given-names>
            <surname>Wehrle</surname>
          </string-name>
          ,
          <string-name>
            <surname>Peer-</surname>
          </string-name>
          to-
          <source>Peer Systems and Applications</source>
          , ser.
          <source>Information Systems and Applications</source>
          . Springer,
          <year>2005</year>
          , vol.
          <volume>2485</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>X.</given-names>
            <surname>Shen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Yu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Buford</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M.</given-names>
            <surname>Akan</surname>
          </string-name>
          , Handbook of Peer-to-Peer Networking. Springer,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>A.</given-names>
            <surname>Gupta</surname>
          </string-name>
          and
          <string-name>
            <given-names>L. K.</given-names>
            <surname>Awasthi</surname>
          </string-name>
          , “
          <article-title>Peer-To-Peer Networks and Computation: Current Trends and Future Perspectives,” Computing and Informatics</article-title>
          , vol.
          <volume>30</volume>
          , no.
          <issue>3</issue>
          , pp.
          <fpage>559</fpage>
          -
          <lpage>594</lpage>
          ,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>J.</given-names>
            <surname>Buford</surname>
          </string-name>
          , “
          <article-title>Management of peer-to-peer overlays</article-title>
          ,”
          <source>International Journal of Internet Protocol Technology</source>
          , vol.
          <volume>3</volume>
          , no.
          <issue>1</issue>
          , pp.
          <fpage>2</fpage>
          -
          <lpage>12</lpage>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>B.</given-names>
            <surname>Biskupski</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Dowling</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J.</given-names>
            <surname>Sacha</surname>
          </string-name>
          , “
          <article-title>Properties and mechanisms of self-organizing MANET and P2P systems</article-title>
          ,
          <source>” ACM Transactions on Autonomous and Adaptive Systems (TAAS)</source>
          , vol.
          <volume>2</volume>
          , no.
          <issue>1</issue>
          , p.
          <fpage>1</fpage>
          ,
          <year>2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>M.</given-names>
            <surname>Bawa</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B. F.</given-names>
            <surname>Cooper</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Crespo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Daswani</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Ganesan</surname>
          </string-name>
          , H. GarciaMolina, S. Kamvar,
          <string-name>
            <given-names>S.</given-names>
            <surname>Marti</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Schlosser</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Q.</given-names>
            <surname>Sun</surname>
          </string-name>
          et al.,
          <string-name>
            <surname>“</surname>
          </string-name>
          Peer-to-peer research at stanford,
          <source>” ACM SIGMOD Record</source>
          , vol.
          <volume>32</volume>
          , no.
          <issue>3</issue>
          , pp.
          <fpage>23</fpage>
          -
          <lpage>28</lpage>
          ,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>NVIDIA</given-names>
            <surname>CUDA</surname>
          </string-name>
          . [Online]. Available: http://developer.nvidia.com/object/ cuda.html
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>Compute</given-names>
            <surname>Unified Device Architecture: Programming Guide</surname>
          </string-name>
          , 2nd ed., jun
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>J. D.</given-names>
            <surname>Owens</surname>
          </string-name>
          , M. Houston,
          <string-name>
            <given-names>D.</given-names>
            <surname>Luebke</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Green</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J. E.</given-names>
            <surname>Stone</surname>
          </string-name>
          , and
          <string-name>
            <given-names>J. C.</given-names>
            <surname>Phillips</surname>
          </string-name>
          , “Gpu computing,”
          <source>in Proceedings of the IEEE</source>
          , vol.
          <volume>96</volume>
          , no.
          <issue>5</issue>
          ,
          <issue>2008</issue>
          , pp.
          <fpage>879</fpage>
          -
          <lpage>899</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>X.</given-names>
            <surname>Chu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Zhao</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M.</given-names>
            <surname>Wang</surname>
          </string-name>
          , “
          <article-title>Massively Parallel Network Coding on GPUs,”</article-title>
          <source>in Proceedings of IEEE International Performance, Computing and Communications Conference (IPCCC)</source>
          ,
          <year>2008</year>
          , pp.
          <fpage>144</fpage>
          -
          <lpage>151</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <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>
          .
          <string-name>
            <surname>Addison-Wesley Professional</surname>
          </string-name>
          ,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>S.</given-names>
            <surname>Cook</surname>
          </string-name>
          ,
          <article-title>CUDA Programming: A Developer's Guide to Parallel Computing With GPUs</article-title>
          . Morgan Kaufmann,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>S.</given-names>
            <surname>Ryoo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C. I.</given-names>
            <surname>Rodrigues</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S. S.</given-names>
            <surname>Baghsorkhi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S. S.</given-names>
            <surname>Stone</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D. B.</given-names>
            <surname>Kirk</surname>
          </string-name>
          , and W.-m. W. Hwu, “
          <article-title>Optimization principles and application performance evaluation of a multithreaded gpu using cuda,” in Proceedings of ACM SIGPLAN Symposium on Principles and practice of parallel programming</article-title>
          .
          <source>ACM</source>
          ,
          <year>2008</year>
          , pp.
          <fpage>73</fpage>
          -
          <lpage>82</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <surname>NVIDIA CUDA Library</surname>
          </string-name>
          <article-title>Documentation</article-title>
          . [Online]. Available: http://www.cs.cmu.edu/afs/cs/academic/class/15668-s11/www/ cuda-doc/html/index.html
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <article-title>NVIDIA GeForce GTX 480</article-title>
          . [Online]. Available: http://www.geforce. com/hardware/desktop-gpus/geforce-gtx-480/specifications
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>G.</given-names>
            <surname>Borowik</surname>
          </string-name>
          ,
          <string-name>
            <surname>M.</surname>
          </string-name>
          <article-title>Woz´niak, A</article-title>
          . Fornaia,
          <string-name>
            <given-names>R.</given-names>
            <surname>Giunta</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Napoli</surname>
          </string-name>
          , G. Pappalardo, and E. Tramontana, “
          <article-title>A software architecture assisting workflow executions on cloud resources</article-title>
          ,”
          <source>International Journal of Electronics and Telecommunications</source>
          , vol.
          <volume>61</volume>
          , no.
          <issue>1</issue>
          , pp.
          <fpage>17</fpage>
          -
          <lpage>23</lpage>
          ,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <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="ref21">
        <mixed-citation>
          [21]
          <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</article-title>
          ,”
          <source>Computer Journal</source>
          ,
          <year>2014</year>
          . [Online]. Available: http://dx.doi.org/10.1093/comjnl/bxu147
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <string-name>
            <given-names>R.</given-names>
            <surname>Giunta</surname>
          </string-name>
          , G. Pappalardo, and E. Tramontana, “
          <article-title>Using Aspects and Annotations to Separate Application Code from Design Patterns,”</article-title>
          <source>in Proceedings of ACM Symposium on Applied Computing (SAC)</source>
          , Sierre, Switzerland,
          <year>March 2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23] --, “
          <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="ref24">
        <mixed-citation>
          [24]
          <string-name>
            <given-names>A.</given-names>
            <surname>Calvagna</surname>
          </string-name>
          and E. Tramontana, “
          <article-title>Delivering dependable reusable components by expressing and enforcing design decisions,” in Proceedings of IEEE Computer Software</article-title>
          and Applications
          <string-name>
            <surname>Conference (COMPSAC) Workshop</surname>
            <given-names>QUORS</given-names>
          </string-name>
          , Kyoto, Japan,
          <year>July 2013</year>
          , pp.
          <fpage>493</fpage>
          -
          <lpage>498</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [25]
          <string-name>
            <given-names>R.</given-names>
            <surname>Giunta</surname>
          </string-name>
          , G. Pappalardo, and E. Tramontana, “
          <article-title>Superimposing roles for design patterns into application classes by means of aspects,”</article-title>
          <source>in Proceedings of ACM Symposium on Applied Computing (SAC)</source>
          ,
          <source>Riva del Garda</source>
          , Italy,
          <year>March 2012</year>
          , pp.
          <fpage>1866</fpage>
          -
          <lpage>1868</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          [26]
          <string-name>
            <given-names>E.</given-names>
            <surname>Tramontana</surname>
          </string-name>
          , “
          <article-title>Automatically characterising components with concerns and reducing tangling,” in Proceedings of IEEE Computer Software</article-title>
          and Applications
          <string-name>
            <surname>Conference (COMPSAC) Workshop</surname>
            <given-names>QUORS</given-names>
          </string-name>
          , Kyoto, Japan,
          <year>July 2013</year>
          , pp.
          <fpage>499</fpage>
          -
          <lpage>504</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          [27]
          <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>
          ,” in XVI Workshop ”From Object to Agents
          <source>” (WOA)</source>
          , vol.
          <volume>1382</volume>
          .
          <string-name>
            <surname>Napoli</surname>
          </string-name>
          , Italy: CEUR-WS,
          <year>June 2015</year>
          , pp.
          <fpage>24</fpage>
          -
          <lpage>31</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          [28]
          <string-name>
            <given-names>C.</given-names>
            <surname>Napoli</surname>
          </string-name>
          , G. Pappalardo, and E. Tramontana, “
          <article-title>A mathematical model for file fragment diffusion and a neural predictor to manage priority queues over bittorrent</article-title>
          ,”
          <source>International Journal of Applied Mathematics and Computer Science</source>
          , vol.
          <volume>26</volume>
          , no.
          <issue>1</issue>
          ,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref29">
        <mixed-citation>
          [29]
          <string-name>
            <given-names>E.</given-names>
            <surname>Hernandez Rubio</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. Meneses</given-names>
            <surname>Viveros</surname>
          </string-name>
          ,
          <string-name>
            <surname>P. M. C. Perez</surname>
            ,
            <given-names>S. D. H.</given-names>
          </string-name>
          <string-name>
            <surname>Zavala</surname>
          </string-name>
          , and
          <string-name>
            <surname>H. M. M. Rios</surname>
          </string-name>
          , “Flap:
          <article-title>Tool to generate cuda code from sequential c code,”</article-title>
          <source>in Proceedings of International Conference on Electronics, Communications and Computers (CONIELECOMP)</source>
          . IEEE,
          <year>2014</year>
          , pp.
          <fpage>35</fpage>
          -
          <lpage>40</lpage>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>