From 605773bb2d7397de050fd78fe6deca1fd932e78e Mon Sep 17 00:00:00 2001
From: "Peter W. Draper" <p.w.draper@durham.ac.uk>
Date: Fri, 18 Sep 2020 18:25:00 +0100
Subject: [PATCH] Extra ranktags that are used to speed up lookup, very
 marginal gains

---
 swiftmpirdmaonestepsim2.c | 39 ++++++++++++++++++++++++++++++++-------
 1 file changed, 32 insertions(+), 7 deletions(-)

diff --git a/swiftmpirdmaonestepsim2.c b/swiftmpirdmaonestepsim2.c
index 1f1ef4b..cb590ea 100644
--- a/swiftmpirdmaonestepsim2.c
+++ b/swiftmpirdmaonestepsim2.c
@@ -275,6 +275,32 @@ static void *send_thread(void *arg) {
    * biggest message. */
   auto *sendBuffer = new infinity::memory::Buffer(context, tobytes(max_size));
 
+  /* Extract the offset lists that we use. */
+  int nr = 0;
+  int size = (max_logs / 16 + 1);
+  size_t *ranktags = (size_t *)malloc(size  * sizeof(size_t));
+  size_t *offsets = (size_t *)malloc(size  * sizeof(size_t));
+
+  /* A tag that will match any subtype or tag with our rank for all the otherranks. */
+  for (int k = 0; k < nr_ranks; k++) {
+    size_t matchranktag = toranktag(0, myrank, k, 0);
+    for (size_t j = 0; j < max_logs; j++) {
+      size_t ranktag = ranktag_lists[INDEX3(nr_ranks, nr_ranks, myrank, k, j)];
+      if ((ranktag & matchranktag) == matchranktag) {
+
+        /* Keep this one. */
+        ranktags[nr] = ranktag;
+        offsets[nr] = ranktag_offsets[INDEX3(nr_ranks, nr_ranks, myrank, k, j)];
+        nr++;
+        if (nr >= size) {
+          size += (max_logs / 16 + 1);
+          ranktags = (size_t *)realloc(ranktags, size * sizeof(size_t));
+          offsets = (size_t *)realloc(offsets, size * sizeof(size_t));
+        }
+      }
+    }
+  }
+
   // Startup complete, so start timing and release the receive thread.
   MPI_Barrier(MPI_COMM_WORLD);  // Vital for synchronization.
   clocks_set_cpufreq(cpufreq);
@@ -310,19 +336,18 @@ static void *send_thread(void *arg) {
     log->offset = 0;
     int found = 0;
 
-    // XXX must be faster way of doing this... Go back to per rank lists.
-    for (size_t j = 0; j < max_logs; j++) {
-      if (ranktag_lists[INDEX3(nr_ranks, nr_ranks, myrank, log->otherrank, j)] == ranktag) {
-        log->offset = ranktag_offsets[INDEX3(nr_ranks, nr_ranks, myrank, log->otherrank, j)];
+    for (int j = 0; j < nr; j++) {
+      if (ranktags[j] == ranktag) {
+        log->offset = offsets[j];
         found = 1;
         break;
       }
     }
     if (!found) {
       error(
-            "Failed sending a message of size %zd to %d/%d "
-            "@ %zd\n, no offset found for ranktag %zd",
-            datasize, log->otherrank, log->subtype, log->offset, ranktag);
+          "Failed sending a message of size %zd to %d/%d "
+          "@ %zd\n, no offset found for ranktag %zd",
+          datasize, log->otherrank, log->subtype, log->offset, ranktag);
     }
 
     if (verbose)
-- 
GitLab