{"id":1437,"date":"2022-11-14T13:17:17","date_gmt":"2022-11-14T13:17:17","guid":{"rendered":"https:\/\/blogs.qub.ac.uk\/dipsa\/laganlighter-source-code\/"},"modified":"2024-08-13T06:44:50","modified_gmt":"2024-08-13T05:44:50","slug":"laganlighter-source-code","status":"publish","type":"post","link":"https:\/\/blogs.qub.ac.uk\/dipsa\/laganlighter-source-code\/","title":{"rendered":"LaganLighter Source Code"},"content":{"rendered":"\n<h2 class=\"wp-block-heading has-medium-font-size\"><br>Repository<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/DIPSA-QUB\/LaganLighter\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>https:\/\/github.com\/DIPSA-QUB\/LaganLighter<\/strong><\/a><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Documentation<\/strong><\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/MohsenKoohi\/LaganLighter\/tree\/main\/docs\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>https:\/\/github.com\/DIPS-QUB\/LaganLighter\/tree\/main\/docs<\/strong><\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>Algorithms in This Repo<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/blogs.qub.ac.uk\/DIPSA\/Sapco-Sort-Optimizing-Degree-Ordering-For-Power-Law-Graphs\/\">SAPCo Sort<\/a>: <code>alg1_sapco_sort<\/code><\/li>\n\n\n\n<li><a href=\"https:\/\/blogs.qub.ac.uk\/DIPSA\/Thrifty-Label-Propagation-Fast-Connected-Components-for-Skewed-Degree-Graphs\/\">Thrifty Label Propagation Connected Components<\/a>: <code>alg2_thrifty<\/code><\/li>\n\n\n\n<li><a href=\"https:\/\/blogs.qub.ac.uk\/DIPSA\/MASTIFF-Structure-Aware-Minimum-Spanning-Tree-Forest\/\">MASTIFF: Structure-Aware Mimum Spanning Tree\/Forest<\/a>: <code>alg3_mastiff<\/code><\/li>\n\n\n\n<li><a href=\"https:\/\/blogs.qub.ac.uk\/DIPSA\/Exploiting-in-Hub-Temporal-Locality-in-SpMV-based-Graph-Processing\/\">iHTL: in-Hub Temporal Locality in SpMV (Sparse-Matrix Vector Multiplication) based Graph Processing<\/a>: (to be added)<\/li>\n\n\n\n<li><a href=\"https:\/\/blogs.qub.ac.uk\/DIPSA\/LOTUS-Locality-Optimizing-Triangle-Counting\/\">LOTUS: Locality Optimizing Trinagle Counting<\/a>: (to be added)<br><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>Cloning<\/strong><\/h2>\n\n\n\n<p><code>git clone https:\/\/github.com\/MohsenKoohi\/LaganLighter.git --recursive<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">Graph Types<\/h2>\n\n\n\n<p>LaganLighter supports  the following graph formats:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CSR\/CSC graph in text format, for testing. This format has 4 lines: (i) number of vertices (|V|), (ii) number of edges (|E|), (iii) |V| space-separated numbers showing offsets of the vertices, and (iv) |E| space-separated numbers indicating edges.<\/li>\n\n\n\n<li>CSR\/CSC <a href=\"https:\/\/law.di.unimi.it\/datasets.php\">WebGraph<\/a> format: supported by the <a href=\"https:\/\/blogs.qub.ac.uk\/DIPSA\/Poplar\/\" target=\"_blank\" rel=\"noreferrer noopener\">Poplar Graph Loading Library<\/a><br>external git repository<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>Measurements<\/strong><\/h2>\n\n\n\n<p class=\"has-text-align-justify\">In addition to execution time, we use the <a rel=\"noreferrer noopener\" href=\"http:\/\/icl.cs.utk.edu\/papi\/\" target=\"_blank\">PAPI<\/a>  library to measure hardware counters such as L3 cache misses, hardware instructions, DTLB misses, and load and store memory instructions. (<code> papi_(init\/start\/reset\/stop)<\/code> and <code>(print\/reset)_hw_events<\/code> functions defined in <code><a href=\"https:\/\/github.com\/DIPSA-QUB\/LaganLighter\/blob\/main\/omp.c\">omp.c<\/a><\/code>).<br><br>To measure load balance, we measure the total time of executing a loop and the time each thread spends in this loop (<code>mt<\/code> and <code>ttimes<\/code> in the following sample code). Using these values, PTIP macro (defined in <code><a href=\"https:\/\/github.com\/DIPSA-QUB\/LaganLighter\/blob\/main\/omp.c\">omp.c<\/a><\/code>) calculates the percentage of average idle time (as an indicator of load imbalance) and prints it with the total time (<code>mt<\/code>). <\/p>\n\n\n\n<pre style='border:1px solid gray;padding:3px;margin:10px 0' class=\"wp-block-code\"><code><strong>mt<\/strong> = - get_nano_time()\n<strong>#pragma omp parallel  <\/strong>\n{\n   unsigned tid = omp_get_thread_num();\n   <strong>ttimes<\/strong>&#091;tid] = - get_nano_time();\n\t\n   #pragma omp for <strong>nowait<\/strong>\n   for(unsigned int v = 0; v &lt; g-&gt;vertices_count; v++)\n   {\n      \/\/ .....\n   }\n   <strong>ttimes<\/strong>&#091;tid] += get_nano_time();\n}\n<strong>mt<\/strong> += get_nano_time();\n<strong>PTIP<\/strong>(\"Step ... \");\n<\/code><\/pre>\n\n\n\n<p class=\"has-text-align-justify\">As an example, the following execution of <a href=\"https:\/\/blogs.qub.ac.uk\/DIPSA\/Thrifty-Label-Propagation-Fast-Connected-Components-for-Skewed-Degree-Graphs\/\" target=\"_blank\" rel=\"noreferrer noopener\">Thrifty<\/a>, shows that the &#8220;Zero Planting&#8221; step has been performed in 8.98 milliseconds and with a 8.22% load imbalance, while processors have been idle for 72.22% of the execution time, on average, in the &#8220;Initial Push&#8221; step.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/blogs.qub.ac.uk\/DIPSA\/wp-content\/uploads\/sites\/14\/2023\/02\/load-imbalance.jpg\" alt=\"\" class=\"wp-image-1471\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>NUMA-Aware and Locality-Preserving Partitioning and Scheduling<\/strong><\/h2>\n\n\n\n<p class=\"has-text-align-justify\">In order to assign consecutive partitions (vertices and\/or their edges) to each parallel processor, we initially divide partitions and assign a number of consecutive partitions to each  thread. Then, we specify the order of victim threads in the work-stealing process. During the initialization of LaganLighter parallel processing environment (in <code><strong>initialize_omp_par_env<\/strong>()<\/code> function defined in file omp.c), for each thread, we create a list of threads as consequent victims of stealing. <\/p>\n\n\n\n<p class=\"has-text-align-justify\">A thread, first, steals jobs (i.e., partitions)  from consequent threads in the same NUMA node and then from the threads in consequent NUMA nodes. As an example, the following image shows the stealing order of a 24-core machine with 2 NUMA nodes. This shows that thread 1 steals from threads 2, 3, &#8230;,11, and ,0 running on the same NUMA socket and then from threads 13, 14, &#8230;, 23,  and 12 running on the next NUMA socket. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" src=\"https:\/\/blogs.qub.ac.uk\/DIPSA\/wp-content\/uploads\/sites\/14\/2023\/02\/Stealing-order.png\" alt=\"\" class=\"wp-image-1486\" style=\"width:320px;height:466px\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-justify\">We use <code><strong>dynamic_partitioning_...()<\/strong><\/code> functions (in file partitioning.c) to process partitions by threads in the specified order. A sample code is in the following:<\/p>\n\n\n\n<pre style=\"border:1px solid gray;padding:3px;margin:10px 0\" class=\"wp-block-code\"><code>struct dynamic_partitioning* dp = <strong>dynamic_partitioning_initialize<\/strong>(pe, partitions_count);\n\n<strong>#pragma omp parallel  <\/strong>\n{\n   unsigned int <strong>tid<\/strong> = omp_get_thread_num();\n   unsigned int <strong>partition<\/strong> = -1U;\t\t\n\n   <strong>while(1)<\/strong>\n   {\n      <strong>partition<\/strong> = <strong>dynamic_partitioning_get_next_partition<\/strong>(dp, tid, partition);\n      if(partition == -1U)\n\t <strong>break<\/strong>; \n\n      for(v = start_vertex[<strong>partition<\/strong>]; v &lt; start_vertex[<strong>partition<\/strong> + 1]; v++)\n      {\n\t\/\/ ....\n       }\n   }\n}\n\n<strong>dynamic_partitioning_reset<\/strong>(dp);\n<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">Bugs &amp; Support<\/h2>\n\n\n\n<p class=\"has-text-align-justify\">As &#8220;we write bugs that in particular cases have been tested to work correctly&#8221;, we try to evaluate and validate the algorithms and their implementations. If you receive wrong results or you are suspicious about parts of the code, please <a href=\"https:\/\/blogs.qub.ac.uk\/DIPSA\/LaganLighter\">contact us<\/a> or <a href=\"https:\/\/github.com\/DIPSA-QUB\/LaganLighter\/issues\">submit an issue<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\">License<\/h2>\n\n\n\n<p class=\"has-text-align-justify\">Licensed under the<a href=\"https:\/\/www.gnu.org\/licenses\/gpl-3.0.en.html\" target=\"_blank\" rel=\"noreferrer noopener\"> GNU v3 General Public License<\/a>, as published by the Free Software Foundation. You must not use this Software except in compliance with the terms of the License. Unless required by applicable law or agreed upon in writing, this Software is distributed on an &#8220;as is&#8221; basis, without any warranty; without even the implied warranty of merchantability or fitness for a particular purpose, neither express nor implied. For details see terms of the <a href=\"https:\/\/github.com\/DIPSA-QUB\/LaganLighter\/blob\/main\/LICENSE\">License<\/a>.<br><br><strong>Copyright 2022 The Queen&#8217;s University of Belfast, Northern Ireland, UK<\/strong><\/p>\n\n\n\n<p style=\"margin:50px 0 20px 0;font-size:20px\"><strong><a rel=\"noreferrer noopener\" href=\"https:\/\/blogs.qub.ac.uk\/DIPSA\/LaganLighter\/\" target=\"_blank\">LaganLighter<\/a><\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>Related Posts<\/strong><br><\/h2>\n\n\n<ul class=\"wp-block-latest-posts__list has-dates wp-block-latest-posts\"><li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2025\/01\/potra-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/on-optimizing-locality-of-graph-transposition-on-modern-architectures\/\">On Optimizing Locality of Graph Transposition on Modern Architectures<\/a><time datetime=\"2025-01-15T19:32:09+00:00\" class=\"wp-block-latest-posts__post-date\">15 January 2025<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2024\/08\/cones2-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/random-vertex-relabelling-in-laganlighter\/\">Random Vertex Relabelling in LaganLighter<\/a><time datetime=\"2024-08-21T12:37:52+01:00\" class=\"wp-block-latest-posts__post-date\">21 August 2024<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2024\/08\/trees-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/minimum-spanning-forest-of-ms-biographs\/\">Minimum Spanning Forest of MS-BioGraphs<\/a><time datetime=\"2024-08-09T14:11:36+01:00\" class=\"wp-block-latest-posts__post-date\">9 August 2024<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2024\/08\/affinity-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/topology-based-thread-affinity-setting-thread-pinning-in-openmp\/\">Topology-Based Thread Affinity Setting (Thread Pinning) in OpenMP<\/a><time datetime=\"2024-08-03T18:07:31+01:00\" class=\"wp-block-latest-posts__post-date\">3 August 2024<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2024\/02\/loriini-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/paragrapher-integrated-to-laganlighter\/\">ParaGrapher Integrated to LaganLighter<\/a><time datetime=\"2024-02-16T08:29:26+00:00\" class=\"wp-block-latest-posts__post-date\">16 February 2024<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2022\/12\/Squirrel-Dima-Solomin-Unsplash-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/on-designing-structure-aware-high-performance-graph-algorithms-phd-thesis\/\">On Designing Structure-Aware High-Performance Graph Algorithms (PhD Thesis)<\/a><time datetime=\"2022-12-08T10:00:00+00:00\" class=\"wp-block-latest-posts__post-date\">8 December 2022<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2022\/12\/cactus-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/laganlighter-source-code\/\">LaganLighter Source Code<\/a><time datetime=\"2022-11-14T13:17:17+00:00\" class=\"wp-block-latest-posts__post-date\">14 November 2022<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2022\/12\/Mastiff-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/mastiff-structure-aware-minimum-spanning-tree-forest\/\">MASTIFF: Structure-Aware Minimum Spanning Tree\/Forest &#8211; ICS&#8217;22<\/a><time datetime=\"2022-06-28T20:17:30+01:00\" class=\"wp-block-latest-posts__post-date\">28 June 2022<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2022\/12\/White-Stork-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/sapco-sort-optimizing-degree-ordering-for-power-law-graphs\/\">SAPCo Sort: Optimizing Degree-Ordering for Power-Law Graphs &#8211; ISPASS&#8217;22 (Poster)<\/a><time datetime=\"2022-05-23T11:56:43+01:00\" class=\"wp-block-latest-posts__post-date\">23 May 2022<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2022\/12\/lotus-1000x288-1-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/lotus-locality-optimizing-triangle-counting\/\">LOTUS: Locality Optimizing Triangle Counting &#8211; PPOPP&#8217;22<\/a><time datetime=\"2022-04-05T15:50:00+01:00\" class=\"wp-block-latest-posts__post-date\">5 April 2022<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2022\/12\/header-19-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/locality-analysis-of-graph-reordering-algorithms\/\">Locality Analysis of Graph Reordering Algorithms &#8211; IISWC&#8217;21<\/a><time datetime=\"2021-11-08T08:19:00+00:00\" class=\"wp-block-latest-posts__post-date\">8 November 2021<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2022\/12\/michael-mahood-N_WK99xI9hU-unsplash-2-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/thrifty-label-propagation-fast-connected-components-for-skewed-degree-graphs\/\">Thrifty Label Propagation: Fast Connected Components for Skewed-Degree Graphs &#8211; IEEE CLUSTER&#8217;21<\/a><time datetime=\"2021-09-09T16:34:43+01:00\" class=\"wp-block-latest-posts__post-date\">9 September 2021<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2022\/12\/header-12-1-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/exploiting-in-hub-temporal-locality-in-spmv-based-graph-processing\/\">Exploiting in-Hub Temporal Locality in SpMV-based Graph Processing &#8211; ICPP&#8217;21<\/a><time datetime=\"2021-08-09T21:07:40+01:00\" class=\"wp-block-latest-posts__post-date\">9 August 2021<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2022\/12\/header-11-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/how-do-graph-relabeling-algorithms-improve-memory-locality-ispass21\/\">How Do Graph Relabeling Algorithms Improve Memory Locality? ISPASS&#8217;21 (Poster)<\/a><time datetime=\"2021-03-28T08:00:00+01:00\" class=\"wp-block-latest-posts__post-date\">28 March 2021<\/time><\/li>\n<\/ul>\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong><a href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/technical-posts\/\" target=\"_blank\" rel=\"noreferrer noopener\">Technical Posts<\/a><\/strong><\/p>\n\n\n<ul class=\"wp-block-latest-posts__list has-dates wp-block-latest-posts\"><li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2024\/08\/cones2-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/random-vertex-relabelling-in-laganlighter\/\">Random Vertex Relabelling in LaganLighter<\/a><time datetime=\"2024-08-21T12:37:52+01:00\" class=\"wp-block-latest-posts__post-date\">21 August 2024<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2024\/08\/trees-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/minimum-spanning-forest-of-ms-biographs\/\">Minimum Spanning Forest of MS-BioGraphs<\/a><time datetime=\"2024-08-09T14:11:36+01:00\" class=\"wp-block-latest-posts__post-date\">9 August 2024<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2024\/08\/affinity-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/topology-based-thread-affinity-setting-thread-pinning-in-openmp\/\">Topology-Based Thread Affinity Setting (Thread Pinning) in OpenMP<\/a><time datetime=\"2024-08-03T18:07:31+01:00\" class=\"wp-block-latest-posts__post-date\">3 August 2024<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2024\/04\/hedera-helix-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/an-incomplete-list-of-publicly-available-graph-datasets-generators\/\">An (Incomplete) List of Publicly Available Graph Datasets\/Generators<\/a><time datetime=\"2024-06-21T13:25:49+01:00\" class=\"wp-block-latest-posts__post-date\">21 June 2024<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2024\/04\/passerine-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/an-evaluation-of-bandwidth-of-different-storage-types-hdd-vs-ssd-vs-lustrefs-for-different-block-sizes-and-different-read-methods-mmap-vs-pread-vs-read\/\">An Evaluation of Bandwidth of Different Storage Types (HDD vs. SSD vs. LustreFS) for Different Block Sizes and Different Parallel Read Methods (mmap vs pread vs read)<\/a><time datetime=\"2024-04-20T09:48:10+01:00\" class=\"wp-block-latest-posts__post-date\">20 April 2024<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2023\/11\/ni2-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/simd-bit-twiddling-hacks\/\">SIMD Bit Twiddling Hacks<\/a><time datetime=\"2023-11-25T14:13:51+00:00\" class=\"wp-block-latest-posts__post-date\">25 November 2023<\/time><\/li>\n<li><div class=\"wp-block-latest-posts__featured-image alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2022\/12\/cactus-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"\" style=\"max-width:75px;max-height:75px;\" \/><\/div><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/blogs.qub.ac.uk\/dipsa\/laganlighter-source-code\/\">LaganLighter Source Code<\/a><time datetime=\"2022-11-14T13:17:17+00:00\" class=\"wp-block-latest-posts__post-date\">14 November 2022<\/time><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Repository https:\/\/github.com\/DIPSA-QUB\/LaganLighter Documentation https:\/\/github.com\/DIPS-QUB\/LaganLighter\/tree\/main\/docs Algorithms in This Repo Cloning git clone https:\/\/github.com\/MohsenKoohi\/LaganLighter.git &#8211;recursive Graph Types LaganLighter supports the following graph formats: Measurements In addition to execution time, we use the PAPI library to measure hardware counters such as L3 cache misses, hardware instructions, DTLB misses, and load and store memory instructions. ( papi_(init\/start\/reset\/stop) and (print\/reset)_hw_events [&hellip;]<\/p>\n","protected":false},"author":1315,"featured_media":1626,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[40,127],"tags":[34,43,35,38,39,26,19,44],"class_list":{"0":"post-1437","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-laganlighter","8":"category-technical-posts","9":"tag-algorithm-design-and-engineering","10":"tag-algorithm-engineering","11":"tag-graph-processing","12":"tag-high-performance-computing","13":"tag-laganlighter","14":"tag-locality","15":"tag-source-code","16":"tag-structure-aware-algorithms","17":"czr-hentry"},"jetpack_featured_media_url":"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-content\/uploads\/sites\/14\/2022\/12\/cactus.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-json\/wp\/v2\/posts\/1437","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-json\/wp\/v2\/users\/1315"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-json\/wp\/v2\/comments?post=1437"}],"version-history":[{"count":9,"href":"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-json\/wp\/v2\/posts\/1437\/revisions"}],"predecessor-version":[{"id":3267,"href":"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-json\/wp\/v2\/posts\/1437\/revisions\/3267"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-json\/wp\/v2\/media\/1626"}],"wp:attachment":[{"href":"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-json\/wp\/v2\/media?parent=1437"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-json\/wp\/v2\/categories?post=1437"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.qub.ac.uk\/dipsa\/wp-json\/wp\/v2\/tags?post=1437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}