<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD Journal Publishing DTD v2.3 20070202//EN" "journalpublishing.dtd">
<article article-type="research-article" dtd-version="2.3" xml:lang="EN" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink">
<front>
<journal-meta>
<journal-id journal-id-type="publisher-id">Front. Big Data</journal-id>
<journal-title>Frontiers in Big Data</journal-title>
<abbrev-journal-title abbrev-type="pubmed">Front. Big Data</abbrev-journal-title>
<issn pub-type="epub">2624-909X</issn>
<publisher>
<publisher-name>Frontiers Media S.A.</publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id pub-id-type="publisher-id">737963</article-id>
<article-id pub-id-type="doi">10.3389/fdata.2021.737963</article-id>
<article-categories>
<subj-group subj-group-type="heading">
<subject>Big Data</subject>
<subj-group>
<subject>Original Research</subject>
</subj-group>
</subj-group>
</article-categories>
<title-group>
<article-title>Fast GPU-Based Generation of Large Graph Networks From Degree Distributions</article-title>
<alt-title alt-title-type="left-running-head">Alam and Perumalla</alt-title>
<alt-title alt-title-type="right-running-head">GPU-Based Graph-Generation from Degree Distributions</alt-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname>Alam</surname>
<given-names>Maksudul</given-names>
</name>
<uri xlink:href="https://loop.frontiersin.org/people/1476200/overview"/>
</contrib>
<contrib contrib-type="author" corresp="yes">
<name>
<surname>Perumalla</surname>
<given-names>Kalyan</given-names>
</name>
<xref ref-type="corresp" rid="c001">&#x2a;</xref>
<uri xlink:href="https://loop.frontiersin.org/people/1376727/overview"/>
</contrib>
</contrib-group>
<aff>Computer Science and Mathematics Division, Oak Ridge National Laboratory, <addr-line>Oak Ridge</addr-line>, <addr-line>TN</addr-line>, <country>United&#x20;States</country>
</aff>
<author-notes>
<fn fn-type="edited-by">
<p>
<bold>Edited by:</bold> <ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/1164642/overview">Philippe Giabbanelli</ext-link>, Miami University, United&#x20;States</p>
</fn>
<fn fn-type="edited-by">
<p>
<bold>Reviewed by:</bold> <ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/1437923/overview">Ricardo Ferreira</ext-link>, Universidade Federal de Vi&#xe7;osa, Brazil</p>
<p>
<ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/1495517/overview">JD Rudie</ext-link>, Miami University, United&#x20;States</p>
</fn>
<corresp id="c001">&#x2a;Correspondence: Kalyan Perumalla, <email>perumallaks@ornl.gov</email>
</corresp>
<fn fn-type="other">
<p>This article was submitted to Big Data Networks, a section of the journal Frontiers in Big&#x20;Data</p>
</fn>
</author-notes>
<pub-date pub-type="epub">
<day>26</day>
<month>11</month>
<year>2021</year>
</pub-date>
<pub-date pub-type="collection">
<year>2021</year>
</pub-date>
<volume>4</volume>
<elocation-id>737963</elocation-id>
<history>
<date date-type="received">
<day>08</day>
<month>07</month>
<year>2021</year>
</date>
<date date-type="accepted">
<day>15</day>
<month>10</month>
<year>2021</year>
</date>
</history>
<permissions>
<copyright-statement>Copyright &#xa9; 2021 Alam and Perumalla.</copyright-statement>
<copyright-year>2021</copyright-year>
<copyright-holder>Alam and Perumalla</copyright-holder>
<license xlink:href="http://creativecommons.org/licenses/by/4.0/">
<p>This is an open-access article distributed under the terms of the Creative Commons Attribution License (CC BY). The use, distribution or reproduction in other forums is permitted, provided the original author(s) and the copyright owner(s) are credited and that the original publication in this journal is cited, in accordance with accepted academic practice. No use, distribution or reproduction is permitted which does not comply with these&#x20;terms.</p>
</license>
</permissions>
<abstract>
<p>Synthetically generated, large graph networks serve as useful proxies to real-world networks for many graph-based applications. The ability to generate such networks helps overcome several limitations of real-world networks regarding their number, availability, and access. Here, we present the design, implementation, and performance study of a novel network generator that can produce very large graph networks conforming to any desired degree distribution. The generator is designed and implemented for efficient execution on modern graphics processing units (GPUs). Given an array of desired vertex degrees and number of vertices for each desired degree, our algorithm generates the edges of a random graph that satisfies the input degree distribution. Multiple runtime variants are implemented and tested: 1) a uniform static work assignment using a fixed thread launch scheme, 2) a load-balanced static work assignment also with fixed thread launch but with cost-aware task-to-thread mapping, and 3) a dynamic scheme with multiple GPU kernels asynchronously launched from the CPU. The generation is tested on a range of popular networks such as Twitter and Facebook, representing different scales and skews in degree distributions. Results show that, using our algorithm on a single modern GPU (NVIDIA Volta V100), it is possible to generate large-scale graph networks at rates exceeding 50 billion edges per second for a 69&#x20;billion-edge network. GPU profiling confirms high utilization and low branching divergence of our implementation from small to large network sizes. For networks with scattered distributions, we provide a coarsening method that further increases the GPU-based generation speed by up to a factor of 4 on tested input networks with over 45 billion&#x20;edges.</p>
</abstract>
<kwd-group>
<kwd>SIMT architectures</kwd>
<kwd>graph generation</kwd>
<kwd>GPU (graphic processing unit)</kwd>
<kwd>random network</kwd>
<kwd>large graph</kwd>
</kwd-group>
</article-meta>
</front>
<body>
<sec id="s1">
<title>1 Introduction</title>
<sec id="s1-1">
<title>1.1 Motivation</title>
<p>Random graph networks sometimes serve as useful proxies in modeling complex systems. To aid in such use, network generation algorithms are employed to create random network instances on demand (<xref ref-type="bibr" rid="B33">Penschuck et&#x20;al., 2020</xref>). When the scale of the studied system is large (such as the Internet (<xref ref-type="bibr" rid="B19">Faloutsos et&#x20;al., 1999</xref>; <xref ref-type="bibr" rid="B38">Siganos et&#x20;al., 2003</xref>), biological networks (<xref ref-type="bibr" rid="B22">Girvan and Newman, 2002</xref>), and social networks (<xref ref-type="bibr" rid="B27">Leskovec, 2008</xref>; <xref ref-type="bibr" rid="B25">Kwak et&#x20;al., 2010</xref>; <xref ref-type="bibr" rid="B41">Yang and Leskovec, 2015</xref>)), the generation algorithms need to be carefully designed and implemented to increase the speed of generation. Also, to accurately mimic the desired properties of a targeted network of interest, the generated proxies need to preserve those properties. Degree distribution is one of the prominent properties by which different network types are characterized. Therefore, generation of random networks conforming to desired degree distributions is important in network applications.</p>
<p>Degree distributions may be specialized or general in nature, and the network generators vary depending on the type of degree distribution of interest. In the past, a few well-understood graph models have been developed to capture the diversity of the degree distributions in the generated network. These include Erd&#x151;s&#x2013;R&#xe9;nyi (<xref ref-type="bibr" rid="B18">Erd&#x151;s and R&#xe9;nyi, 1960</xref>), stochastic block models (<xref ref-type="bibr" rid="B23">Holland et&#x20;al., 1983</xref>), small-world (<xref ref-type="bibr" rid="B40">Watts and Strogatz, 1998</xref>), Barab&#xe1;si&#x2013;Albert (<xref ref-type="bibr" rid="B10">Barab&#xe1;si and Albert, 1999</xref>; <xref ref-type="bibr" rid="B8">Albert et&#x20;al., 2000</xref>), exponential random graph (<xref ref-type="bibr" rid="B20">Frank and Strauss, 1986</xref>; <xref ref-type="bibr" rid="B35">Robins et&#x20;al., 2007</xref>), recursive matrix (<xref ref-type="bibr" rid="B15">Chakrabarti et&#x20;al., 2004</xref>), stochastic Kronecker graph (<xref ref-type="bibr" rid="B28">Leskovec and Faloutsos, 2007</xref>; <xref ref-type="bibr" rid="B29">Leskovec, 2010</xref>), and HOT (<xref ref-type="bibr" rid="B14">Carlson and Doyle, 1999</xref>) models. Each of these models have been developed considering some specific aspects of the networks. Many of these models generate graphs with a pre-defined class of degree distributions. Here, we focus on general degree distributions in which any desired set of degrees can be specified as&#x20;input.</p>
</sec>
<sec id="s1-2">
<title>1.2 Efficient Algorithms for Graph Generation</title>
<p>As the scale of the network increases in terms of the number of vertices and edges, the time taken to generate the network also increases. Therefore, generation of large random graphs necessitates efficient algorithms, in terms of both time and space requirements. However, even efficient sequential algorithms for generating such graphs were not prevalent until recently. While some efficient sequential algorithms have emerged (<xref ref-type="bibr" rid="B15">Chakrabarti et&#x20;al., 2004</xref>; <xref ref-type="bibr" rid="B11">Batagelj and Brandes, 2005</xref>; <xref ref-type="bibr" rid="B28">Leskovec and Faloutsos, 2007</xref>; <xref ref-type="bibr" rid="B31">Miller and Hagberg, 2011</xref>), these algorithms can generate graphs with only millions of vertices in a reasonable amount of time. Without efficient realization of the generator on the computational platform, the generation of graphs with billions of vertices can take a long amount of computational&#x20;time.</p>
<p>Advancements in computing hardware, software, and algorithms have enabled increasing levels of variety, sophistication and scale of generated graph networks. On conventional processors, some of the early algorithms included efficient sequential generators of Erd&#x151;s&#x2013;R&#xe9;nyi and Barab&#xe1;si&#x2013;Albert networks (<xref ref-type="bibr" rid="B11">Batagelj and Brandes, 2005</xref>), and a distributed memory&#x2013;based parallel algorithm to generate networks with approximate power&#x2013;law degree distribution (<xref ref-type="bibr" rid="B42">Yoo and Henderson, 2010</xref>). Recent work has also developed distributed memory&#x2013;based parallel algorithms to generate exact power&#x2013;law degree distributions (<xref ref-type="bibr" rid="B2">Alam et&#x20;al., 2013</xref>; <xref ref-type="bibr" rid="B30">Meyer and Penschuck, 2016</xref>; <xref ref-type="bibr" rid="B36">Sanders and Schulz, 2016</xref>). A shared&#x2013;memory-based parallel algorithm has been designed for generating networks with power&#x2013;law degree distribution (<xref ref-type="bibr" rid="B9">Azadbakht et&#x20;al., 2016</xref>), and another massively parallel network generator based on the Kronecker model is available (<xref ref-type="bibr" rid="B24">Kepner et&#x20;al., 2018</xref>). Highly scalable generators for Erd&#x151;s-R&#xe9;nyi, 2D/3D random geometric graphs, 2D/3D Delaunay graphs, and hyperbolic random graphs are now known (<xref ref-type="bibr" rid="B21">Funke et&#x20;al., 2019</xref>). R-MAT (<xref ref-type="bibr" rid="B15">Chakrabarti et&#x20;al., 2004</xref>) and stochastic Kronecker graph (SKG) (<xref ref-type="bibr" rid="B29">Leskovec, 2010</xref>) are some popular models to generate networks with power&#x2013;law degree distribution using matrix multiplication. The SKG model is notable in that the Graph500 group chose the SKG model in their supercomputer benchmark due to its simplicity of implementation.</p>
<p>In our previous work (<xref ref-type="bibr" rid="B4">Alam et&#x20;al., 2016</xref>), we have shown that a generalized and efficient generation of degree distribution-conforming networks is possible using an approach based on the Chung-Lu (CL) model (<xref ref-type="bibr" rid="B17">Chung and Lu, 2002a</xref>; <xref ref-type="bibr" rid="B16">Chung and Lu, 2002b</xref>). The model is suitable for generating proxy networks from the degree distribution of nearly any real-world network. The CL model is remarkable due to its similarity to the SKG model (<xref ref-type="bibr" rid="B34">Pinar et&#x20;al., 2011</xref>). In fact, the CL model can be used to not only replace the SKG model, but also expand the generation to an even wider range of degree distributions. An efficient sequential algorithms for the CL model is available (<xref ref-type="bibr" rid="B31">Miller and Hagberg, 2011</xref>), as also a distributed&#x2013;memory parallel algorithm (<xref ref-type="bibr" rid="B3">Alam and Khan, 2015</xref>). An efficient and scalable algorithmic method to generate Chung&#x2013;Lu, block two&#x2013;level Erd&#x151;s&#x2013;R&#xe9;nyi (BTER), and stochastic blockmodels have been previously presented by us (<xref ref-type="bibr" rid="B4">Alam et&#x20;al., 2016</xref>).</p>
<p>Although there has been progress in scalable generation on conventional processor (CPU) systems, no algorithms have so far been presented in the literature to exploit specialized accelerated hardware that offers significantly faster computational possibilities.</p>
</sec>
<sec id="s1-3">
<title>1.3 Graphics Processing Units-Based Network Generation</title>
<p>In accelerated computing, graphics processing units (GPUs) represent a cost-effective, energy-efficient, and widely available parallel processing platform. GPUs are highly parallel, multi-threaded, many-core processors that have greatly expanded beyond graphics operations and are now widely used for general purpose computing. Most desktops, laptops and workstations contain this next generation computing based on GPUs. They are now so prevalent that many high performance computing and supercomputing systems are also built using GPU hardware as the major computational workhorse. However, conventional CPU-oriented algorithms are not ported easily to GPU platforms. The unique execution mode of GPUs needs to be carefully exploited to realize their promise of computational&#x20;speed.</p>
<p>The use of GPUs is prevalent in many areas such as scientific computation, complex simulations, big data analytics, machine learning, and data mining. Although GPUs are now being applied to graph problems, there is a general lack of GPU-based network generators. Some of the known works include a GPU&#x2013;based algorithm for generating Erd&#x151;s&#x2013;R&#xe9;nyi networks (<xref ref-type="bibr" rid="B32">Nobari et&#x20;al., 2011</xref>) and a GPU&#x2013;based algorithm for generating random networks (<xref ref-type="bibr" rid="B26">Leis et&#x20;al., 2013</xref>) using the small&#x2013;world model (<xref ref-type="bibr" rid="B40">Watts and Strogatz, 1998</xref>). However, until recently no GPU&#x2013;based algorithm existed for other important degree distributions such as power&#x2013;law. In our previous research, we presented the first GPU-based algorithms to generate networks with power&#x2013;law degree distributions (<xref ref-type="bibr" rid="B1">Alam, 2016</xref>; <xref ref-type="bibr" rid="B4">Alam et&#x20;al., 2016</xref>; <xref ref-type="bibr" rid="B5">Alam and Perumalla, 2017a</xref>; <xref ref-type="bibr" rid="B6">Alam and Perumalla, 2017b</xref>), as well as a multi-GPU implementation for the same problem (<xref ref-type="bibr" rid="B7">Alam et&#x20;al., 2019</xref>). So far, to the best of our knowledge, there is no GPU-based algorithm to generate networks conforming to arbitrary degree distributions.</p>
</sec>
<sec id="s1-4">
<title>1.4 Contributions and Organization</title>
<p>In this paper, we focus on achieving a GPU-based capability for fast generation of random networks conforming to any specified degree distribution. Our aim is achieve a high speed of graph generation by designing and implementing new algorithms specifically suited to the SIMT execution style required on GPUs. Towards this end, we present a novel GPU-based method, based on grouping the vertices by their degrees, that leads to space and time efficient algorithms.</p>
</sec>
<sec id="s1-5">
<title>Our Main Contributions Are Summarized Below</title>
<p>
<list list-type="simple">
<list-item>
<p>1. The algorithm presented here is the first GPU-based algorithm published in the literature for degree distribution-based network graph generation.</p>
</list-item>
<list-item>
<p>2. To improve the performance of network generation on GPUs, we present a new distribution coarsening approach that provides gains in run time without affecting the degree distribution of the generated output&#x20;graph.</p>
</list-item>
<list-item>
<p>3. The rate of network generation (measured in terms of millions of edges generated per second) achieved by our algorithm design and implementation (on a single CPU or GPU device) is among the highest reported so far in the literature, exceeding 50&#xa0;billion edges per second for some test networks.</p>
</list-item>
</list>
</p>
<p>In <xref ref-type="sec" rid="s2">Section 2</xref>, we recapitulate the basic concepts and the algorithmic building blocks for degree distribution-conforming graph generation, borrowing the terminology from our previous work that was based on CPU platforms (<xref ref-type="bibr" rid="B4">Alam et&#x20;al., 2016</xref>). In <xref ref-type="sec" rid="s3">Section 3</xref>, we build on this basic, generic framework and re-target it specifically to suit the SIMT (single instruction multiple thread) architecture of GPU accelerators. The GPU algorithms and task scheduling approaches are described in the same section. A detailed study of the runtime performance is presented in <xref ref-type="sec" rid="s4">Section 4</xref> using multiple test networks. Performance improvements are also reported using a degree distribution coarsening scheme designed to improve the task-to-thread mapping on the GPU architecture. The research is summarized and future work is identified in <xref ref-type="sec" rid="s5">Section&#x20;5</xref>.</p>
</sec>
</sec>
<sec id="s2">
<title>2 Theory and Algorithmic Approach</title>
<sec id="s2-1">
<title>2.1 Problem and Solution Approach</title>
<p>The problem of generating a random network that conforms to a given degree distribution is defined as follows. The desired output is a graph <italic>G</italic>(<italic>n</italic>, <italic>m</italic>) of <italic>n</italic> vertices and <italic>m</italic> edges such that the degree of connectivity of each vertex conforms to a user-specified distribution. That is, given an input degree distribution, a random network is to be generated such that the edge connectivity of vertices of the generated network obeys the input degree distribution. The input could be specified either as a desired histogram of the vertex degrees in the graph, or it could be specified as the exact count of the connectivity degree for each vertex in the&#x20;graph.</p>
<p>
<bold>Input</bold>: The input in general is an array in which element <italic>i</italic> the number of neighbors <italic>b</italic>
<sub>
<italic>i</italic>
</sub> of the <italic>i</italic>
<sup>th</sup> vertex. In other words, it is an array of <italic>n</italic> expected vertex degrees, denoting one degree count per vertex: <inline-formula id="inf1">
<mml:math id="m1">
<mml:mi mathvariant="double-struck">B</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="{" close="}">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:math>
</inline-formula>, 0 &#x2264; <italic>b</italic>
<sub>
<italic>i</italic>
</sub> &#x3c; <italic>n</italic>. Let <inline-formula id="inf2">
<mml:math id="m2">
<mml:mi mathvariant="double-struck">D</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> be the set of all &#x39b; distinct, non-zero degrees in <inline-formula id="inf3">
<mml:math id="m3">
<mml:mi mathvariant="double-struck">B</mml:mi>
</mml:math>
</inline-formula>. Let <italic>n</italic>
<sub>
<italic>i</italic>
</sub> be the number of vertices each of which has an expected degree <italic>d</italic>
<sub>
<italic>i</italic>
</sub>. Note that not all degrees need be present in the input distribution. In other words, <italic>d</italic>
<sub>
<italic>i</italic>
</sub> for which <italic>n</italic>
<sub>
<italic>i</italic>
</sub> &#x3d; 0 are not included in the degree distribution. Thus,<disp-formula id="e1">
<mml:math id="m4">
<mml:mi mathvariant="double-struck">DD</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="{" close="}">
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>&#x2264;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2264;</mml:mo>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
<mml:mtext>&#x2009;and&#x2009;</mml:mtext>
<mml:mn>0</mml:mn>
<mml:mo>&#x3c;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3c;</mml:mo>
<mml:mi>n</mml:mi>
<mml:mtext>&#x2009;and&#x2009;</mml:mtext>
<mml:mn>0</mml:mn>
<mml:mo>&#x3c;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2264;</mml:mo>
<mml:mi>n</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:math>
<label>(1)</label>
</disp-formula>represents the input degree distribution, where <inline-formula id="inf4">
<mml:math id="m5">
<mml:mi>n</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mo movablelimits="false" form="prefix">&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula>. Also, we denote by <italic>S</italic> the sum of the degrees of all vertices, that is, <inline-formula id="inf5">
<mml:math id="m6">
<mml:mi>S</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mo movablelimits="false" form="prefix">&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>.</p>
<p>
<bold>Preprocessing</bold>: Our algorithm accepts either the sequence of&#x20;degrees <inline-formula id="inf6">
<mml:math id="m7">
<mml:mi mathvariant="double-struck">B</mml:mi>
</mml:math>
</inline-formula> or the degree distribution <inline-formula id="inf7">
<mml:math id="m8">
<mml:mi mathvariant="double-struck">DD</mml:mi>
</mml:math>
</inline-formula> as input. If <inline-formula id="inf8">
<mml:math id="m9">
<mml:mi mathvariant="double-struck">B</mml:mi>
</mml:math>
</inline-formula> is specified as input, it is converted into its equivalent <inline-formula id="inf9">
<mml:math id="m10">
<mml:mi mathvariant="double-struck">DD</mml:mi>
</mml:math>
</inline-formula> degree distribution. The vertices are grouped by their expected degrees: if <inline-formula id="inf10">
<mml:math id="m11">
<mml:msub>
<mml:mrow>
<mml:mi>V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="{" close="}">
<mml:mrow>
<mml:mi>u</mml:mi>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:math>
</inline-formula> is the group of vertices with expected degree <italic>d</italic>
<sub>
<italic>i</italic>
</sub>, then <italic>n</italic>
<sub>
<italic>i</italic>
</sub> &#x3d; &#x7c;<italic>V</italic>
<sub>
<italic>i</italic>
</sub>&#x7c; is the number of vertices in <italic>V</italic>
<sub>
<italic>i</italic>
</sub> for 1 &#x2264; <italic>i</italic>&#x20;&#x2264; &#x39b;. Therefore, in the rest of this paper, without loss of generality, we assume the input is specified as&#x20;<inline-formula id="inf11">
<mml:math id="m12">
<mml:mi mathvariant="double-struck">DD</mml:mi>
</mml:math>
</inline-formula>.</p>
<p>The terms are illustrated in <xref ref-type="fig" rid="F1">Figure&#x20;1</xref> with a small example graph comprising <italic>n</italic>&#x20;&#x3d; 13 vertices such that there are &#x39b; &#x3d; 4 unique degrees given as <inline-formula id="inf12">
<mml:math id="m13">
<mml:mi mathvariant="double-struck">D</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="{" close="}">
<mml:mrow>
<mml:mn>1,2,5,7</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:math>
</inline-formula>. The input degree distribution, therefore, is <inline-formula id="inf13">
<mml:math id="m14">
<mml:mi mathvariant="double-struck">DD</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="{" close="}">
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>1,7</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>2,3</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>5,2</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>7,1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:math>
</inline-formula>. Therefore, there are four groups, <italic>V</italic>
<sub>1</sub>&#x2026;<italic>V</italic>
<sub>4</sub>, containing 7, 3, 2, and 1 vertices respectively.</p>
<fig id="F1" position="float">
<label>FIGURE 1</label>
<caption>
<p>Illustrative example of the input and preprocessing for a desired graph with <italic>n</italic>&#x20;&#x3d; 13 vertices.</p>
</caption>
<graphic xlink:href="fdata-04-737963-g001.tif"/>
</fig>
<p>
<bold>Output</bold>: With the preceding background, every edge <italic>e</italic>&#x20;&#x3d; (<italic>u</italic>, <italic>v</italic>) in the output graph will correspond to exactly one of the following two types:</p>
<p>1. <bold>Intra-group edge</bold>, or <bold>intra edge</bold> for short, is an edge between <italic>u</italic> and <italic>v</italic> if both <italic>u</italic> and <italic>v</italic> belong to the same group, that is, <italic>u</italic>, <italic>v</italic>&#x20;&#x2208; <italic>V</italic>
<sub>
<italic>i</italic>
</sub> for some <italic>i</italic>,&#x20;and</p>
<p>2. <bold>Inter-group edge</bold>, or <bold>inter edge</bold> for short, is an edge between <italic>u</italic> and <italic>v</italic> if <italic>u</italic> and <italic>v</italic> belong to two different groups, that is, <italic>u</italic>&#x20;&#x2208; <italic>V</italic>
<sub>
<italic>i</italic>
</sub> and <italic>v</italic>&#x20;&#x2208; <italic>V</italic>
<sub>
<italic>j</italic>
</sub> for some <italic>i</italic>&#x20;&#x2260;&#x20;<italic>j</italic>.</p>
<p>
<statement content-type="problem" id="uProblem_1">
<label>Problem</label>
<p>We now redefine the graph generation problem to that of correctly and efficiently generating all the intra edges and inter edges. The union of the two sets of edges will directly constitute a graph network whose combined vertex-connectivity conforms to the desired degree distribution specified as input. In generating both types of edges, we exploit the Chung&#x2013;Lu (CL) model in which any pair of vertices <italic>u</italic> and <italic>v</italic> are connected by an edge with the probability <inline-formula id="inf14">
<mml:math id="m15">
<mml:msub>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>v</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula>, where <italic>S</italic>&#x20;&#x3d; <italic>&#x2211;</italic>
<sub>
<italic>u</italic>
</sub>
<italic>b</italic>
<sub>
<italic>u</italic>
</sub> (assuming <inline-formula id="inf15">
<mml:math id="m16">
<mml:msub>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msubsup>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2264;</mml:mo>
<mml:mi>S</mml:mi>
</mml:math>
</inline-formula>, we have 0 &#x2264; <italic>p</italic>
<sub>
<italic>u</italic>,<italic>v</italic>
</sub> &#x2264; 1 for all <italic>u</italic> and <italic>v</italic>) (<xref ref-type="bibr" rid="B17">Chung and Lu, 2002a</xref>; <xref ref-type="bibr" rid="B16">Chung and LU, 2002b</xref>). For simple graphs without self-loops (<italic>u</italic>&#x20;&#x2260; <italic>v</italic>), the expected degree of a vertex <italic>u</italic> is <inline-formula id="inf16">
<mml:math id="m17">
<mml:msub>
<mml:mrow>
<mml:mo movablelimits="false" form="prefix">&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula>, which converges to <italic>b</italic>
<sub>
<italic>u</italic>
</sub> for large graphs.</p>
</statement>
</p>
</sec>
<sec id="s2-2">
<title>2.2 Vertex Labels</title>
<p>Each vertex is identified by a unique integer label from 1 to <italic>n</italic> as&#x20;follows. Let <italic>&#x3bb;</italic>
<sub>
<italic>i</italic>
</sub> be the label of the first vertex of a group <italic>V</italic>
<sub>
<italic>i</italic>
</sub>, where <italic>&#x3bb;</italic>
<sub>1</sub> &#x3d; 1 and <inline-formula id="inf17">
<mml:math id="m18">
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>&#x2b;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mo movablelimits="false" form="prefix">&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> for <italic>i</italic>&#x20;&#x3e; 1. Then, the vertices in <italic>V</italic>
<sub>
<italic>i</italic>
</sub> are labeled by the integers from <italic>&#x3bb;</italic>
<sub>
<italic>i</italic>
</sub> to <italic>&#x3bb;</italic>
<sub>
<italic>i</italic>&#x2b;1</sub> &#x2212; 1. Note that we only store the starting label for each group, which requires <italic>O</italic>(&#x39b;) memory.</p>
</sec>
<sec id="s2-3">
<title>2.3 Intra Edge Generation</title>
<p>In the case of generating any intra edge <italic>e</italic>&#x20;&#x3d; (<italic>u</italic>, <italic>v</italic>), where <italic>u</italic>, <italic>v</italic>&#x20;&#x2208; <italic>V</italic>
<sub>
<italic>i</italic>
</sub>, the edge (<italic>u</italic>, <italic>v</italic>) is created with probability <inline-formula id="inf18">
<mml:math id="m19">
<mml:msub>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>v</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula>, since <italic>b</italic>
<sub>
<italic>u</italic>
</sub>&#x20;&#x3d; <italic>b</italic>
<sub>
<italic>v</italic>
</sub> &#x3d; <italic>d</italic>
<sub>
<italic>i</italic>
</sub>. Notice that, for all pairs of <italic>u</italic>, <italic>v</italic>&#x20;&#x2208; <italic>V</italic>
<sub>
<italic>i</italic>
</sub>, the probabilities <italic>p</italic>
<sub>
<italic>u</italic>,<italic>v</italic>
</sub> are equal. Thus generating the intra edges in <italic>V</italic>
<sub>
<italic>i</italic>
</sub> is equivalent to&#x20;generating an Erd&#x151;s-R&#xe9;nyi (ER) random graph <italic>G</italic>
<sub>
<italic>i</italic>
</sub>(<italic>n</italic>
<sub>
<italic>i</italic>
</sub>, <italic>p</italic>
<sub>
<italic>i</italic>
</sub>) with <italic>n</italic>
<sub>
<italic>i</italic>
</sub> &#x3d; &#x7c;<italic>V</italic>
<sub>
<italic>i</italic>
</sub>&#x7c; and <inline-formula id="inf19">
<mml:math id="m20">
<mml:msub>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula>. The ER model <italic>G</italic>(<italic>n</italic>, <italic>p</italic>) generates a random graph with <italic>n</italic> vertices where each of <inline-formula id="inf20">
<mml:math id="m21">
<mml:mfrac>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula> possible potential edges is selected and added to the generated graph with probability <italic>p</italic>. We generate the intra edges on <italic>V</italic>
<sub>
<italic>i</italic>
</sub> for all <italic>i</italic> by generating ER random graphs <inline-formula id="inf21">
<mml:math id="m22">
<mml:mi>G</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>.</p>
<p>A simple algorithm to generate a random graph <italic>G</italic>(<italic>n</italic>, <italic>p</italic>) is as follows: for each of the <inline-formula id="inf22">
<mml:math id="m23">
<mml:mfrac>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula> potential edges, toss a biased coin and select the edge with probability <italic>p</italic>. As an improvement over this scheme, an efficient algorithm for the ER model based on an edge-skipping technique is available (<xref ref-type="bibr" rid="B11">Batagelj and Brandes, 2005</xref>), which we borrow to generate the inter edges for each&#x20;group.</p>
<p>For each group <italic>V</italic>
<sub>
<italic>i</italic>
</sub>, to generate the intra edges as an ER random graph <inline-formula id="inf23">
<mml:math id="m24">
<mml:mi>G</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>, we apply the edge skipping technique on the sequence of all potential edges. To save memory space, we avoid creating explicit sequence of the edges. Instead, the edges are represented by a set of consecutive integers 1, 2, &#x2026;, <italic>M</italic>
<sub>
<italic>i</italic>
</sub>, where <inline-formula id="inf24">
<mml:math id="m25">
<mml:msub>
<mml:mrow>
<mml:mi>M</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mfrac linethickness="0.0pt">
<mml:mrow>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x7c;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mfenced>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mfrac linethickness="0.0pt">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mfenced>
</mml:math>
</inline-formula>, following a lexicographic order of the edges as shown in <xref ref-type="fig" rid="F2">Figures 2A,B</xref>. We select a subset of the integers from 1, 2, &#x2026;, <italic>M</italic>
<sub>
<italic>i</italic>
</sub> by applying the skipping technique with the probability <inline-formula id="inf25">
<mml:math id="m26">
<mml:mi>p</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula> as follows. Let <italic>x</italic> be the last selected edge (initially <italic>x</italic>&#x20;&#x3d; 0). The skip length <italic>&#x2113;</italic> is computed as <inline-formula id="inf26">
<mml:math id="m27">
<mml:mi>&#x2113;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="&#x230a;" close="&#x230b;">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>log</mml:mi>
<mml:mo>&#x2061;</mml:mo>
<mml:mi>r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>log</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>p</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:mfenced>
</mml:math>
</inline-formula>, where <italic>r</italic>&#x20;&#x2208; (0, 1] is a uniform random number. The next selected edge is given by <italic>x</italic>&#x20;&#x2190; <italic>x</italic>&#x20;&#x2b; <italic>&#x2113;</italic> &#x2b; 1. The selected edge number <italic>x</italic> is converted into an edge using the equations shown in <xref ref-type="fig" rid="F2">Figure&#x20;2C</xref>. This process is repeated until <italic>x</italic>&#x20;&#x2265;&#x20;<italic>M</italic>
<sub>
<italic>i</italic>
</sub>.</p>
<fig id="F2" position="float">
<label>FIGURE 2</label>
<caption>
<p>Illustration of intra edge sequences with a group <italic>V</italic>
<sub>
<italic>i</italic>
</sub> using <inline-formula id="inf27">
<mml:math id="m28">
<mml:mi mathvariant="script">G</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>p</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> model with <italic>n</italic>
<sub>
<italic>i</italic>
</sub> &#x3d; 4 and <inline-formula id="inf28">
<mml:math id="m29">
<mml:mi>p</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula>.</p>
</caption>
<graphic xlink:href="fdata-04-737963-g002.tif"/>
</fig>
</sec>
<sec id="s2-4">
<title>2.4 Inter Edge Generation</title>
<p>For generating all inter edges, consider any two groups <italic>V</italic>
<sub>
<italic>i</italic>
</sub> and <italic>V</italic>
<sub>
<italic>j</italic>
</sub>. Given any <italic>u</italic>&#x20;&#x2208; <italic>V</italic>
<sub>
<italic>i</italic>
</sub>, <italic>v</italic>&#x20;&#x2208; <italic>V</italic>
<sub>
<italic>j</italic>
</sub>, the edge (<italic>u</italic>, <italic>v</italic>) is created with probability <inline-formula id="inf29">
<mml:math id="m30">
<mml:msub>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>v</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula>. Note that for all pairs of <italic>u</italic>&#x20;&#x2208; <italic>V</italic>
<sub>
<italic>i</italic>
</sub>, <italic>v</italic>&#x20;&#x2208; <italic>V</italic>
<sub>
<italic>j</italic>
</sub>, the probabilities <italic>p</italic>
<sub>
<italic>u</italic>,<italic>v</italic>
</sub> are equal. Therefore, generating the inter edges between <italic>V</italic>
<sub>
<italic>i</italic>
</sub> and <italic>V</italic>
<sub>
<italic>j</italic>
</sub> is equivalent to generating a random bipartite graph (<xref ref-type="bibr" rid="B37">Shang, 2010</xref>) formed by two columns of vertices, each with <italic>n</italic>
<sub>
<italic>i</italic>
</sub> and <italic>n</italic>
<sub>
<italic>j</italic>
</sub> vertices respectively, and with an edge probability equal to <inline-formula id="inf30">
<mml:math id="m31">
<mml:mi>p</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula> (see <xref ref-type="fig" rid="F3">Figure&#x20;3A</xref>).</p>
<fig id="F3" position="float">
<label>FIGURE 3</label>
<caption>
<p>Illustration of inter edge sequences between groups <italic>V</italic>
<sub>
<italic>i</italic>
</sub> and <italic>V</italic>
<sub>
<italic>j</italic>
</sub> with <italic>n</italic>
<sub>
<italic>i</italic>
</sub> &#x3d; 2 and <italic>n</italic>
<sub>
<italic>j</italic>
</sub> &#x3d; 3.</p>
</caption>
<graphic xlink:href="fdata-04-737963-g003.tif"/>
</fig>
<p>The edge skipping technique is also applied here to generate the inter edges using the random bipartite model (<xref ref-type="fig" rid="F3">Figure&#x20;3A</xref>). In this case, the potential edges are represented by consecutive integers 1, 2, &#x2026;, <italic>M</italic>
<sub>
<italic>ij</italic>
</sub>, where <italic>M</italic>
<sub>
<italic>ij</italic>
</sub> &#x3d; &#x7c;<italic>V</italic>
<sub>
<italic>i</italic>
</sub>&#x2016;<italic>V</italic>
<sub>
<italic>j</italic>
</sub>&#x7c; &#x3d; <italic>n</italic>
<sub>
<italic>i</italic>
</sub>
<italic>n</italic>
<sub>
<italic>j</italic>
</sub> (<xref ref-type="fig" rid="F3">Figure&#x20;3B</xref>). Next, the edge skipping technique is applied on this sequence with probability <inline-formula id="inf31">
<mml:math id="m32">
<mml:mi>p</mml:mi>
<mml:mspace width="-0.17em"/>
<mml:mo>&#x3d;</mml:mo>
<mml:mspace width="-0.17em"/>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula>. The selected numbers <italic>x</italic> are converted to the edges using the equations shown in <xref ref-type="fig" rid="F3">Figure&#x20;3C</xref>.</p>
</sec>
</sec>
<sec id="s3">
<title>3 Graphics Processing Units-Based Design and Implementation</title>
<p>In this section, we will describe the details of the algorithmic design and implementation for efficient execution on a&#x20;GPU.</p>
<sec id="s3-1">
<title>3.1 Task Definition and Identification</title>
<p>To generate the whole graph, all possible intra and inter group edges need to be visited, as previously outlined. Note that there are &#x39b; intra edge groups and <inline-formula id="inf32">
<mml:math id="m33">
<mml:mfenced open="(" close=")">
<mml:mfrac linethickness="0.0pt">
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mfenced>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula> inter edge groups that need to be evaluated. Therefore, there are a total of <inline-formula id="inf33">
<mml:math id="m34">
<mml:mi>&#x3c4;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula> such groups. Let <inline-formula id="inf34">
<mml:math id="m35">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> represent the task of generating edges between groups <italic>V</italic>
<sub>
<italic>i</italic>
</sub> and <italic>V</italic>
<sub>
<italic>j</italic>
</sub>, where <inline-formula id="inf35">
<mml:math id="m36">
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="double-struck">D</mml:mi>
</mml:math>
</inline-formula>. When <italic>i</italic>&#x20;&#x3d; <italic>j</italic>, task <inline-formula id="inf36">
<mml:math id="m37">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> generates intra edges; otherwise <inline-formula id="inf37">
<mml:math id="m38">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> produces inter edges. Each edge generation task has a computational cost. Let <italic>c</italic>
<sub>
<italic>i</italic>,<italic>j</italic>
</sub> be the computational cost of executing task <inline-formula id="inf38">
<mml:math id="m39">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> defined as:<disp-formula id="e2">
<mml:math id="m40">
<mml:msub>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>&#x3b1;</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>&#x3b2;</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="{" close="">
<mml:mrow>
<mml:mtable class="cases">
<mml:mtr>
<mml:mtd columnalign="left">
<mml:mi>&#x3b1;</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>&#x3b2;</mml:mi>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
<mml:mfrac>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:mo>,</mml:mo>
<mml:mspace width="1em"/>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>i</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>j</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="left">
<mml:mi>&#x3b1;</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>&#x3b2;</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:mo>,</mml:mo>
<mml:mspace width="1em"/>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>i</mml:mi>
<mml:mo>&#x2260;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>,</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:math>
<label>(2)</label>
</disp-formula>where, <italic>&#x3b1;</italic> is the fixed cost of time required to initialize a task, <italic>&#x3b2;</italic> is the time to evaluate the generation of an edge, and <italic>m</italic>
<sub>
<italic>i</italic>,<italic>j</italic>
</sub> is the expected number of edges evaluated by task&#x20;<inline-formula id="inf39">
<mml:math id="m41">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula>.</p>
<p>To simplify the discussion and implementation, a task <inline-formula id="inf40">
<mml:math id="m42">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> is relabeled from two indices (<italic>i</italic>, <italic>j</italic>) to a single <italic>task number</italic> <italic>x</italic> denoted by <inline-formula id="inf41">
<mml:math id="m43">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">Q</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula>, where <inline-formula id="inf42">
<mml:math id="m44">
<mml:mi>x</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>j</mml:mi>
</mml:math>
</inline-formula>. Let <italic>c</italic>
<sub>
<italic>x</italic>
</sub> be the computing cost of task <inline-formula id="inf43">
<mml:math id="m45">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">Q</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula>, that is, <italic>c</italic>
<sub>
<italic>x</italic>
</sub> &#x3d; <italic>c</italic>
<sub>
<italic>i</italic>,<italic>j</italic>
</sub> for the original task <inline-formula id="inf44">
<mml:math id="m46">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula>. A visual depiction of the tasks is shown in <xref ref-type="fig" rid="F4">Figure&#x20;4</xref>.</p>
<fig id="F4" position="float">
<label>FIGURE 4</label>
<caption>
<p>Listing of edge generation tasks <inline-formula id="inf45">
<mml:math id="m47">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> and relabeling to <inline-formula id="inf46">
<mml:math id="m48">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">Q</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula>.</p>
</caption>
<graphic xlink:href="fdata-04-737963-g004.tif"/>
</fig>
<p>The relabeled task <inline-formula id="inf47">
<mml:math id="m49">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">Q</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> can be converted to the original label <inline-formula id="inf48">
<mml:math id="m50">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> using the functions:<disp-formula id="e3">
<mml:math id="m51">
<mml:mi mathvariant="monospace">T</mml:mi>
<mml:mi mathvariant="monospace">A</mml:mi>
<mml:mi mathvariant="monospace">S</mml:mi>
<mml:mi mathvariant="monospace">K</mml:mi>
<mml:mtext>_</mml:mtext>
<mml:mi mathvariant="monospace">T</mml:mi>
<mml:mi mathvariant="monospace">O</mml:mi>
<mml:mtext>_</mml:mtext>
<mml:mi mathvariant="monospace">I</mml:mi>
<mml:mi mathvariant="monospace">J</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>&#x2261;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mo>&#x2308;</mml:mo>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>&#x2b;</mml:mo>
<mml:msqrt>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>8</mml:mn>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msqrt>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#x2309;</mml:mo>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi>x</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:math>
<label>(3)</label>
</disp-formula>
</p>
</sec>
<sec id="s3-2">
<title>3.2 Graphics Processing Units Implementation of Intra and Inter Edge Generation Kernels</title>
<p>The GPU implementation is achieved in terms of functions called &#x201c;kernels&#x201d; that are launched from the CPU and executed on the GPU. The kernels for the intra&#x2013; and inter&#x2013; groups are presented in <xref ref-type="other" rid="algo1">Algorithm 1</xref>. The kernels <monospace>Kernel-Intra</monospace> and <monospace>Kernel-Inter</monospace> execute the edge generation tasks for intra edges and inter edges, respectively.</p>
<table-wrap id="algo1" position="float">
<label>ALGORITHM 1</label>
<caption>
<p>GPU Kernels for Generating Edges using Edge Skipping.</p>
</caption>
<table>
<tbody>
<tr>
<td>
<inline-graphic xlink:href="fdata-04-737963-fx1.tif"/>
</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>
<monospace>Kernel-Intra</monospace> uses the following parameters: a thread identifier (<italic>tid</italic>), the number of GPU threads (<italic>N</italic>
<sub>
<italic>T</italic>
</sub>), a group index (<italic>i</italic>), a starting edge index (<italic>b</italic>
<sub>
<italic>start</italic>
</sub>), and an ending edge index (<italic>b</italic>
<sub>
<italic>end</italic>
</sub>) to process the task <inline-formula id="inf49">
<mml:math id="m52">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula>. As described in (<xref ref-type="bibr" rid="B4">Alam et&#x20;al., 2016</xref>), any task <inline-formula id="inf50">
<mml:math id="m53">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> can be divided into an arbitrary number of sub-tasks for the <inline-formula id="inf51">
<mml:math id="m54">
<mml:mfenced open="(" close=")">
<mml:mfrac linethickness="0.0pt">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mfenced>
</mml:math>
</inline-formula> potential edges. Here, <inline-formula id="inf52">
<mml:math id="m55">
<mml:mn>1</mml:mn>
<mml:mo>&#x2264;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2264;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>e</mml:mi>
<mml:mi>n</mml:mi>
<mml:mi>d</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2264;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mfrac linethickness="0.0pt">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mfenced>
</mml:math>
</inline-formula> represent the starting and ending potential edge candidate sequence of a sub-task. Next, the sub-task is processed by <italic>N</italic>
<sub>
<italic>T</italic>
</sub> concurrent GPU threads with <inline-formula id="inf53">
<mml:math id="m56">
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
</mml:math>
</inline-formula> potential edge candidates processed per GPU thread. The variables <italic>e</italic>
<sub>
<italic>start</italic>
</sub> and <italic>e</italic>
<sub>
<italic>end</italic>
</sub> denote the starting and ending potential edge candidates of the sub-task for each individual threads, respectively. Using a random number <italic>r</italic>&#x20;&#x2208; (0, 1], the skip length <italic>&#x2113;</italic> is computed in line 7. For computing the skip length, the probability is computed in line 4 as per the CL model formulation. The next selected edge <italic>x</italic> is computed in line 7 and converted to edge (<italic>u</italic>, <italic>v</italic>) in line 9. In line 10, the edge thus generated is represented by (<italic>u</italic>, <italic>v</italic>) &#x2261; (<italic>&#x3bb;</italic>
<sub>
<italic>i</italic>
</sub> &#x2b; <italic>u</italic>, <italic>&#x3bb;</italic>
<sub>
<italic>j</italic>
</sub> &#x2b; <italic>v</italic>) for the whole&#x20;graph.</p>
<p>
<monospace>Kernel-Inter</monospace> uses the following parameters: the thread identifier (<italic>tid</italic>), the number of GPU threads (<italic>N</italic>
<sub>
<italic>T</italic>
</sub>), two group indices (<italic>i</italic>, <italic>j</italic>), a starting edge index (<italic>b</italic>
<sub>
<italic>start</italic>
</sub>), and an ending edge index (<italic>b</italic>
<sub>
<italic>end</italic>
</sub>) to process the task <inline-formula id="inf54">
<mml:math id="m57">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula>. The task <inline-formula id="inf55">
<mml:math id="m58">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> can be divided into an arbitrary number of sub-tasks between 1 and <italic>n</italic>
<sub>
<italic>i</italic>
</sub>
<italic>n</italic>
<sub>
<italic>j</italic>
</sub>. Here, 1 &#x2264; <italic>b</italic>
<sub>
<italic>start</italic>
</sub> &#x2264; <italic>b</italic>
<sub>
<italic>end</italic>
</sub> &#x2264; <italic>n</italic>
<sub>
<italic>i</italic>
</sub>
<italic>n</italic>
<sub>
<italic>j</italic>
</sub> represent the range from starting to ending edge indices of work for a sub-task. Similar to the intra kernel, the sub-task is processed by <italic>N</italic>
<sub>
<italic>T</italic>
</sub> concurrent GPU threads with <inline-formula id="inf56">
<mml:math id="m59">
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
</mml:math>
</inline-formula> potential edges processed per GPU thread. The kernel is quite similar to the kernel <monospace>Kernel-Intra</monospace> except for the probability (<italic>p</italic>) calculation and edge conversion.</p>
</sec>
<sec id="s3-3">
<title>3.3 Scheduling the Graphics Processing Units-Based Execution of Edge Generation Tasks</title>
<p>With this task organization, the challenge in efficient network generation becomes that of efficiently scheduling the bag of edge generation tasks <inline-formula id="inf57">
<mml:math id="m60">
<mml:mi mathvariant="double-struck">Q</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">Q</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> onto the GPU processing elements. Note that each <inline-formula id="inf58">
<mml:math id="m61">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">Q</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> is either an intra-edge generator or inter edge generator, and the number of edges generated within each task is not uniform.</p>
<p>A GPU consists of many streaming multiprocessors (SMs), each of them consisting of multiple streaming processors (SP) or cores on which GPU threads execute the application&#x2019;s kernels. GPU threads are organized in a two-level hierarchy of a grid of blocks. A block consists of a specified number of GPU threads, typically up to 1,024 threads. A grid consists of many blocks typically up to 2<sup>31</sup> &#x2212; 1 blocks. Each block is executed by one SM and cannot be dynamically migrated to other SMs in the GPU. When a block is executed on an SM, all the GPU threads within the block are executed concurrently. A single SM can run several concurrent blocks depending on the hardware resources available.</p>
<p>To process the set of edge generation tasks <inline-formula id="inf59">
<mml:math id="m62">
<mml:mi mathvariant="double-struck">Q</mml:mi>
</mml:math>
</inline-formula> we designed and implemented the following three schemes to launch, schedule, and execute the tasks on the GPU:<list list-type="simple">
<list-item>
<p>1. GPU Dynamic: Dynamic Asynchronous Kernel Launch</p>
</list-item>
<list-item>
<p>2. GPU Static: Static Kernel Launch,&#x20;and</p>
</list-item>
<list-item>
<p>3. GPU Static LB: Static Kernel Launch with Load Balanced Cost Partitioning.</p>
</list-item>
</list>
</p>
<sec id="s3-3-1">
<title>3.3.1 Graphics Processing Units Dynamic: Dynamic Asynchronous Kernel Launch</title>
<p>In the dynamic launch scheme, every individual task is launched independently and asynchronously on the GPU and is allowed to utilize the entire GPU resources to generate the edges assigned to the task. As the edge generation tasks are arbitrarily divisible as previously described (<xref ref-type="bibr" rid="B4">Alam et&#x20;al., 2016</xref>), each edge generation task is divided into multiple blocks and threads. <xref ref-type="other" rid="alg2">Algorithm 2</xref> shows the dynamic launching scheme. The CPU code launches the GPU kernels (line 6 and 9) based on type of the task (whether it is an intra-edge or inter edge generator). To distribute the task across multiple concurrent threads and blocks, we use a fixed GPU threads, <italic>N</italic>
<sub>
<italic>T</italic>
</sub> per block. The number of GPU blocks is then determined by <italic>N</italic>
<sub>
<italic>B</italic>
</sub> (line 5 and 8) based on the computational cost, which in this case is assumed to be the expected number of edges to be generated.</p>
<p>The specific choice of <italic>N</italic>
<sub>
<italic>T</italic>
</sub> and <italic>N</italic>
<sub>
<italic>B</italic>
</sub> varies with the specific GPU hardware being used. For instance, with the GPU used in our experiments, the runtime performance profile from the NVIDIA profiling tool nvprof shows the number of registers per kernel to be 62. Among the choices for <italic>N</italic>
<sub>
<italic>T</italic>
</sub>, 512 threads was observed to provide the best performance, while 1,024 threads is the upper limit considering the number of registers per kernel. The hardware limits set by the graphics card provide up to 128 registers per thread, and the maximum number of registers per block is 65536. This would imply that our kernel can be executed with <italic>N</italic>
<sub>
<italic>T</italic>
</sub> &#x2264; 1024 threads per block without exceeding the hardware register limits. In practice, we found that the <italic>N</italic>
<sub>
<italic>T</italic>
</sub> &#x3d; 512 thread-execution achieves a slightly higher runtime performance than the 1024-thread execution. For this reason, we set the number of threads to 512. Similarly, we used a block size <italic>N</italic>
<sub>
<italic>B</italic>
</sub> of 20000. Although this setting can be varied by problem size, we found experimentally that this value provides the best runtime performance across different networks. However, clearly this choice of block size will in general vary with the specific GPU card, as it does for many GPU applications.</p>
<p>Note that, as multiple GPU kernels are launched asynchronously by the CPU host, we need to synchronize the GPU after a number of kernels (32 in our experiments) are launched, to avoid any scheduling overhead. Between synchronization points, multiple independent GPU streams are used to avoid needless ordering among the kernels, so that the GPU can execute all scheduled tasks whenever hardware resources become available.</p>
<table-wrap id="alg2" position="float">
<label>ALGORITHM 2</label>
<caption>
<p>Dynamic Kernel Launch.</p>
</caption>
<table>
<tbody>
<tr>
<td>
<inline-graphic xlink:href="fdata-04-737963-fx2.tif"/>
</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>Although dynamic launching of kernels is simple to implement and effective in many applications, there are potential disadvantages in the context of graph generation. One of the main problems is that, due to the non-uniformity of work across tasks, the number of edges generated per thread can be low, which makes the thread execution overhead high. Another issue is that the distribution of computation cost across the tasks can be skewed; moreover, the number of tasks can become very high (as in the case of large values of &#x39b;). Therefore, the dynamic scheme can incur significant kernel launch and scheduling overheads. For some of the tasks with a low number of expected edges, the overhead of kernel launch is too high to offset the computational gain from launching that task on the GPU. Note that the problem is magnified when the <inline-formula id="inf60">
<mml:math id="m63">
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula> is higher, as observed later in the experimental evaluation.</p>
</sec>
<sec id="s3-3-2">
<title>3.3.2 Graphics Processing Units Static: Static Kernel Launch</title>
<p>In this static kernel launching scheme, we use a predefined number of blocks (<italic>N</italic>
<sub>
<italic>B</italic>
</sub>) and threads per block (<italic>N</italic>
<sub>
<italic>T</italic>
</sub>) rather than computing those dynamically based on the task workload. This approach is shown in <xref ref-type="other" rid="alg3">Algorithm 3</xref>. There is only one kernel launch call as shown in line 11 using a predefined set of values for <italic>N</italic>
<sub>
<italic>B</italic>
</sub> and <italic>N</italic>
<sub>
<italic>T</italic>
</sub>. Based on the insight that better performance can be achieved by assigning more work to each thread (<xref ref-type="bibr" rid="B39">Volkov, 2010</xref>), this scheme aims to allocate more work to every thread by&#x20;distributing the edge generation tasks evenly among the threads and setting appropriate values of <italic>N</italic>
<sub>
<italic>B</italic>
</sub> and <italic>N</italic>
<sub>
<italic>T</italic>
</sub>. The <italic>&#x3c4;</italic> edge&#x20;generation tasks are distributed evenly among the <italic>N</italic>
<sub>
<italic>B</italic>
</sub> GPU&#x20;blocks. Therefore, each GPU block executes <inline-formula id="inf61">
<mml:math id="m64">
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3c4;</mml:mi>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>&#x3c4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>B</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula> edge&#x20;generation tasks (line 2). A GPU block denoted by <italic>bid</italic> executes tasks from <italic>t</italic>
<sub>
<italic>start</italic>
</sub> to <italic>t</italic>
<sub>
<italic>end</italic>
</sub> (line 3). Each edge generation task is executed by the <italic>N</italic>
<sub>
<italic>T</italic>
</sub> concurrent threads on the GPU&#x20;based&#x20;on the type of the task (intra or inter) on lines 7 and&#x20;9.</p>
<table-wrap id="alg3" position="float">
<label>ALGORITHM 3</label>
<caption>
<p>Static Kernel Launch.</p>
</caption>
<table>
<tbody>
<tr>
<td>
<inline-graphic xlink:href="fdata-04-737963-fx3.tif"/>
</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>A potential issue with the static kernel launch is that it does not specifically account for the computational cost for the processing and scheduling of the edge generation kernels. As the distribution of the computational cost of the tasks can be potentially skewed, the expected number of edges produced by each GPU block may vary significantly. Therefore, some GPU blocks may take significantly longer amounts of time compared to other GPU blocks. Note that the GPU does not guarantee the concurrent execution of all GPU blocks at the same moment on the GPU device; rather, it executes a limited number of GPU blocks concurrently based on the available number of SMs. Once one GPU block finishes execution, it is replaced by another GPU block on the SM. Therefore, to get around this issue, we use a sufficiently large number of GPU blocks <italic>N</italic>
<sub>
<italic>B</italic>
</sub> such that longer GPU blocks can continue to execute on the GPU while shorter GPU blocks finish execution on the GPU and be replaced by other unprocessed blocks.</p>
</sec>
<sec id="s3-3-3">
<title>3.3.3 Graphics Processing Units Static LB: Static Kernel Launch With Load Balancing</title>
<p>To address the problem of skewed distribution of computational costs among the edge generation tasks, we designed another algorithmic variant that starts with the static launch scheme and adds the Uniform Cost Partitioning (UCP) approach presented in our previous CPU-based generator (<xref ref-type="bibr" rid="B4">Alam et&#x20;al., 2016</xref>). In this case, the task boundaries (<italic>t</italic>
<sub>
<italic>start</italic>
</sub> and <italic>t</italic>
<sub>
<italic>end</italic>
</sub>) are determined using a uniform distribution of the computational cost. Each block executes the tasks based on the task boundaries and, therefore, each block has nearly the same expected computational cost as other blocks.</p>
</sec>
</sec>
</sec>
<sec id="s4">
<title>4 Performance Study</title>
<p>In this section, we present an evaluation of our generator and its performance by an experimental study and analysis, in terms of speed of generation and the quality of the output degree distribution. The evaluation is performed using a range of real-world input degree distributions. For the purposes of time analysis, assuming a streaming mode of usage of the graphs, the memory I/O time to write the graph is not included.</p>
<sec id="s4-1">
<title>4.1 Hardware and Software</title>
<p>All experiments are executed on a computer consisting of Intel(R) Xeon(R) Silver 4110 CPU with a 2.1&#xa0;GHz clock speed and 256&#xa0;GB system memory. The machine also incorporates an NVIDIA Tesla V100 GPU with 16&#xa0;GB memory. The operating system is Ubuntu 20.04 LTS. All software on this machine was compiled with GNU gcc 7.4.0 with optimization flags -O3. The CUDA compilation tools V11 were used for the GPU code along with the nvcc compiler.</p>
</sec>
<sec id="s4-2">
<title>4.2 Input Degree Distribution</title>
<p>For the purposes of testing our algorithms, we used degree distributions from publicly available real-world networks (<xref ref-type="bibr" rid="B13">Boldi and Vigna, 2004</xref>; <xref ref-type="bibr" rid="B12">Boldi et&#x20;al., 2008</xref>; <xref ref-type="bibr" rid="B25">Kwak et&#x20;al., 2010</xref>). The networks and their original and coarsened measures are listed in <xref ref-type="table" rid="T1">Table&#x20;1</xref> (degree distribution coarsening will be discussed in the following subsections). The networks vary in the number of vertices, edges, and the number of unique degrees. The number of vertices vary from 1.98&#xa0;million (Hollywood) to 1.07&#xa0;billion (EU-2015), and the number of edges vary from 49&#xa0;million (LiveJournal) to 69&#xa0;billion (FB-Current). Similarly, the sizes of the degree distributions also vary widely. Importantly, the ratio <inline-formula id="inf62">
<mml:math id="m65">
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula> has significant bearing on the GPU-based generation because it determines the amount of variation of workload among the tasks. The lower the ratio, the more uniform the workload distribution, the greater the load balance, and the lower the divergence among GPU threads, as will be seen later in the runtime performance variation for the networks.</p>
<table-wrap id="T1" position="float">
<label>TABLE 1</label>
<caption>
<p>Original and coarsened input degree distributions of the test networks.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th colspan="3" align="left">Network</th>
<th colspan="2" align="center">Original</th>
<th colspan="2" align="center">Coarsened</th>
</tr>
<tr>
<th align="left">Name</th>
<th align="left">Vertices <italic>n</italic>
</th>
<th align="center">Edges <italic>m</italic>
</th>
<th align="center">&#x39b;</th>
<th align="center">
<inline-formula id="inf63">
<mml:math id="m66">
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula>
</th>
<th align="center">&#x39b;&#x2a;</th>
<th align="center">
<inline-formula id="inf64">
<mml:math id="m67">
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2a;</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula>
</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="center">LiveJournal</td>
<td align="center">4,889,483</td>
<td align="center">49,520,700</td>
<td align="center">1,877</td>
<td align="char" char=".">0.0711</td>
<td align="center">1,788</td>
<td align="char" char=".">0.0646</td>
</tr>
<tr>
<td align="center">Hollywood</td>
<td align="center">1,977,070</td>
<td align="center">113,906,622</td>
<td align="center">5,361</td>
<td align="char" char=".">0.2523</td>
<td align="center">3,775</td>
<td align="char" char=".">0.1251</td>
</tr>
<tr>
<td align="center">Twitter</td>
<td align="center">40,603,079</td>
<td align="center">1,153,360,000</td>
<td align="center">14,844</td>
<td align="char" char=".">0.1910</td>
<td align="center">12,876</td>
<td align="char" char=".">0.1437</td>
</tr>
<tr>
<td align="center">Friendster</td>
<td align="center">65,608,366</td>
<td align="center">1,806,065,000</td>
<td align="center">3,148</td>
<td align="char" char=".">0.0055</td>
<td align="center">2,608</td>
<td align="char" char=".">0.0038</td>
</tr>
<tr>
<td align="center">WebGraph</td>
<td align="center">445,394,551</td>
<td align="center">3,140,069,461</td>
<td align="center">26,890</td>
<td align="char" char=".">0.2303</td>
<td align="center">16,018</td>
<td align="char" char=".">0.0817</td>
</tr>
<tr>
<td align="center">UK-Union</td>
<td align="center">127,980,140</td>
<td align="center">4,462,300,000</td>
<td align="center">39,826</td>
<td align="char" char=".">0.3554</td>
<td align="center">23,191</td>
<td align="char" char=".">0.1205</td>
</tr>
<tr>
<td align="center">EU-2015</td>
<td align="center">1,070,557,254</td>
<td align="center">45,896,130,800</td>
<td align="center">71,218</td>
<td align="char" char=".">0.1105</td>
<td align="center">27,723</td>
<td align="char" char=".">0.0167</td>
</tr>
<tr>
<td align="center">FB-Current</td>
<td align="center">721,094,633</td>
<td align="center">69,014,500,000</td>
<td align="center">4,999</td>
<td align="char" char=".">0.0004</td>
<td align="center">4,999</td>
<td align="char" char=".">0.0004</td>
</tr>
</tbody>
</table>
</table-wrap>
</sec>
<sec id="s4-3">
<title>4.3 Generating Networks With Original Input Degree Distribution</title>
<p>
<xref ref-type="table" rid="T2">Table&#x20;2</xref> shows the time taken for the generation of the networks from the test network degree distributions shown in <xref ref-type="table" rid="T1">Table&#x20;1</xref>. The time taken using a single CPU core is compared with the time taken using each of our three algorithmic variants on the GPU. It is observed that the GPU execution is faster than CPU execution across the board. The time varies due to the size of the network and the efficiency of the algorithm.</p>
<table-wrap id="T2" position="float">
<label>TABLE 2</label>
<caption>
<p>Network generation time for original input degree distributions.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th/>
<th colspan="1" align="center">1 CPU core</th>
<th colspan="3" align="center">GPU runtime (s)</th>
<th colspan="1" align="center">CPU-GPU</th>
</tr>
<tr>
<th align="left">Network</th>
<th align="center">Runtime (s)</th>
<th align="left">Static</th>
<th align="left">Static LB</th>
<th align="left">Dynamic</th>
<th align="left">Transfer (s)</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">LiveJournal</td>
<td align="center">2.00</td>
<td align="center">0.03</td>
<td align="center">0.03</td>
<td align="center">3.50</td>
<td align="center">0.150</td>
</tr>
<tr>
<td align="left">Hollywood</td>
<td align="center">5.26</td>
<td align="center">0.20</td>
<td align="center">0.21</td>
<td align="center">29.42</td>
<td align="center">0.154</td>
</tr>
<tr>
<td align="left">Twitter</td>
<td align="center">48.76</td>
<td align="center">1.35</td>
<td align="center">1.44</td>
<td align="center">232.68</td>
<td align="center">0.151</td>
</tr>
<tr>
<td align="left">Friendster</td>
<td align="center">66.61</td>
<td align="center">0.14</td>
<td align="center">0.15</td>
<td align="center">11.41</td>
<td align="center">0.155</td>
</tr>
<tr>
<td align="left">WebGraph</td>
<td align="center">136.04</td>
<td align="center">4.36</td>
<td align="center">4.63</td>
<td align="center">841.12</td>
<td align="center">0.151</td>
</tr>
<tr>
<td align="left">UK-Union</td>
<td align="center">217.01</td>
<td align="center">8.88</td>
<td align="center">9.46</td>
<td align="center">1,880.50</td>
<td align="center">0.151</td>
</tr>
<tr>
<td align="left">EU-2015</td>
<td align="center">1,855.98</td>
<td align="center">34.07</td>
<td align="center">35.88</td>
<td align="center">4,030.49</td>
<td align="center">0.156</td>
</tr>
<tr>
<td align="left">FB-Current</td>
<td align="center">2,518.03</td>
<td align="center">1.37</td>
<td align="center">1.36</td>
<td align="center">30.60</td>
<td align="center">0.150</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>For a more uniform evaluation, the performance is normalized using the metric of millions of events generated on average per second, shown in <xref ref-type="fig" rid="F5">Figure&#x20;5</xref>. The largest generation rate is seen in the case of FB-Current network, followed by the Friendster network. Both these networks have a low value of <inline-formula id="inf65">
<mml:math id="m68">
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula>, which translates to a large amount of concurrency across tasks. In other words, the number of edges to be generated in each task is so large that the overheads associated with thread launches and task assignment are greatly amortized across the&#x20;tasks.</p>
<fig id="F5" position="float">
<label>FIGURE 5</label>
<caption>
<p>Speed of generation (million edges generated per second) for the original input distributions.</p>
</caption>
<graphic xlink:href="fdata-04-737963-g005.tif"/>
</fig>
</sec>
<sec id="s4-4">
<title>4.4 Degree Distribution Coarsening</title>
<p>Since the value of <inline-formula id="inf66">
<mml:math id="m69">
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula> has a strong bearing on the runtime performance, the original input degree distribution needs to be filtered into another equivalent degree distribution that preserves the quality and shape of the distribution that has fewer bins and hence increases the value of <inline-formula id="inf67">
<mml:math id="m70">
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula>.</p>
<p>For this purpose, we designed a degree distribution coarsening method shown in <xref ref-type="other" rid="alg4">Algorithm 4</xref>. This method is based on an intuitive approach as follows.</p>
<p>In large-scale networks, as the number of vertices gets larger, the number of unique degrees also becomes larger. This increases the number groups, &#x39b;. However, we notice from the test networks that there are many unique degrees that are relatively close together, that is, <italic>d</italic>
<sub>
<italic>i</italic>
</sub> and <italic>d</italic>
<sub>
<italic>i</italic>&#x2b;1</sub> differ only by very small amounts (for example, <italic>d</italic>
<sub>
<italic>i</italic>&#x2b;1</sub> &#x3d; <italic>d</italic>
<sub>
<italic>i</italic>
</sub> &#x2b; 1). When <italic>d</italic>
<sub>
<italic>i</italic>
</sub> is relatively large (such as <italic>d</italic>
<sub>
<italic>i</italic>
</sub> &#x3d; 1,000, it is clear that they can be practically considered equal. However, without any adjustments, the GPU algorithm will consider them as two distinct groups and spend increased amount of computational time in generating many inter edges and correspondingly fewer intra edges. Because intra edge generation is much faster than inter edge generation, and since the number of tasks grows quadratically with the number of groups, the needless distinction between <italic>d</italic>
<sub>
<italic>i</italic>
</sub> and <italic>d</italic>
<sub>
<italic>i</italic>&#x2b;1</sub> when they are quantitatively close creates a significant runtime overhead. Therefore, in our coarsening method, we coalesce groups whose degrees are numerically close to each&#x20;other.</p>
<p>Quantitatively, we define a tolerance <italic>&#x3b4;</italic> such that <italic>d</italic>
<sub>
<italic>i</italic>
</sub> and <italic>d</italic>
<sub>
<italic>i</italic>&#x2b;1</sub> are coalesced when <italic>d</italic>
<sub>
<italic>i</italic>&#x2b;1</sub> &#x2264; (1 &#x2b; <italic>&#x3b4;</italic>)<italic>d</italic>
<sub>
<italic>i</italic>
</sub>, where a specific value of <italic>&#x3b4;</italic> is chosen for a given network, 0 &#x3c; <italic>&#x3b4;</italic> &#x2264; 1 (for EU-2015, <italic>&#x3b4;</italic> &#x3d; 0.02, for example). The coalesced groups (<italic>d</italic>
<sub>
<italic>i</italic>
</sub>, <italic>n</italic>
<sub>
<italic>i</italic>
</sub>) and (<italic>d</italic>
<sub>
<italic>i</italic>&#x2b;1</sub>, <italic>n</italic>
<sub>
<italic>i</italic>&#x2b;1</sub>) are replaced by a composite group <inline-formula id="inf68">
<mml:math id="m71">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>, where <inline-formula id="inf69">
<mml:math id="m72">
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>x</mml:mi>
<mml:mi>y</mml:mi>
<mml:mi>z</mml:mi>
</mml:math>
</inline-formula> and <inline-formula id="inf70">
<mml:math id="m73">
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>x</mml:mi>
<mml:mi>y</mml:mi>
<mml:mi>z</mml:mi>
</mml:math>
</inline-formula>. Note that, after coalescing, the groups are shifted left and reduced in number by one, that is, (<italic>d</italic>
<sub>
<italic>i</italic>
</sub>, <italic>n</italic>
<sub>
<italic>i</italic>
</sub>) is replaced by <inline-formula id="inf71">
<mml:math id="m74">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>, and (<italic>d</italic>
<sub>
<italic>i</italic>&#x2b;1</sub>, <italic>n</italic>
<sub>
<italic>i</italic>&#x2b;1</sub>) is removed from the distribution.</p>
<p>At the lower end of the degree distribution, the distinction between the degrees would be important to preserve, even if they are relatively close together. Therefore, we define a lower threshold <italic>d</italic>
<sub>
<italic>cut</italic>
</sub> below which we do not alter the degree distribution. In other words, all <italic>d</italic>
<sub>
<italic>i</italic>
</sub> &#x2264; <italic>d</italic>
<sub>
<italic>cut</italic>
</sub> of the original input distribution are preserved unmodified in the coarsened input distribution.</p>
<table-wrap id="alg4" position="float">
<label>ALGORITHM 4</label>
<caption>
<p>Input Degree Distribution Coarsening Algorithm.</p>
</caption>
<table>
<tbody>
<tr>
<td>
<inline-graphic xlink:href="fdata-04-737963-fx4.tif"/>
</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>In <xref ref-type="fig" rid="F6">Figure&#x20;6</xref>, the original input degree distributions are compared with the coarsened input distribution by plotting the number of vertices for each degree contained in the distribution. The plots show a close match of the distribution even while reducing the number of groups and increasing the group sizes. In <xref ref-type="table" rid="T1">Table&#x20;1</xref>, the number of groups, &#x39b;, of the original input distribution is compared with the reduced number of groups, &#x39b;&#x2a;, after coarsening the distribution. For networks such as UK-Union and EU-2015, the improvement in the smoothness is significant. This is evident both in the reduction in the number of groups from &#x39b; to &#x39b;&#x2a;, and corresponding reduction from <inline-formula id="inf72">
<mml:math id="m75">
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula> to <inline-formula id="inf73">
<mml:math id="m76">
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2a;</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula>. Because the number of tasks increases as the square of the number of groups, the reductions from coarsening results in significantly fewer and more uniformly loaded tasks for execution on the GPU threads. This in turn results in reduction in the overheads for thread launch and also reduces the unevenness in the amount of work per task as shown in <xref ref-type="fig" rid="F7">Figure&#x20;7</xref>.</p>
<fig id="F6" position="float">
<label>FIGURE 6</label>
<caption>
<p>Comparison of the original input degree distributions and coarsened input degree distributions.</p>
</caption>
<graphic xlink:href="fdata-04-737963-g006.tif"/>
</fig>
<fig id="F7" position="float">
<label>FIGURE 7</label>
<caption>
<p>Million edges generated per second for the coarsened distribution.</p>
</caption>
<graphic xlink:href="fdata-04-737963-g007.tif"/>
</fig>
</sec>
<sec id="s4-5">
<title>4.5 Generating Networks With Coarsened Input Degree Distribution</title>
<p>
<xref ref-type="table" rid="T3">Table&#x20;3</xref> shows the time taken for the generation of the networks from the test input degree distributions of <xref ref-type="table" rid="T1">Table&#x20;1</xref> after applying the coarsening algorithm on them. Compared to the time taken with the original input distributions, the time taken with the coarsened input distributions is significantly reduced for some networks. On the CPU, the time is largely unchanged, but the time on the GPU is significantly reduced. This is particularly pronounced for EU-2015 in which the coarsening significantly reduced the number of groups from 71,218 to 27,723 even while maintaining roughly the same distribution as seen in <xref ref-type="fig" rid="F6">Figure&#x20;6</xref>. Similarly, for UK-Union, the number of groups is reduced by coarsening from 39,826 groups to 23,191.</p>
<table-wrap id="T3" position="float">
<label>TABLE 3</label>
<caption>
<p>Network generation time from coarsened input degree distribution.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="left"/>
<th colspan="1" align="center">1 CPU core</th>
<th colspan="3" align="center">GPU runtime (s)</th>
<th colspan="1" align="center">CPU-GPU</th>
</tr>
<tr>
<th align="left">Network</th>
<th align="center">Runtime (s)</th>
<th align="left">Static</th>
<th align="left">Static LB</th>
<th align="left">Dynamic</th>
<th align="left">Transfer (s)</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">LiveJournal</td>
<td align="center">2.01</td>
<td align="center">0.02</td>
<td align="center">0.03</td>
<td align="center">3.21</td>
<td align="center">0.154</td>
</tr>
<tr>
<td align="left">Hollywood</td>
<td align="center">4.85</td>
<td align="center">0.12</td>
<td align="center">0.12</td>
<td align="center">14.20</td>
<td align="center">0.153</td>
</tr>
<tr>
<td align="left">Twitter</td>
<td align="center">47.32</td>
<td align="center">1.08</td>
<td align="center">1.14</td>
<td align="center">177.29</td>
<td align="center">0.156</td>
</tr>
<tr>
<td align="left">Friendster</td>
<td align="center">66.28</td>
<td align="center">0.12</td>
<td align="center">0.12</td>
<td align="center">6.97</td>
<td align="center">0.151</td>
</tr>
<tr>
<td align="left">WebGraph</td>
<td align="center">120.11</td>
<td align="center">1.93</td>
<td align="center">2.02</td>
<td align="center">380.90</td>
<td align="center">0.152</td>
</tr>
<tr>
<td align="left">UK-Union</td>
<td align="center">184.26</td>
<td align="center">3.50</td>
<td align="center">3.71</td>
<td align="center">645.57</td>
<td align="center">0.156</td>
</tr>
<tr>
<td align="left">EU-2015</td>
<td align="center">1,707.34</td>
<td align="center">8.49</td>
<td align="center">8.69</td>
<td align="center">1,030.88</td>
<td align="center">0.154</td>
</tr>
<tr>
<td align="left">FB-Current</td>
<td align="center">2,518.03</td>
<td align="center">1.37</td>
<td align="center">1.36</td>
<td align="center">30.60</td>
<td align="center">0.156</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>The factor of improvement in generation time when moving from the original input distributions to the coarsened input distributions is shown in <xref ref-type="fig" rid="F8">Figure&#x20;8</xref>. It is seen that the run time is largely unaffected on the CPU because the single-core execution is largely insensitive to the workload variation among the tasks; the large amount of CPU caching capacity works well to smooth out most such variations in the working set of the application. However, the gains are most prominent on the GPU, especially for those distributions that exhibit wide variance among the task workloads. As expected, the largest gains are observed for the EU-2015 network, and the next best is observed for the UK-Union and WebGraph data sets. The speed is nearly doubled in the case of Hollywood and nearly quadrupled in the case of EU-2015. Also, speed is more than doubled for WebGraph and UK-Union. However, in the others, coarsening does not lead to any appreciable reductions in &#x39b; and consequently does not appreciably improve the generation&#x20;time.</p>
<fig id="F8" position="float">
<label>FIGURE 8</label>
<caption>
<p>Factor of improvement in run time using coarsened versus original distribution.</p>
</caption>
<graphic xlink:href="fdata-04-737963-g008.tif"/>
</fig>
<p>In <xref ref-type="fig" rid="F9">Figure&#x20;9</xref>, the output degree distributions of the generated networks are compared between the original and coarsened inputs to validate the output degree distribution. The output distributions show very close match between the output networks generated from the original input distributions and the output networks generated from the coarsened input distributions. The closeness of the distributions of the generated networks to the input distributions have been quantitatively verified using the Kullback-Leibler (K-L) divergence metric (also called relative entropy). For example, in the case of the Twitter network, the difference is 0.11% and in the case of the UK-Union network, the difference is 0.24%. These are taken as acceptable differences due to the randomness of the generated networks. These are documented in our previous work with CPU-based algorithms (<xref ref-type="bibr" rid="B3">Alam and Khan, 2015</xref>; <xref ref-type="bibr" rid="B4">Alam et&#x20;al., 2016</xref>).</p>
<fig id="F9" position="float">
<label>FIGURE 9</label>
<caption>
<p>Validating the output degree distribution from coarsened input distributions by comparison with that from original input distributions.</p>
</caption>
<graphic xlink:href="fdata-04-737963-g009.tif"/>
</fig>
</sec>
<sec id="s4-6">
<title>4.6 Graphics Processing Units Performance Metrics</title>
<p>In this section, we measure the performance of the GPU kernels for network generation. The performance metrics was collected using the native NVIDIA Profiler (nvprof) using various performance metrics. The summary of the results is presented in <xref ref-type="table" rid="T4">Table&#x20;4</xref>. For this profile, we use the static version of the algorithm, executed with 512 threads per block. The number of blocks is set to 20,000, which delivers the highest performance. The profiles are collected for the smallest and largest networks, namely, LiveJournal and FB-Current, respectively.</p>
<table-wrap id="T4" position="float">
<label>TABLE 4</label>
<caption>
<p>Performance metrics of the kernels using the NVIDIA Profiler nvprof.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th colspan="1" align="left">Metrics</th>
<th colspan="1" align="center">Smallest graph</th>
<th colspan="1" align="center">Largest graph</th>
</tr>
<tr>
<th align="left"/>
<th align="center">(LiveJournal)</th>
<th align="center">(FB-current)</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">Registers/thread</td>
<td align="char" char=".">62</td>
<td align="char" char=".">62</td>
</tr>
<tr>
<td align="left">Theoretical occupancy</td>
<td align="char" char=".">50.00%</td>
<td align="char" char=".">50.00%</td>
</tr>
<tr>
<td align="left">Achieved occupancy</td>
<td align="char" char=".">39.19%</td>
<td align="char" char=".">45.70%</td>
</tr>
<tr>
<td align="left">SM efficiency</td>
<td align="char" char=".">99.66%</td>
<td align="char" char=".">99.65%</td>
</tr>
<tr>
<td align="left">Branch efficiency</td>
<td align="char" char=".">96.48%</td>
<td align="char" char=".">89.60%</td>
</tr>
<tr>
<td align="left">Warp execution efficiency</td>
<td align="char" char=".">89.55%</td>
<td align="char" char=".">77.18%</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>The registers/thread, which is the number of registers used by each kernel executing within one thread, is determined to be 62, which allows our kernel to have 100% theoretical occupancy. Theoretical occupancy is the number of threads in a warp that were executed compared to the maximum number of threads that could be executed. Although our kernels can be launched with 100% occupancy, we use a lower level of 50% theoretical occupancy, which gives better runtime performance due to other caching effects&#x2013;this is in line with the insight in the literature on other applications that a lower level of occupancy can increase runtime performance to an extent (<xref ref-type="bibr" rid="B39">Volkov, 2010</xref>). Our achieved occupancy (45.70% for the large network) comes close to the theoretical occupancy. The streaming multiprocessor (SM) efficiency, which is the percentage of time the SM is busy doing application&#x2019;s work, as opposed to scheduling and blocking operations, is very high at 99.6%. Branch efficiency is also observed to be very high (96.48%) on a small network, and fairly high (89.60%) on the largest network.</p>
</sec>
</sec>
<sec id="s5">
<title>5 Summary and Future Work</title>
<p>We presented a novel GPU-based algorithm for generating large random networks that conform to desired degree distributions provided as input. To our knowledge, this is the first algorithm designed, implemented, and evaluated on GPUs for degree distribution-defined network generation. Three algorithmic variants are presented for execution on the GPU based on the different scheduling strategies for mapping the generation tasks to GPU threads. The algorithms have been implemented on a modern NVIDIA GPU and a detailed performance study has been performed using the degree distributions of a range of test networks containing millions to billions of edges. The effect of task size in terms of the number of edges to be generated is observed to have significant bearing on the performance for some test networks. To further improve the performance of the generator on the SIMT architectures of GPUs, a distribution coarsening method has been designed and implemented, which retains the sizes and quality of the input distributions while generating similar output distributions at an increased rate. The overall network generation rates observed from our performance study exceeds 50&#xa0;billion edges generation per second, which is among the fastest generation rates reported in the literature using a single desktop computer.</p>
<p>Modern workstations commonly offer more than one GPU connected to the same system. Our algorithm can be extended to exploit the multi-GPU systems by scheduling the tasks across multiple GPUs, which we intend to explore in future work. Similarly, many modern high performance parallel computing systems offer multiple interconnected machines, each containing one or more GPUs. The approach presented here could be extended to such distributed cluster of GPUs for increased scale and speed of network generation.</p>
</sec>
</body>
<back>
<sec id="s6">
<title>Data Availability Statement</title>
<p>Publicly available datasets were analyzed in this study. This data can be found here: Webgraph, <ext-link ext-link-type="uri" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://webgraph.di.unimi.it">https://webgraph.di.unimi.it</ext-link>.</p>
</sec>
<sec id="s7">
<title>Author Contributions</title>
<p>MA and KP equally contributed to the technical development and write up. KP provided the oversight, motivation, and development structure.</p>
</sec>
<sec sec-type="COI-statement" id="s8">
<title>Conflict of Interest</title>
<p>The authors declare that the research was conducted in the absence of any commercial or financial relationships that could be construed as a potential conflict of interest.</p>
</sec>
<sec sec-type="disclaimer" id="s9">
<title>Publisher&#x2019;s Note</title>
<p>All claims expressed in this article are solely those of the authors and do not necessarily represent those of their affiliated organizations, or those of the publisher, the editors and the reviewers. Any product that may be evaluated in this article, or claim that may be made by its manufacturer, is not guaranteed or endorsed by the publisher.</p>
</sec>
<ref-list>
<title>References</title>
<ref id="B1">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Alam</surname>
<given-names>M.</given-names>
</name>
</person-group> (<year>2016</year>). <article-title>HPC-based Parallel Algorithms For Generating Random Networks And Some Other Network Analysis Problems</article-title>. <comment>Ph.D. thesis</comment>. <publisher-loc>Salt Lake City</publisher-loc>: <publisher-name>Virginia Tech</publisher-name>. </citation>
</ref>
<ref id="B2">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Alam</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Khan</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Marathe</surname>
<given-names>M. V.</given-names>
</name>
</person-group> (<year>2013</year>). &#x201c;<article-title>Distributed-memory Parallel Algorithms for Generating Massive Scale-free Networks Using Preferential Attachment Model</article-title>,&#x201d; in <conf-name>Proceedings of the International Conference on High Performance Computing, Networking, Storage and Analysis (ACM)</conf-name>, <conf-loc>Denver, Colorado</conf-loc>, <fpage>1</fpage>&#x2013;<lpage>12</lpage>. <pub-id pub-id-type="doi">10.1145/2503210.2503291</pub-id> </citation>
</ref>
<ref id="B3">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Alam</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Khan</surname>
<given-names>M.</given-names>
</name>
</person-group> (<year>2015</year>). <article-title>Parallel Algorithms for Generating Random Networks with Given Degree Sequences</article-title>. <source>Int. J.&#x20;Parallel Prog</source>. <comment>Springer</comment> <volume>45</volume>, <fpage>109</fpage>&#x2013;<lpage>127</lpage>. <pub-id pub-id-type="doi">10.1007/s10766-015-0389-y</pub-id> </citation>
</ref>
<ref id="B4">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Alam</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Khan</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Vullikanti</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Marathe</surname>
<given-names>M.</given-names>
</name>
</person-group> (<year>2016</year>). &#x201c;<article-title>An Efficient and Scalable Algorithmic Method for Generating Large-Scale Random Graphs</article-title>,&#x201d; in <conf-name>SC16: International Conference for High Performance Computing, Networking, Storage and Analysis</conf-name>, <conf-loc>Salt Lake City, Utah</conf-loc> (<publisher-loc>Salt Lake City, Utah</publisher-loc>: <publisher-name>IEEE</publisher-name>), <fpage>32:1</fpage>&#x2013;<lpage>32:12</lpage>. <pub-id pub-id-type="doi">10.1109/sc.2016.31</pub-id> </citation>
</ref>
<ref id="B5">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Alam</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Perumalla</surname>
<given-names>K. S.</given-names>
</name>
</person-group> (<year>2017a</year>). <article-title>Generating Billion-Edge Scale-free Networks in Seconds: Performance Study of a Novel GPU-Based Preferential Attachment Model</article-title>. <publisher-name>Oak Ridge National Laboratory</publisher-name>. <comment>Tech. Rep</comment>. <comment>ORNL/TM-2017/486</comment>. <pub-id pub-id-type="doi">10.2172/1399438</pub-id> </citation>
</ref>
<ref id="B6">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Alam</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Perumalla</surname>
<given-names>K. S.</given-names>
</name>
</person-group> (<year>2017b</year>). &#x201c;<article-title>GPU-based Parallel Algorithm for Generating Massive Scale-free Networks Using the Preferential Attachment Model</article-title>,&#x201d; in <conf-name>IEEE International Conference on Big Data (Big Data)</conf-name>, <conf-loc>Boston, MA, USA</conf-loc> (<publisher-name>IEEE</publisher-name>), <fpage>3302</fpage>&#x2013;<lpage>3311</lpage>. <pub-id pub-id-type="doi">10.1109/bigdata.2017.8258315</pub-id> </citation>
</ref>
<ref id="B7">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Alam</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Perumalla</surname>
<given-names>K. S.</given-names>
</name>
<name>
<surname>Sanders</surname>
<given-names>P.</given-names>
</name>
</person-group> (<year>2019</year>). <article-title>Novel Parallel Algorithms for Fast Multi-GPU-Based Generation of Massive Scale-free Networks</article-title>. <source>Data Sci. Eng.</source> <volume>4</volume>, <fpage>61</fpage>&#x2013;<lpage>75</lpage>. <pub-id pub-id-type="doi">10.1007/s41019-019-0088-6</pub-id> </citation>
</ref>
<ref id="B8">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Albert</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Jeong</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Barab&#xe1;si</surname>
<given-names>A.-L.</given-names>
</name>
</person-group> (<year>2000</year>). <article-title>Error and Attack Tolerance of Complex Networks</article-title>. <source>Nature</source> <volume>406</volume>, <fpage>378</fpage>&#x2013;<lpage>382</lpage>. <pub-id pub-id-type="doi">10.1038/35019019</pub-id> </citation>
</ref>
<ref id="B9">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Azadbakht</surname>
<given-names>K.</given-names>
</name>
<name>
<surname>Bezirgiannis</surname>
<given-names>N.</given-names>
</name>
<name>
<surname>de Boer</surname>
<given-names>F. S.</given-names>
</name>
<name>
<surname>Aliakbary</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2016</year>). &#x201c;<article-title>A High-Level and Scalable Approach for Generating Scale-free Graphs Using Active Objects</article-title>,&#x201d; in <conf-name>Proceedings of the 31st Annual ACM Symposium on Applied Computing - SAC</conf-name>, <conf-loc>Pisa, Italy</conf-loc> (<publisher-name>ACM Press</publisher-name>). <pub-id pub-id-type="doi">10.1145/2851613.2851722</pub-id> </citation>
</ref>
<ref id="B10">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Baraba&#x301;si</surname>
<given-names>A.-L.</given-names>
</name>
<name>
<surname>Albert</surname>
<given-names>R.</given-names>
</name>
</person-group> (<year>1999</year>). <article-title>Emergence of Scaling in Random Networks</article-title>. <source>Science</source> <volume>286</volume>, <fpage>509</fpage>&#x2013;<lpage>512</lpage>. <pub-id pub-id-type="doi">10.1126/science.286.5439.509</pub-id> </citation>
</ref>
<ref id="B11">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Batagelj</surname>
<given-names>V.</given-names>
</name>
<name>
<surname>Brandes</surname>
<given-names>U.</given-names>
</name>
</person-group> (<year>2005</year>). <article-title>Efficient Generation of Large Random Networks</article-title>. <source>Phys. Rev. E.</source> <volume>71</volume>, <fpage>036113</fpage>. <pub-id pub-id-type="doi">10.1103/physreve.71.036113</pub-id> </citation>
</ref>
<ref id="B12">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Boldi</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Santini</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Vigna</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2008</year>). <article-title>A Large Time-Aware Web Graph</article-title>. <source>SIGIR Forum</source> <volume>42</volume>, <fpage>33</fpage>&#x2013;<lpage>38</lpage>. <pub-id pub-id-type="doi">10.1145/1480506.1480511</pub-id> </citation>
</ref>
<ref id="B13">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Boldi</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Vigna</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2004</year>). &#x201c;<article-title>The Webgraph Framework I: Compression Techniques</article-title>,&#x201d; in <conf-name>International World Wide Web Conference(ACM)</conf-name>, <conf-loc>New York, NY USA</conf-loc>, <fpage>595</fpage>&#x2013;<lpage>601</lpage>. <pub-id pub-id-type="doi">10.1145/988672.988752</pub-id> </citation>
</ref>
<ref id="B14">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Carlson</surname>
<given-names>J.&#x20;M.</given-names>
</name>
<name>
<surname>Doyle</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>1999</year>). <article-title>Highly Optimized Tolerance: A Mechanism for Power Laws in Designed Systems</article-title>. <source>Phys. Rev. E.</source> <volume>60</volume>, <fpage>1412</fpage>&#x2013;<lpage>1427</lpage>. <pub-id pub-id-type="doi">10.1103/physreve.60.1412</pub-id> </citation>
</ref>
<ref id="B15">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Chakrabarti</surname>
<given-names>D.</given-names>
</name>
<name>
<surname>Zhan</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Faloutsos</surname>
<given-names>C.</given-names>
</name>
</person-group> (<year>2004</year>). &#x201c;<article-title>R-mat: A Recursive Model for Graph Mining</article-title>,&#x201d; in <conf-name>SIAM International Conference on Data Mining</conf-name>, <conf-loc>Lake Buena Vista, Florida</conf-loc>, <fpage>442</fpage>&#x2013;<lpage>446</lpage>. <pub-id pub-id-type="doi">10.1137/1.9781611972740.43</pub-id> </citation>
</ref>
<ref id="B16">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Chung</surname>
<given-names>F.</given-names>
</name>
<name>
<surname>Lu</surname>
<given-names>L.</given-names>
</name>
</person-group> (<year>2002b</year>). <article-title>Connected Components in Random Graphs with Given Expected Degree Sequences</article-title>. <source>Ann. Combinatorics</source> <volume>6</volume>, <fpage>125</fpage>&#x2013;<lpage>145</lpage>. <pub-id pub-id-type="doi">10.1007/pl00012580</pub-id> </citation>
</ref>
<ref id="B17">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Chung</surname>
<given-names>F.</given-names>
</name>
<name>
<surname>Lu</surname>
<given-names>L.</given-names>
</name>
</person-group> (<year>2002a</year>). <article-title>The Average Distances in Random Graphs with Given Expected Degrees</article-title>. <source>Proc. Natl. Acad. Sci.</source> <comment>National Academy of Sciences of the United&#x20;States of America</comment> <volume>99</volume>, <fpage>15879</fpage>&#x2013;<lpage>15882</lpage>. <pub-id pub-id-type="doi">10.1073/pnas.252631999</pub-id> </citation>
</ref>
<ref id="B18">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Erd&#x151;s</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>R&#xe9;nyi</surname>
<given-names>A.</given-names>
</name>
</person-group> (<year>1960</year>). <source>On the Evolution of Random Graphs</source>. <publisher-loc>London</publisher-loc>: <publisher-name>Publications of the Mathematical Institute of the Hungarian Academy of Sciences</publisher-name> <comment>4</comment>, <fpage>17</fpage>&#x2013;<lpage>61</lpage>. </citation>
</ref>
<ref id="B19">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Faloutsos</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Faloutsos</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Faloutsos</surname>
<given-names>C.</given-names>
</name>
</person-group> (<year>1999</year>). <article-title>On Power-Law Relationships of the Internet Topology</article-title>. <source>SIGCOMM Comput. Commun. Rev</source>. <comment>ACM Press</comment> <volume>29</volume>, <fpage>251</fpage>&#x2013;<lpage>262</lpage>. <pub-id pub-id-type="doi">10.1145/316194.316229</pub-id> </citation>
</ref>
<ref id="B20">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Frank</surname>
<given-names>O.</given-names>
</name>
<name>
<surname>Strauss</surname>
<given-names>D.</given-names>
</name>
</person-group> (<year>1986</year>). <article-title>Markov Graphs</article-title>. <source>J.&#x20;Am. Stat. Assoc.</source> <volume>81</volume>, <fpage>832</fpage>&#x2013;<lpage>842</lpage>. <pub-id pub-id-type="doi">10.1080/01621459.1986.10478342</pub-id> </citation>
</ref>
<ref id="B21">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Funke</surname>
<given-names>D.</given-names>
</name>
<name>
<surname>Lamm</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Meyer</surname>
<given-names>U.</given-names>
</name>
<name>
<surname>Penschuck</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Sanders</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Schulz</surname>
<given-names>C.</given-names>
</name>
<etal/>
</person-group> (<year>2019</year>). <article-title>Communication-Free Massively Distributed Graph Generation</article-title>. <source>J. Parallel. Distrib. Comput.</source> <volume>131</volume>, <fpage>200</fpage>&#x2013;<lpage>217</lpage>. <pub-id pub-id-type="doi">10.1016/j.jpdc.2019.03.011</pub-id> </citation>
</ref>
<ref id="B22">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Girvan</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Newman</surname>
<given-names>M. E. J.</given-names>
</name>
</person-group> (<year>2002</year>). <article-title>Community Structure in Social and Biological Networks</article-title>. <source>Proc. Natl. Acad. Sci.</source> <volume>99</volume>, <fpage>7821</fpage>&#x2013;<lpage>7826</lpage>. <pub-id pub-id-type="doi">10.1073/pnas.122653799</pub-id> </citation>
</ref>
<ref id="B23">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Holland</surname>
<given-names>P. W.</given-names>
</name>
<name>
<surname>Laskey</surname>
<given-names>K. B.</given-names>
</name>
<name>
<surname>Leinhardt</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>1983</year>). <article-title>Stochastic Blockmodels: First Steps</article-title>. <source>Social Networks</source> <volume>5</volume>, <fpage>109</fpage>&#x2013;<lpage>137</lpage>. <pub-id pub-id-type="doi">10.1016/0378-8733(83)90021-7</pub-id> </citation>
</ref>
<ref id="B24">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Kepner</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Samsi</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Arcand</surname>
<given-names>W.</given-names>
</name>
<name>
<surname>Bestor</surname>
<given-names>D.</given-names>
</name>
<name>
<surname>Bergeron</surname>
<given-names>B.</given-names>
</name>
<name>
<surname>Davis</surname>
<given-names>T.</given-names>
</name>
<etal/>
</person-group> (<year>2018</year>). &#x201c;<article-title>Design, Generation, and Validation of Extreme Scale Power-Law Graphs</article-title>,&#x201d; in <conf-name>IEEE International Parallel and Distributed Processing Symposium Workshops (IPDPSW)</conf-name>, <conf-loc>Vancouver, BC</conf-loc>, <fpage>279</fpage>&#x2013;<lpage>286</lpage>. <pub-id pub-id-type="doi">10.1016/0378-8733(83)90021-7</pub-id> </citation>
</ref>
<ref id="B25">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Kwak</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Lee</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Park</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Moon</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2010</year>). &#x201c;<article-title>What Is Twitter, a Social Network or a News media</article-title>,&#x201d; in <conf-name>International World Wide Web Conference Committee</conf-name>, <conf-loc>Raleigh, North Carolina, USA</conf-loc>, <fpage>1</fpage>&#x2013;<lpage>10</lpage>. <pub-id pub-id-type="doi">10.1145/1772690.1772751</pub-id> </citation>
</ref>
<ref id="B26">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Leis</surname>
<given-names>V.</given-names>
</name>
<name>
<surname>Kemper</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Neumann</surname>
<given-names>T.</given-names>
</name>
</person-group> (<year>2013</year>). &#x201c;<article-title>The Adaptive Radix Tree: Artful Indexing for Main-Memory Databases</article-title>,&#x201d; in <conf-name>IEEE International Conference on Data Engineering</conf-name>, <conf-loc>Brisbane, Australia</conf-loc> (<publisher-name>IEEE</publisher-name>), <fpage>38</fpage>&#x2013;<lpage>49</lpage>. <pub-id pub-id-type="doi">10.1109/ICDE.2013.6544812</pub-id> </citation>
</ref>
<ref id="B27">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Leskovec</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>2008</year>). <source>Dynamics of Large Networks</source>. <comment>Ph.D. thesis</comment>. <publisher-loc>Pittsburgh</publisher-loc>: <publisher-name>Carnegie Mellon University</publisher-name>. </citation>
</ref>
<ref id="B28">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Leskovec</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Faloutsos</surname>
<given-names>C.</given-names>
</name>
</person-group> (<year>2007</year>). &#x201c;<article-title>Scalable Modeling of Real Graphs Using Kronecker Multiplication</article-title>,&#x201d; in <conf-name>International Conference on Machine Learning</conf-name>, <conf-loc>Corvalis, Oregon, USA</conf-loc>, <fpage>497</fpage>&#x2013;<lpage>504</lpage>. <pub-id pub-id-type="doi">10.1145/1273496.1273559</pub-id> </citation>
</ref>
<ref id="B29">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Leskovec</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>2010</year>). <article-title>Kronecker Graphs: An Approach to Modeling Networks</article-title>. <source>J.&#x20;Machine Learn. Res.</source> <volume>11</volume>, <fpage>985</fpage>&#x2013;<lpage>1042</lpage>. <pub-id pub-id-type="doi">10.5555/1756006.1756039</pub-id> </citation>
</ref>
<ref id="B30">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Meyer</surname>
<given-names>U.</given-names>
</name>
<name>
<surname>Penschuck</surname>
<given-names>M.</given-names>
</name>
</person-group> (<year>2016</year>). &#x201c;<article-title>Generating Massive Scale-free Networks under Resource Constraints</article-title>,&#x201d; in <conf-name>Proceedings of the Eighteenth Workshop on Algorithm Engineering and Experiments (ALENEX)</conf-name>, <conf-loc>Arlington, Virginia, USA</conf-loc>. <publisher-name>Society for Industrial and Applied Mathematics</publisher-name>. <pub-id pub-id-type="doi">10.1137/1.9781611974317.4</pub-id> </citation>
</ref>
<ref id="B31">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Miller</surname>
<given-names>J.&#x20;C.</given-names>
</name>
<name>
<surname>Hagberg</surname>
<given-names>A.</given-names>
</name>
</person-group> (<year>2011</year>). <article-title>Efficient Generation of Networks with Given Expected Degrees</article-title>,&#x201d; in <conf-name>International Workshop on Algorithms and Models for the Web-Graph</conf-name>, <conf-loc>Springer, Berlin, Heidelberg</conf-loc>. <comment>6732. LNCS</comment>, <fpage>115</fpage>&#x2013;<lpage>126</lpage>. </citation>
</ref>
<ref id="B32">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Nobari</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Lu</surname>
<given-names>X.</given-names>
</name>
<name>
<surname>Karras</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Bressan</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2011</year>). <article-title>Fast Random Graph Generation</article-title>. <source>Int. Conf. Extending Database Tech.</source> <volume>331</volume>, <fpage>331</fpage>&#x2013;<lpage>342</lpage>. <pub-id pub-id-type="doi">10.1145/1951365.1951406</pub-id> </citation>
</ref>
<ref id="B33">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Penschuck</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Brandes</surname>
<given-names>U.</given-names>
</name>
<name>
<surname>Hamann</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Lamm</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Meyer</surname>
<given-names>U.</given-names>
</name>
<name>
<surname>Safro</surname>
<given-names>I.</given-names>
</name>
<etal/>
</person-group> (<year>2020</year>). <article-title>Recent Advances in Scalable Network Generation</article-title>. <source>CoRR</source> <comment>arXiv</comment>. <comment>Available at: <ext-link ext-link-type="uri" xlink:href="https://arxiv.org/abs/2003.00736">https://arxiv.org/abs/2003.00736</ext-link>
</comment>. </citation>
</ref>
<ref id="B34">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Pinar</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Seshadhri</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Kolda</surname>
<given-names>T. G.</given-names>
</name>
</person-group> (<year>2012</year>). &#x201c;<article-title>The Similarity between Stochastic Kronecker and Chung-Lu Graph Models</article-title>,&#x201d; in <conf-name>SIAM International Conference on Data Mining</conf-name>, <conf-loc>Anaheim, California, USA</conf-loc>, <fpage>1071</fpage>&#x2013;<lpage>1082</lpage>. <pub-id pub-id-type="doi">10.1137/1.9781611972825.92</pub-id> </citation>
</ref>
<ref id="B35">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Robins</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>Pattison</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Kalish</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Lusher</surname>
<given-names>D.</given-names>
</name>
</person-group> (<year>2007</year>). <article-title>An Introduction to Exponential Random Graph (P&#x2a;) Models for Social Networks</article-title>. <source>Soc. Networks</source> <volume>29</volume>, <fpage>173</fpage>&#x2013;<lpage>191</lpage>. <pub-id pub-id-type="doi">10.1016/j.socnet.2006.08.002</pub-id> </citation>
</ref>
<ref id="B36">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Sanders</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Schulz</surname>
<given-names>C.</given-names>
</name>
</person-group> (<year>2016</year>). <article-title>Scalable Generation of Scale-free Graphs</article-title>. <source>Inf. Process. Lett.</source> <volume>116</volume>, <fpage>489</fpage>&#x2013;<lpage>491</lpage>. <pub-id pub-id-type="doi">10.1016/j.ipl.2016.02.004</pub-id> </citation>
</ref>
<ref id="B37">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Shang</surname>
<given-names>Y.</given-names>
</name>
</person-group> (<year>2010</year>). <article-title>Groupies in Random Bipartite Graphs</article-title>. <source>Appl. Anal. Discrete M.</source> <volume>4</volume>, <fpage>278</fpage>&#x2013;<lpage>283</lpage>. <pub-id pub-id-type="doi">10.2298/AADM100605021S</pub-id> </citation>
</ref>
<ref id="B38">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Siganos</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>Faloutsos</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Faloutsos</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Faloutsos</surname>
<given-names>C.</given-names>
</name>
</person-group> (<year>2003</year>). <article-title>Power Laws and the As-Level Internet Topology</article-title>. <source>Ieee/acm Trans. Networking</source> <volume>11</volume>, <fpage>514</fpage>&#x2013;<lpage>524</lpage>. <pub-id pub-id-type="doi">10.1109/TNET.2003.815300</pub-id> </citation>
</ref>
<ref id="B39">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Volkov</surname>
<given-names>V.</given-names>
</name>
</person-group> (<year>2010</year>). &#x201c;<article-title>Better Performance at Lower Occupancy</article-title>,&#x201d; in <conf-name>Proceedings of the GPU technology conference (GTC)</conf-name>. <conf-loc>San Jose, CA</conf-loc>, <conf-date>September 22, 2010</conf-date>, <fpage>16</fpage>. </citation>
</ref>
<ref id="B40">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Watts</surname>
<given-names>D. J.</given-names>
</name>
<name>
<surname>Strogatz</surname>
<given-names>S. H.</given-names>
</name>
</person-group> (<year>1998</year>). <article-title>Collective Dynamics of &#x27;small-World&#x27; Networks</article-title>. <source>Nature</source> <volume>393</volume>, <fpage>440</fpage>&#x2013;<lpage>442</lpage>. <pub-id pub-id-type="doi">10.1038/30918</pub-id> </citation>
</ref>
<ref id="B41">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Yang</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Leskovec</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>2015</year>). <article-title>Defining and Evaluating Network Communities Based on Ground-Truth</article-title>. <source>Knowl Inf. Syst.</source> <volume>42</volume>, <fpage>181</fpage>&#x2013;<lpage>213</lpage>. <pub-id pub-id-type="doi">10.1007/s10115-013-0693-z</pub-id> </citation>
</ref>
<ref id="B42">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Yoo</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Henderson</surname>
<given-names>K.</given-names>
</name>
</person-group> (<year>2010</year>). <article-title>Parallel Generation of Massive Scale-free Graphs</article-title>. <source>CoRR</source> <comment>arXiv</comment>. <comment>Available at: <ext-link ext-link-type="uri" xlink:href="http://arxiv.org/abs/1003.3684">http://arxiv.org/abs/1003.3684</ext-link>
</comment>. </citation>
</ref>
</ref-list>
</back>
</article>