From cd89baebefc965c1204be651887b623e5d0b0723 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Thu, 12 Sep 2024 10:44:42 -0400 Subject: [PATCH 01/33] Implement serial version of exclusive prefix sum for CPU --- stream_compaction/cpu.cu | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 719fa11..b96eb4a 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -16,10 +16,16 @@ namespace StreamCompaction { * CPU scan (prefix sum). * For performance analysis, this is supposed to be a simple for loop. * (Optional) For better understanding before starting moving to GPU, you can simulate your GPU scan in this function first. + * Exclusive prefix sum. */ void scan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // TODO + // Put addition identity in first element. + odata[0] = 0; + // Serial version. + for (int i = 1; i < n; ++i) { + odata[i] = odata[i-1] + idata[i-1]; + } timer().endCpuTimer(); } From fdcbface1fa848c3f881d00225cb6094275cd6ab Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Thu, 12 Sep 2024 16:18:32 -0400 Subject: [PATCH 02/33] Move serial version of exclusive scan to serialScan; implement parallel inclusive scan algorithm on CPU in scan --- src/main.cpp | 17 +++++++++++++- stream_compaction/cpu.cu | 50 ++++++++++++++++++++++++++++++++++++---- stream_compaction/cpu.h | 2 ++ 3 files changed, 63 insertions(+), 6 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 896ac2b..bb5bdbd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,6 +18,7 @@ const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; int *c = new int[SIZE]; +int *d = new int[SIZE]; int main(int argc, char* argv[]) { // Scan tests @@ -40,13 +41,27 @@ int main(int argc, char* argv[]) { printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(SIZE, b, true); + zeroArray(SIZE, d); + printDesc("cpu scan, power-of-two, serial"); + StreamCompaction::CPU::serialScan(SIZE, d, a); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + printArray(SIZE, d, true); + printCmpResult(SIZE, b, d); + zeroArray(SIZE, c); printDesc("cpu scan, non-power-of-two"); StreamCompaction::CPU::scan(NPOT, c, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - printArray(NPOT, b, true); + printArray(NPOT, c, true); printCmpResult(NPOT, b, c); + zeroArray(SIZE, d); + printDesc("cpu scan, non-power-of-two, serial"); + StreamCompaction::CPU::serialScan(NPOT, d, a); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + printArray(NPOT, d, true); + printCmpResult(NPOT, b, d); + zeroArray(SIZE, c); printDesc("naive scan, power-of-two"); StreamCompaction::Naive::scan(SIZE, c, a); diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index b96eb4a..53d1fd5 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -12,6 +12,19 @@ namespace StreamCompaction { return timer; } + void serialScan(int n, int *odata, const int *idata) { + timer().startCpuTimer(); + + // Put addition identity in first element. + odata[0] = 0; + // Serial version. + for (int i = 1; i < n; ++i) { + odata[i] = odata[i-1] + idata[i-1]; + } + + timer().endCpuTimer(); + } + /** * CPU scan (prefix sum). * For performance analysis, this is supposed to be a simple for loop. @@ -20,12 +33,39 @@ namespace StreamCompaction { */ void scan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // Put addition identity in first element. - odata[0] = 0; - // Serial version. - for (int i = 1; i < n; ++i) { - odata[i] = odata[i-1] + idata[i-1]; + + // Each new iteration should update k in [2^d, ...] only. + + int *auxBuffer = (int *)malloc(n * sizeof(int)); + memcpy(auxBuffer, idata, n * sizeof(int)); + int *iterInput = auxBuffer; + int *iterOutput = odata; + + odata[0] = idata[0]; + + for (int d = 1; d <= ilog2ceil(n); ++d) { + // At the beginning of each new iteration: + // - partial sums [0, 2^(d-1) - 1] are complete; + // - the rest are of the form x[k - 2^d - 1] + ... + x[k]. + for (int k = pow(2, d-1); k < n; ++k) { + iterOutput[k] = iterInput[k - (int)pow(2, d-1)] + iterInput[k]; + // y[k] is now: + // = x[k] + x[k - 1] + x[k - 2] + ... + x[k - 4] + .... + x[k - 2^(d-1)] + // = x[max(0, k - 2^(d) + 1), k - 2^(d-1)] + x[k - 2^(d-1) + 1, k] + // for d >= 1. + } + // Processing [2^d, n) completely before moving on to next d is equivalent + // to waiting on a barrier for all threads to reach it, in the parallel case. + + memcpy(iterInput, iterOutput, n * sizeof(int)); + } + + if (iterInput != odata) { + memcpy(odata, iterInput, n * sizeof(int)); } + + free(auxBuffer); + timer().endCpuTimer(); } diff --git a/stream_compaction/cpu.h b/stream_compaction/cpu.h index 873c047..1bb688d 100644 --- a/stream_compaction/cpu.h +++ b/stream_compaction/cpu.h @@ -6,6 +6,8 @@ namespace StreamCompaction { namespace CPU { StreamCompaction::Common::PerformanceTimer& timer(); + void serialScan(int n, int *odata, const int *idata); + void scan(int n, int *odata, const int *idata); int compactWithoutScan(int n, int *odata, const int *idata); From 048b8560f093df9d1b4cc8001f07407da1982a67 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Thu, 12 Sep 2024 16:53:19 -0400 Subject: [PATCH 03/33] WIP: implement CPU version of parallel algorithm --- src/main.cpp | 22 +++++++++++----------- stream_compaction/cpu.cu | 24 +++++++++++++----------- stream_compaction/cpu.h | 4 ++-- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index bb5bdbd..0368bc6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 8; // feel free to change the size of array +const int SIZE = 1 << 10; // feel free to change the size of array const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; @@ -41,13 +41,6 @@ int main(int argc, char* argv[]) { printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(SIZE, b, true); - zeroArray(SIZE, d); - printDesc("cpu scan, power-of-two, serial"); - StreamCompaction::CPU::serialScan(SIZE, d, a); - printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - printArray(SIZE, d, true); - printCmpResult(SIZE, b, d); - zeroArray(SIZE, c); printDesc("cpu scan, non-power-of-two"); StreamCompaction::CPU::scan(NPOT, c, a); @@ -56,11 +49,18 @@ int main(int argc, char* argv[]) { printCmpResult(NPOT, b, c); zeroArray(SIZE, d); - printDesc("cpu scan, non-power-of-two, serial"); - StreamCompaction::CPU::serialScan(NPOT, d, a); + printDesc("cpu scan, power-of-two, version 2"); + StreamCompaction::CPU::scan2(SIZE, d, a); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + printArray(SIZE, d, true); + printCmpResult(SIZE, b, d); + + zeroArray(SIZE, d); + printDesc("cpu scan, non-power-of-two, version 2"); + StreamCompaction::CPU::scan2(NPOT, d, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(NPOT, d, true); - printCmpResult(NPOT, b, d); + printCmpResult(NPOT, c, d); zeroArray(SIZE, c); printDesc("naive scan, power-of-two"); diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 53d1fd5..df1c868 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -12,7 +12,13 @@ namespace StreamCompaction { return timer; } - void serialScan(int n, int *odata, const int *idata) { + /** + * CPU scan (prefix sum). + * For performance analysis, this is supposed to be a simple for loop. + * (Optional) For better understanding before starting moving to GPU, you can simulate your GPU scan in this function first. + * Exclusive prefix sum. + */ + void scan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // Put addition identity in first element. @@ -25,13 +31,8 @@ namespace StreamCompaction { timer().endCpuTimer(); } - /** - * CPU scan (prefix sum). - * For performance analysis, this is supposed to be a simple for loop. - * (Optional) For better understanding before starting moving to GPU, you can simulate your GPU scan in this function first. - * Exclusive prefix sum. - */ - void scan(int n, int *odata, const int *idata) { + // CPU version of parallel algorithm. Incorrect. + void scan2(int n, int *odata, const int *idata) { timer().startCpuTimer(); // Each new iteration should update k in [2^d, ...] only. @@ -41,14 +42,15 @@ namespace StreamCompaction { int *iterInput = auxBuffer; int *iterOutput = odata; - odata[0] = idata[0]; + odata[0] = 0; for (int d = 1; d <= ilog2ceil(n); ++d) { // At the beginning of each new iteration: // - partial sums [0, 2^(d-1) - 1] are complete; // - the rest are of the form x[k - 2^d - 1] + ... + x[k]. - for (int k = pow(2, d-1); k < n; ++k) { - iterOutput[k] = iterInput[k - (int)pow(2, d-1)] + iterInput[k]; + for (int k = pow(2, d-1) + 1; k < n; ++k) { + int left = (k-1) - (int)pow(2, d-1); + iterOutput[k] = (left < 0 ? 0 : iterInput[left]) + iterInput[k-1]; // y[k] is now: // = x[k] + x[k - 1] + x[k - 2] + ... + x[k - 4] + .... + x[k - 2^(d-1)] // = x[max(0, k - 2^(d) + 1), k - 2^(d-1)] + x[k - 2^(d-1) + 1, k] diff --git a/stream_compaction/cpu.h b/stream_compaction/cpu.h index 1bb688d..1f3ba8d 100644 --- a/stream_compaction/cpu.h +++ b/stream_compaction/cpu.h @@ -6,10 +6,10 @@ namespace StreamCompaction { namespace CPU { StreamCompaction::Common::PerformanceTimer& timer(); - void serialScan(int n, int *odata, const int *idata); - void scan(int n, int *odata, const int *idata); + void scan2(int n, int *odata, const int *idata); + int compactWithoutScan(int n, int *odata, const int *idata); int compactWithScan(int n, int *odata, const int *idata); From c935009bc4f139e8325310680c11a844087c44c9 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Thu, 12 Sep 2024 17:07:26 -0400 Subject: [PATCH 04/33] Implement StreamCompaction::CPU::compactWithoutScan --- stream_compaction/cpu.cu | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index df1c868..bce50c3 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -78,9 +78,18 @@ namespace StreamCompaction { */ int compactWithoutScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // TODO + + int nonzeroCount = 0; + + for (int i = 0; i < n; ++i) { + if (idata[i] != 0) { + odata[nonzeroCount++] = idata[i]; + } + } + timer().endCpuTimer(); - return -1; + + return nonzeroCount; } /** From 63b203d8ef2dba3f87902660429b189e1fa19841 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Thu, 12 Sep 2024 17:46:53 -0400 Subject: [PATCH 05/33] Add scanNotimer; implement StreamCompaction::CPU::compactWithScan --- stream_compaction/cpu.cu | 34 +++++++++++++++++++++++++++++----- stream_compaction/cpu.h | 2 ++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index bce50c3..1b8e82a 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -21,14 +21,18 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata) { timer().startCpuTimer(); + scanNoTimer(n, odata, idata); + + timer().endCpuTimer(); + } + + void scanNoTimer(int n, int *odata, const int *idata) { // Put addition identity in first element. odata[0] = 0; // Serial version. for (int i = 1; i < n; ++i) { odata[i] = odata[i-1] + idata[i-1]; } - - timer().endCpuTimer(); } // CPU version of parallel algorithm. Incorrect. @@ -88,7 +92,7 @@ namespace StreamCompaction { } timer().endCpuTimer(); - + return nonzeroCount; } @@ -99,9 +103,29 @@ namespace StreamCompaction { */ int compactWithScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // TODO + + int *nonzeroMask = new int[n]; + for (int i = 0; i < n; ++i) { + nonzeroMask[i] = (idata[i] != 0) ? 1 : 0; + } + + int *nonzeroMaskPrefixSum = new int[n]; + scanNoTimer(n, nonzeroMaskPrefixSum, nonzeroMask); + + int nonzeroCount = 0; + for (int i = 0; i < n; ++i) { + if (nonzeroMask[i]) { + odata[nonzeroMaskPrefixSum[i]] = idata[i]; + nonzeroCount++; + } + } + + free(nonzeroMaskPrefixSum); + free(nonzeroMask); + timer().endCpuTimer(); - return -1; + + return nonzeroCount; } } } diff --git a/stream_compaction/cpu.h b/stream_compaction/cpu.h index 1f3ba8d..2b7d4ce 100644 --- a/stream_compaction/cpu.h +++ b/stream_compaction/cpu.h @@ -8,6 +8,8 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata); + void scanNoTimer(int n, int *odata, const int *idata); + void scan2(int n, int *odata, const int *idata); int compactWithoutScan(int n, int *odata, const int *idata); From 51035db0610673ba44a9a7dce99000ed98ae7d0b Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Thu, 12 Sep 2024 20:13:31 -0400 Subject: [PATCH 06/33] Swap buffer pointers instead copying in scanInclusive --- src/main.cpp | 18 ++++++++++++++-- stream_compaction/cpu.cu | 46 +++++++++++++++++++++++++++++++++++++++- stream_compaction/cpu.h | 4 +++- 3 files changed, 64 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 0368bc6..c92dd12 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -50,14 +50,28 @@ int main(int argc, char* argv[]) { zeroArray(SIZE, d); printDesc("cpu scan, power-of-two, version 2"); - StreamCompaction::CPU::scan2(SIZE, d, a); + StreamCompaction::CPU::scanExclusive(SIZE, d, a); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + printArray(SIZE, d, true); + printCmpResult(SIZE, b, d); + + zeroArray(SIZE, d); + printDesc("cpu scan, power-of-two, inclusive"); + StreamCompaction::CPU::scanInclusive(SIZE, d, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(SIZE, d, true); printCmpResult(SIZE, b, d); zeroArray(SIZE, d); printDesc("cpu scan, non-power-of-two, version 2"); - StreamCompaction::CPU::scan2(NPOT, d, a); + StreamCompaction::CPU::scanExclusive(NPOT, d, a); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + printArray(NPOT, d, true); + printCmpResult(NPOT, c, d); + + zeroArray(SIZE, d); + printDesc("cpu scan, non-power-of-two, inclusive"); + StreamCompaction::CPU::scanInclusive(NPOT, d, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(NPOT, d, true); printCmpResult(NPOT, c, d); diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 1b8e82a..b4010b8 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -36,7 +36,7 @@ namespace StreamCompaction { } // CPU version of parallel algorithm. Incorrect. - void scan2(int n, int *odata, const int *idata) { + void scanExclusive(int n, int *odata, const int *idata) { timer().startCpuTimer(); // Each new iteration should update k in [2^d, ...] only. @@ -47,6 +47,7 @@ namespace StreamCompaction { int *iterOutput = odata; odata[0] = 0; + odata[1] = idata[0]; for (int d = 1; d <= ilog2ceil(n); ++d) { // At the beginning of each new iteration: @@ -75,6 +76,49 @@ namespace StreamCompaction { timer().endCpuTimer(); } + void scanInclusive(int n, int *odata, const int *idata) { + timer().startCpuTimer(); + + // Each new iteration should update k in [2^d, ...] only. + + int *auxBuffer = (int *)malloc(n * sizeof(int)); + memcpy(auxBuffer, idata, n * sizeof(int)); + int *iterInput = auxBuffer; + int *iterOutput = odata; + + odata[0] = idata[0]; + + for (int d = 1; d <= ilog2ceil(n); ++d) { + // At the beginning of each new iteration: + // - partial sums [0, 2^(d-1) - 1] are complete; + // - the rest are of the form x[k - 2^d - 1] + ... + x[k]. + for (int k = 0; k < n; ++k) { + if (k >= pow(2, d-1)) { + iterOutput[k] = iterInput[k - (int)pow(2, d-1)] + iterInput[k]; + } else { + iterOutput[k] = iterInput[k]; + } + + // y[k] is now: + // = x[k] + x[k - 1] + x[k - 2] + ... + x[k - 4] + .... + x[k - 2^(d-1)] + // = x[max(0, k - 2^(d) + 1), k - 2^(d-1)] + x[k - 2^(d-1) + 1, k] + // for d >= 1. + } + // Processing [2^d, n) completely before moving on to next d is equivalent + // to waiting on a barrier for all threads to reach it, in the parallel case. + + std::swap(iterInput, iterOutput); + } + + if (iterInput != odata) { + memcpy(odata, iterInput, n * sizeof(int)); + } + + free(auxBuffer); + + timer().endCpuTimer(); + } + /** * CPU stream compaction without using the scan function. * diff --git a/stream_compaction/cpu.h b/stream_compaction/cpu.h index 2b7d4ce..b6af07b 100644 --- a/stream_compaction/cpu.h +++ b/stream_compaction/cpu.h @@ -10,7 +10,9 @@ namespace StreamCompaction { void scanNoTimer(int n, int *odata, const int *idata); - void scan2(int n, int *odata, const int *idata); + void scanExclusive(int n, int *odata, const int *idata); + + void scanInclusive(int n, int *odata, const int *idata); int compactWithoutScan(int n, int *odata, const int *idata); From 685786f862cfd93831262c29b5282d1bc492f557 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Thu, 12 Sep 2024 22:27:53 -0400 Subject: [PATCH 07/33] Rewrite scanExclusive as an inclusive scan on a shifted array --- src/main.cpp | 8 ++++---- stream_compaction/cpu.cu | 19 ++++++++++++------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index c92dd12..5ee6376 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -36,20 +36,20 @@ int main(int argc, char* argv[]) { // We use b for further comparison. Make sure your StreamCompaction::CPU::scan is correct. // At first all cases passed because b && c are all zeroes. zeroArray(SIZE, b); - printDesc("cpu scan, power-of-two"); + printDesc("cpu scan, power-of-two, exclusive, serial"); StreamCompaction::CPU::scan(SIZE, b, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(SIZE, b, true); zeroArray(SIZE, c); - printDesc("cpu scan, non-power-of-two"); + printDesc("cpu scan, non-power-of-two, exclusive, serial"); StreamCompaction::CPU::scan(NPOT, c, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(NPOT, c, true); printCmpResult(NPOT, b, c); zeroArray(SIZE, d); - printDesc("cpu scan, power-of-two, version 2"); + printDesc("cpu scan, power-of-two, exclusive"); StreamCompaction::CPU::scanExclusive(SIZE, d, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(SIZE, d, true); @@ -63,7 +63,7 @@ int main(int argc, char* argv[]) { printCmpResult(SIZE, b, d); zeroArray(SIZE, d); - printDesc("cpu scan, non-power-of-two, version 2"); + printDesc("cpu scan, non-power-of-two, exclusive"); StreamCompaction::CPU::scanExclusive(NPOT, d, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(NPOT, d, true); diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index b4010b8..ade65a7 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -42,20 +42,25 @@ namespace StreamCompaction { // Each new iteration should update k in [2^d, ...] only. int *auxBuffer = (int *)malloc(n * sizeof(int)); - memcpy(auxBuffer, idata, n * sizeof(int)); int *iterInput = auxBuffer; int *iterOutput = odata; - odata[0] = 0; - odata[1] = idata[0]; + iterInput[0] = 0; + for (int k = 1; k < n; ++k) { + iterInput[k] = idata[k-1]; + } for (int d = 1; d <= ilog2ceil(n); ++d) { // At the beginning of each new iteration: // - partial sums [0, 2^(d-1) - 1] are complete; // - the rest are of the form x[k - 2^d - 1] + ... + x[k]. - for (int k = pow(2, d-1) + 1; k < n; ++k) { - int left = (k-1) - (int)pow(2, d-1); - iterOutput[k] = (left < 0 ? 0 : iterInput[left]) + iterInput[k-1]; + for (int k = 0; k < n; ++k) { + if (k >= pow(2, d-1)) { + iterOutput[k] = iterInput[k - (int)pow(2, d-1)] + iterInput[k]; + } else { + iterOutput[k] = iterInput[k]; + } + // y[k] is now: // = x[k] + x[k - 1] + x[k - 2] + ... + x[k - 4] + .... + x[k - 2^(d-1)] // = x[max(0, k - 2^(d) + 1), k - 2^(d-1)] + x[k - 2^(d-1) + 1, k] @@ -64,7 +69,7 @@ namespace StreamCompaction { // Processing [2^d, n) completely before moving on to next d is equivalent // to waiting on a barrier for all threads to reach it, in the parallel case. - memcpy(iterInput, iterOutput, n * sizeof(int)); + std::swap(iterInput, iterOutput); } if (iterInput != odata) { From 3f2644430e3087d19dd56ff005e44b35bdb33c85 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Sat, 14 Sep 2024 22:24:58 -0400 Subject: [PATCH 08/33] Implement StreamCompaction::Naive::scan; doesn't handle arrays of arbitrary length --- src/main.cpp | 4 +-- stream_compaction/naive.cu | 74 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 5ee6376..fff231e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -80,7 +80,7 @@ int main(int argc, char* argv[]) { printDesc("naive scan, power-of-two"); StreamCompaction::Naive::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); + printArray(SIZE, c, true); printCmpResult(SIZE, b, c); /* For bug-finding only: Array of 1s to help find bugs in stream compaction or scan @@ -93,7 +93,7 @@ int main(int argc, char* argv[]) { printDesc("naive scan, non-power-of-two"); StreamCompaction::Naive::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); + printArray(SIZE, c, true); printCmpResult(NPOT, b, c); zeroArray(SIZE, c); diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 4308876..f21e6ba 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -11,14 +11,84 @@ namespace StreamCompaction { static PerformanceTimer timer; return timer; } - // TODO: __global__ + + __device__ inline int ilog2(int x) { + int lg = 0; + while (x >>= 1) { + ++lg; + } + return lg; + } + + __device__ inline int ilog2ceil(int x) { + return x == 1 ? 0 : ilog2(x - 1) + 1; + } + + __global__ void exclusiveScanKernel(int n, int *odata, int *idata) { + int globalThreadIdx = blockIdx.x*blockDim.x + threadIdx.x; + if (globalThreadIdx >= n) { + return; + } + + int *iterInput = odata; + int *iterOutput = idata; + + if (globalThreadIdx == 0) { + iterInput[0] = 0; + } else { + iterInput[globalThreadIdx] = idata[globalThreadIdx-1]; + } + + __syncthreads(); + + int k = globalThreadIdx; + for (int d = 1; d <= ilog2ceil(n); ++d) { + if (k >= pow(2, d-1)) { + iterOutput[k] = iterInput[k - (int)pow(2, d-1)] + iterInput[k]; + } else { + iterOutput[k] = iterInput[k]; + } + + __syncthreads(); + + int *tmp = iterInput; + iterInput = iterOutput; + iterOutput = tmp; + } + + if (iterInput != odata) { + odata[globalThreadIdx] = iterInput[globalThreadIdx]; + } + } /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { timer().startGpuTimer(); - // TODO + + int *idataDevice = nullptr; + cudaMalloc(&idataDevice, n * sizeof(idata)); + checkCUDAError("failed to malloc idataDevice"); + + int *odataDevice = nullptr; + cudaMalloc(&odataDevice, n * sizeof(idata)); + checkCUDAError("failed to malloc odataDevice"); + + cudaMemcpy(idataDevice, idata, n * sizeof(int), ::cudaMemcpyHostToDevice); + + const int blockSize = 256; + dim3 blockCount = (n + blockSize - 1) / blockSize; + exclusiveScanKernel<<>>(n, odataDevice, idataDevice); + + cudaMemcpy(odata, odataDevice, n * sizeof(int), ::cudaMemcpyDeviceToHost); + + cudaFree(odataDevice); + checkCUDAError("failed to free odataDevice"); + + cudaFree(idataDevice); + checkCUDAError("failed to free idataDevice"); + timer().endGpuTimer(); } } From 9b716770d307eaf255d91827ffd16a8f857f1ee0 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Sun, 15 Sep 2024 11:07:11 -0400 Subject: [PATCH 09/33] Handle arbitrary length arrays by using scanned block sums --- stream_compaction/naive.cu | 81 +++++++++++++++++++++++++++++++------- 1 file changed, 67 insertions(+), 14 deletions(-) diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index f21e6ba..1d711ac 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -24,24 +24,26 @@ namespace StreamCompaction { return x == 1 ? 0 : ilog2(x - 1) + 1; } - __global__ void exclusiveScanKernel(int n, int *odata, int *idata) { + __global__ void exclusiveScanKernel(int n, int *odata, int *idata, int *blockSumDevice = nullptr) { + extern __shared__ int blockSharedMem[]; + int globalThreadIdx = blockIdx.x*blockDim.x + threadIdx.x; if (globalThreadIdx >= n) { return; } - int *iterInput = odata; - int *iterOutput = idata; + int *iterInput = blockSharedMem; + int *iterOutput = blockSharedMem + blockDim.x; - if (globalThreadIdx == 0) { - iterInput[0] = 0; + if (threadIdx.x == 0) { + iterInput[threadIdx.x] = 0; } else { - iterInput[globalThreadIdx] = idata[globalThreadIdx-1]; + iterInput[threadIdx.x] = idata[globalThreadIdx-1]; } __syncthreads(); - int k = globalThreadIdx; + int k = threadIdx.x; for (int d = 1; d <= ilog2ceil(n); ++d) { if (k >= pow(2, d-1)) { iterOutput[k] = iterInput[k - (int)pow(2, d-1)] + iterInput[k]; @@ -56,9 +58,20 @@ namespace StreamCompaction { iterOutput = tmp; } - if (iterInput != odata) { - odata[globalThreadIdx] = iterInput[globalThreadIdx]; + odata[globalThreadIdx] = iterInput[threadIdx.x]; + + if (blockSumDevice != nullptr && threadIdx.x == 0) { + blockSumDevice[blockIdx.x] = iterInput[blockDim.x - 1]; + } + } + + __global__ void addBlockSumsKernel(int n, int *odata, int *blockSums) { + int globalThreadIdx = blockIdx.x*blockDim.x + threadIdx.x; + if (globalThreadIdx >= n) { + return; } + + odata[globalThreadIdx] += blockSums[blockIdx.x]; } /** @@ -67,22 +80,62 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata) { timer().startGpuTimer(); + const int blockSize = 256; + dim3 blockCount = (n + blockSize - 1) / blockSize; + const int blockSharedMemSize = 2 * blockSize * sizeof(int); + + const int blockSumBlockSize = blockCount.x; + dim3 blockSumBlockCount = (blockCount.x + blockSumBlockSize - 1) / blockSumBlockSize; + const int blockSumSharedMemSize = 2 * blockSumBlockSize * sizeof(int); + int *idataDevice = nullptr; - cudaMalloc(&idataDevice, n * sizeof(idata)); + cudaMalloc(&idataDevice, n * sizeof(int)); checkCUDAError("failed to malloc idataDevice"); int *odataDevice = nullptr; - cudaMalloc(&odataDevice, n * sizeof(idata)); + cudaMalloc(&odataDevice, n * sizeof(int)); checkCUDAError("failed to malloc odataDevice"); + int *iblockSumDevice = nullptr; + cudaMalloc(&iblockSumDevice, blockCount.x * sizeof(int)); + checkCUDAError("failed to malloc iblockSumDevice"); + + int *oblockSumDevice = nullptr; + cudaMalloc(&oblockSumDevice, blockCount.x * sizeof(int)); + checkCUDAError("failed to malloc oblockSumDevice"); + + // Debug. + int *odataDeviceDebug = (int *)malloc(n * sizeof(int)); + int *iblockSumDeviceDebug = (int *)malloc(blockCount.x * sizeof(int)); + int* oblockSumDeviceDebug = (int *)malloc(blockCount.x * sizeof(int)); + int* odataDeviceAfterSumDebug = (int*)malloc(n * sizeof(int)); + // Debug. + cudaMemcpy(idataDevice, idata, n * sizeof(int), ::cudaMemcpyHostToDevice); - const int blockSize = 256; - dim3 blockCount = (n + blockSize - 1) / blockSize; - exclusiveScanKernel<<>>(n, odataDevice, idataDevice); + exclusiveScanKernel<<>>(n, odataDevice, idataDevice, iblockSumDevice); + + // Debug. + cudaMemcpy(odataDeviceDebug, odataDevice, n * sizeof(int), ::cudaMemcpyDeviceToHost); + cudaMemcpy(iblockSumDeviceDebug, iblockSumDevice, blockCount.x * sizeof(int), ::cudaMemcpyDeviceToHost); + // Debug. + + exclusiveScanKernel<<>>(blockCount.x, oblockSumDevice, iblockSumDevice); + + // Debug. + cudaMemcpy(oblockSumDeviceDebug, oblockSumDevice, blockCount.x * sizeof(int), ::cudaMemcpyDeviceToHost); + // Debug. + + addBlockSumsKernel<<>>(n, odataDevice, oblockSumDevice); cudaMemcpy(odata, odataDevice, n * sizeof(int), ::cudaMemcpyDeviceToHost); + cudaFree(oblockSumDevice); + checkCUDAError("failed to free oblockSumDevice"); + + cudaFree(iblockSumDevice); + checkCUDAError("failed to free iblockSumDevice"); + cudaFree(odataDevice); checkCUDAError("failed to free odataDevice"); From 949dbd8d74692203170f7790b9fc45d4e68e8af9 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Sun, 15 Sep 2024 11:08:42 -0400 Subject: [PATCH 10/33] Add last block input element to block sum; naive scan tests pass --- stream_compaction/naive.cu | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 1d711ac..78500e0 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -60,8 +60,8 @@ namespace StreamCompaction { odata[globalThreadIdx] = iterInput[threadIdx.x]; - if (blockSumDevice != nullptr && threadIdx.x == 0) { - blockSumDevice[blockIdx.x] = iterInput[blockDim.x - 1]; + if (blockSumDevice != nullptr && threadIdx.x == blockDim.x - 1) { + blockSumDevice[blockIdx.x] = iterInput[blockDim.x - 1] + idata[globalThreadIdx]; } } From 83328c0ae0f1f439971d13aba636ef2e551d85d1 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Sun, 15 Sep 2024 11:20:52 -0400 Subject: [PATCH 11/33] Implement StreamCompaction::Thrust::scan --- stream_compaction/thrust.cu | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 1def45e..cb44f01 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -19,9 +19,12 @@ namespace StreamCompaction { */ void scan(int n, int *odata, const int *idata) { timer().startGpuTimer(); - // TODO use `thrust::exclusive_scan` - // example: for device_vectors dv_in and dv_out: - // thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); + + thrust::device_vector idataDevice(idata, idata + n); + thrust::device_vector odataDevice(n); + thrust::exclusive_scan(idataDevice.begin(), idataDevice.end(), odataDevice.begin()); + thrust::copy(odataDevice.begin(), odataDevice.end(), odata); + timer().endGpuTimer(); } } From 3ff310e2b44b3afcf3053a492eed6b049fb5dabd Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Sun, 15 Sep 2024 12:44:46 -0400 Subject: [PATCH 12/33] Add StreamCompaction::Naive::scan as template for StreamCompaction::Efficient::scan, except exclusiveScanKernel --- stream_compaction/efficient.cu | 89 +++++++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 1 deletion(-) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 2db346e..b2282d6 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -12,12 +12,99 @@ namespace StreamCompaction { return timer; } + __device__ inline int ilog2(int x) { + int lg = 0; + while (x >>= 1) { + ++lg; + } + return lg; + } + + __device__ inline int ilog2ceil(int x) { + return x == 1 ? 0 : ilog2(x - 1) + 1; + } + + __global__ void exclusiveScanKernel(int n, int *odata, int *idata, int *blockSumDevice = nullptr) { + + } + + __global__ void addBlockSumsKernel(int n, int *odata, int *blockSums) { + int globalThreadIdx = blockIdx.x*blockDim.x + threadIdx.x; + if (globalThreadIdx >= n) { + return; + } + + odata[globalThreadIdx] += blockSums[blockIdx.x]; + } + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { timer().startGpuTimer(); - // TODO + + const int blockSize = 256; + dim3 blockCount = (n + blockSize - 1) / blockSize; + const int blockSharedMemSize = 2 * blockSize * sizeof(int); + + const int blockSumBlockSize = blockCount.x; + dim3 blockSumBlockCount = (blockCount.x + blockSumBlockSize - 1) / blockSumBlockSize; + const int blockSumSharedMemSize = 2 * blockSumBlockSize * sizeof(int); + + int *idataDevice = nullptr; + cudaMalloc(&idataDevice, n * sizeof(int)); + checkCUDAError("failed to malloc idataDevice"); + + int *odataDevice = nullptr; + cudaMalloc(&odataDevice, n * sizeof(int)); + checkCUDAError("failed to malloc odataDevice"); + + int *iblockSumDevice = nullptr; + cudaMalloc(&iblockSumDevice, blockCount.x * sizeof(int)); + checkCUDAError("failed to malloc iblockSumDevice"); + + int *oblockSumDevice = nullptr; + cudaMalloc(&oblockSumDevice, blockCount.x * sizeof(int)); + checkCUDAError("failed to malloc oblockSumDevice"); + + // Debug. + int *odataDeviceDebug = (int *)malloc(n * sizeof(int)); + int *iblockSumDeviceDebug = (int *)malloc(blockCount.x * sizeof(int)); + int* oblockSumDeviceDebug = (int *)malloc(blockCount.x * sizeof(int)); + int* odataDeviceAfterSumDebug = (int*)malloc(n * sizeof(int)); + // Debug. + + cudaMemcpy(idataDevice, idata, n * sizeof(int), ::cudaMemcpyHostToDevice); + + exclusiveScanKernel<<>>(n, odataDevice, idataDevice, iblockSumDevice); + + // Debug. + cudaMemcpy(odataDeviceDebug, odataDevice, n * sizeof(int), ::cudaMemcpyDeviceToHost); + cudaMemcpy(iblockSumDeviceDebug, iblockSumDevice, blockCount.x * sizeof(int), ::cudaMemcpyDeviceToHost); + // Debug. + + exclusiveScanKernel<<>>(blockCount.x, oblockSumDevice, iblockSumDevice); + + // Debug. + cudaMemcpy(oblockSumDeviceDebug, oblockSumDevice, blockCount.x * sizeof(int), ::cudaMemcpyDeviceToHost); + // Debug. + + addBlockSumsKernel<<>>(n, odataDevice, oblockSumDevice); + + cudaMemcpy(odata, odataDevice, n * sizeof(int), ::cudaMemcpyDeviceToHost); + + cudaFree(oblockSumDevice); + checkCUDAError("failed to free oblockSumDevice"); + + cudaFree(iblockSumDevice); + checkCUDAError("failed to free iblockSumDevice"); + + cudaFree(odataDevice); + checkCUDAError("failed to free odataDevice"); + + cudaFree(idataDevice); + checkCUDAError("failed to free idataDevice"); + timer().endGpuTimer(); } From f6d94c6e252880e4274afc714809b033e07d2d48 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Sun, 15 Sep 2024 14:18:29 -0400 Subject: [PATCH 13/33] Add parallel and CPU reductions to StreamCompaction::Efficient --- stream_compaction/efficient.cu | 59 ++++++++++++++++++++++++++++------ stream_compaction/efficient.h | 2 ++ 2 files changed, 51 insertions(+), 10 deletions(-) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index b2282d6..b762ffc 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -24,6 +24,31 @@ namespace StreamCompaction { return x == 1 ? 0 : ilog2(x - 1) + 1; } + __global__ void reductionKernel(int n, int *odata, int *idata) { + extern __shared__ int blockSharedMem[]; + + int globalThreadIdx = blockIdx.x*blockDim.x + threadIdx.x; + if (globalThreadIdx >= n) { + return; + } + + blockSharedMem[threadIdx.x] = idata[globalThreadIdx]; + + __syncthreads(); + + for (int d = 0; d < ilog2(n); ++d) { + if ((threadIdx.x + 1) % (1 << (d+1)) == 0) { + int leftChildValue = blockSharedMem[threadIdx.x - (1 << d)]; + int rightChildValue = blockSharedMem[threadIdx.x]; + blockSharedMem[threadIdx.x] = leftChildValue + rightChildValue; + } + + __syncthreads(); + } + + odata[globalThreadIdx] = blockSharedMem[threadIdx.x]; + } + __global__ void exclusiveScanKernel(int n, int *odata, int *idata, int *blockSumDevice = nullptr) { } @@ -37,6 +62,18 @@ namespace StreamCompaction { odata[globalThreadIdx] += blockSums[blockIdx.x]; } + void reduce(int n, int *odata, const int *idata) { + for (int i = 0; i < n; ++i) { + odata[i] = idata[i]; + } + + for (int d = 0; d < ::ilog2(n); ++d) { + for (int k = 0; k < n; k += (1 << (d+1))) { + odata[k + (1 << (d+1)) - 1] += odata[k + (1 << d) - 1]; + } + } + } + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ @@ -76,20 +113,22 @@ namespace StreamCompaction { cudaMemcpy(idataDevice, idata, n * sizeof(int), ::cudaMemcpyHostToDevice); - exclusiveScanKernel<<>>(n, odataDevice, idataDevice, iblockSumDevice); + reductionKernel<<>>(n, odataDevice, idataDevice); - // Debug. - cudaMemcpy(odataDeviceDebug, odataDevice, n * sizeof(int), ::cudaMemcpyDeviceToHost); - cudaMemcpy(iblockSumDeviceDebug, iblockSumDevice, blockCount.x * sizeof(int), ::cudaMemcpyDeviceToHost); - // Debug. + // exclusiveScanKernel<<>>(n, odataDevice, idataDevice, iblockSumDevice); - exclusiveScanKernel<<>>(blockCount.x, oblockSumDevice, iblockSumDevice); + // // Debug. + // cudaMemcpy(odataDeviceDebug, odataDevice, n * sizeof(int), ::cudaMemcpyDeviceToHost); + // cudaMemcpy(iblockSumDeviceDebug, iblockSumDevice, blockCount.x * sizeof(int), ::cudaMemcpyDeviceToHost); + // // Debug. - // Debug. - cudaMemcpy(oblockSumDeviceDebug, oblockSumDevice, blockCount.x * sizeof(int), ::cudaMemcpyDeviceToHost); - // Debug. + // exclusiveScanKernel<<>>(blockCount.x, oblockSumDevice, iblockSumDevice); + + // // Debug. + // cudaMemcpy(oblockSumDeviceDebug, oblockSumDevice, blockCount.x * sizeof(int), ::cudaMemcpyDeviceToHost); + // // Debug. - addBlockSumsKernel<<>>(n, odataDevice, oblockSumDevice); + // addBlockSumsKernel<<>>(n, odataDevice, oblockSumDevice); cudaMemcpy(odata, odataDevice, n * sizeof(int), ::cudaMemcpyDeviceToHost); diff --git a/stream_compaction/efficient.h b/stream_compaction/efficient.h index 803cb4f..6107530 100644 --- a/stream_compaction/efficient.h +++ b/stream_compaction/efficient.h @@ -6,6 +6,8 @@ namespace StreamCompaction { namespace Efficient { StreamCompaction::Common::PerformanceTimer& timer(); + void reduce(int n, int *odata, const int *idata); + void scan(int n, int *odata, const int *idata); int compact(int n, int *odata, const int *idata); From 0b9352135b6cec6a289f434d0bcb567b5a811e6a Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Sun, 15 Sep 2024 15:30:58 -0400 Subject: [PATCH 14/33] Implement StreamCompaction::Efficient::scan; fails for input sizes smaller than block size --- src/main.cpp | 40 +++++++++++++++---- stream_compaction/efficient.cu | 71 ++++++++++++++++++++++++++++------ 2 files changed, 91 insertions(+), 20 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index fff231e..0cd7784 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,8 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 10; // feel free to change the size of array +// TODO: work-efficient scan fails for size < 256. +const int SIZE = 1 << 8; // feel free to change the size of array const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; @@ -83,11 +84,11 @@ int main(int argc, char* argv[]) { printArray(SIZE, c, true); printCmpResult(SIZE, b, c); - /* For bug-finding only: Array of 1s to help find bugs in stream compaction or scan - onesArray(SIZE, c); - printDesc("1s array for finding bugs"); - StreamCompaction::Naive::scan(SIZE, c, a); - printArray(SIZE, c, true); */ + // For bug-finding only: Array of 1s to help find bugs in stream compaction or scan + // onesArray(SIZE, c); + // printDesc("1s array for finding bugs"); + // StreamCompaction::Naive::scan(SIZE, c, a); + // printArray(SIZE, c, true); zeroArray(SIZE, c); printDesc("naive scan, non-power-of-two"); @@ -96,18 +97,39 @@ int main(int argc, char* argv[]) { printArray(SIZE, c, true); printCmpResult(NPOT, b, c); + // zeroArray(SIZE, c); + // zeroArray(SIZE, d); + // printDesc("parallel reduction, power-of-two"); + // StreamCompaction::Efficient::reduce(SIZE, d, a); + // StreamCompaction::Efficient::scan(SIZE, c, a); + // printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + // printArray(SIZE, d, true); + // printArray(SIZE, c, true); + // printCmpResult(SIZE, c, d); + + // zeroArray(SIZE, c); + // zeroArray(SIZE, d); + // printDesc("parallel reduction, non-power-of-two"); + // StreamCompaction::Efficient::reduce(NPOT, d, a); + // StreamCompaction::Efficient::scan(NPOT, c, a); + // printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + // printArray(NPOT, d, true); + // printArray(NPOT, c, true); + // printCmpResult(NPOT, c, d); + + zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); StreamCompaction::Efficient::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); + printArray(SIZE, c, true); printCmpResult(SIZE, b, c); zeroArray(SIZE, c); printDesc("work-efficient scan, non-power-of-two"); StreamCompaction::Efficient::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(NPOT, c, true); + printArray(NPOT, c, true); printCmpResult(NPOT, b, c); zeroArray(SIZE, c); @@ -124,6 +146,7 @@ int main(int argc, char* argv[]) { //printArray(NPOT, c, true); printCmpResult(NPOT, b, c); +/* printf("\n"); printf("*****************************\n"); printf("** STREAM COMPACTION TESTS **\n"); @@ -175,6 +198,7 @@ int main(int argc, char* argv[]) { printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); +*/ system("pause"); // stop Win32 console from closing on exit delete[] a; diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index b762ffc..943bee6 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -24,6 +24,10 @@ namespace StreamCompaction { return x == 1 ? 0 : ilog2(x - 1) + 1; } + __device__ int nextPowerOfTwo(int n) { + return 1 << (ilog2ceil(n)); + } + __global__ void reductionKernel(int n, int *odata, int *idata) { extern __shared__ int blockSharedMem[]; @@ -50,7 +54,50 @@ namespace StreamCompaction { } __global__ void exclusiveScanKernel(int n, int *odata, int *idata, int *blockSumDevice = nullptr) { - + extern __shared__ int blockSharedMem[]; + + int globalThreadIdx = blockIdx.x*blockDim.x + threadIdx.x; + if (globalThreadIdx >= n) { + blockSharedMem[threadIdx.x] = 0; + } else { + blockSharedMem[threadIdx.x] = idata[globalThreadIdx]; + } + + __syncthreads(); + + for (int d = 0; d < ilog2ceil(n); ++d) { + if ((threadIdx.x + 1) % (1 << (d+1)) == 0) { + int leftChildValue = blockSharedMem[threadIdx.x - (1 << d)]; + int rightChildValue = blockSharedMem[threadIdx.x]; + blockSharedMem[threadIdx.x] = leftChildValue + rightChildValue; + } + + __syncthreads(); + } + + if (threadIdx.x == blockDim.x - 1) { + blockSharedMem[threadIdx.x] = 0; + } + + __syncthreads(); + + for (int d = ilog2ceil(n) - 1; d >= 0; --d) { + if ((threadIdx.x + 1) % (1 << (d+1)) == 0) { + int leftChildIdx = threadIdx.x - (1 << d); + int parentIdx = threadIdx.x; + int rightChildIdx = parentIdx; + int oldLeftChildValue = blockSharedMem[leftChildIdx]; + blockSharedMem[leftChildIdx] = blockSharedMem[parentIdx]; + blockSharedMem[rightChildIdx] += oldLeftChildValue; + } + __syncthreads(); + } + + odata[globalThreadIdx] = blockSharedMem[threadIdx.x]; + + if (blockSumDevice != nullptr && threadIdx.x == blockDim.x - 1) { + blockSumDevice[blockIdx.x] = blockSharedMem[blockDim.x - 1] + idata[globalThreadIdx]; + } } __global__ void addBlockSumsKernel(int n, int *odata, int *blockSums) { @@ -113,22 +160,22 @@ namespace StreamCompaction { cudaMemcpy(idataDevice, idata, n * sizeof(int), ::cudaMemcpyHostToDevice); - reductionKernel<<>>(n, odataDevice, idataDevice); + // reductionKernel<<>>(n, odataDevice, idataDevice); - // exclusiveScanKernel<<>>(n, odataDevice, idataDevice, iblockSumDevice); + exclusiveScanKernel<<>>(n, odataDevice, idataDevice, iblockSumDevice); - // // Debug. - // cudaMemcpy(odataDeviceDebug, odataDevice, n * sizeof(int), ::cudaMemcpyDeviceToHost); - // cudaMemcpy(iblockSumDeviceDebug, iblockSumDevice, blockCount.x * sizeof(int), ::cudaMemcpyDeviceToHost); - // // Debug. + // Debug. + cudaMemcpy(odataDeviceDebug, odataDevice, n * sizeof(int), ::cudaMemcpyDeviceToHost); + cudaMemcpy(iblockSumDeviceDebug, iblockSumDevice, blockCount.x * sizeof(int), ::cudaMemcpyDeviceToHost); + // Debug. - // exclusiveScanKernel<<>>(blockCount.x, oblockSumDevice, iblockSumDevice); + exclusiveScanKernel<<>>(blockCount.x, oblockSumDevice, iblockSumDevice); - // // Debug. - // cudaMemcpy(oblockSumDeviceDebug, oblockSumDevice, blockCount.x * sizeof(int), ::cudaMemcpyDeviceToHost); - // // Debug. + // Debug. + cudaMemcpy(oblockSumDeviceDebug, oblockSumDevice, blockCount.x * sizeof(int), ::cudaMemcpyDeviceToHost); + // Debug. - // addBlockSumsKernel<<>>(n, odataDevice, oblockSumDevice); + addBlockSumsKernel<<>>(n, odataDevice, oblockSumDevice); cudaMemcpy(odata, odataDevice, n * sizeof(int), ::cudaMemcpyDeviceToHost); From 996e4e3a215783cd9fed40eb2fcd5a9e1b77036b Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Sun, 15 Sep 2024 18:17:56 -0400 Subject: [PATCH 15/33] Add 0-padding up to next power of 2 when input size is not --- stream_compaction/efficient.cu | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 943bee6..a0b7e46 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -24,8 +24,8 @@ namespace StreamCompaction { return x == 1 ? 0 : ilog2(x - 1) + 1; } - __device__ int nextPowerOfTwo(int n) { - return 1 << (ilog2ceil(n)); + int nextPow2(int n) { + return 1 << (::ilog2ceil(n)); } __global__ void reductionKernel(int n, int *odata, int *idata) { @@ -56,6 +56,8 @@ namespace StreamCompaction { __global__ void exclusiveScanKernel(int n, int *odata, int *idata, int *blockSumDevice = nullptr) { extern __shared__ int blockSharedMem[]; + int actualBlockSize = n < blockDim.x ? n : blockDim.x; + int globalThreadIdx = blockIdx.x*blockDim.x + threadIdx.x; if (globalThreadIdx >= n) { blockSharedMem[threadIdx.x] = 0; @@ -75,7 +77,7 @@ namespace StreamCompaction { __syncthreads(); } - if (threadIdx.x == blockDim.x - 1) { + if (threadIdx.x == actualBlockSize - 1) { blockSharedMem[threadIdx.x] = 0; } @@ -95,8 +97,8 @@ namespace StreamCompaction { odata[globalThreadIdx] = blockSharedMem[threadIdx.x]; - if (blockSumDevice != nullptr && threadIdx.x == blockDim.x - 1) { - blockSumDevice[blockIdx.x] = blockSharedMem[blockDim.x - 1] + idata[globalThreadIdx]; + if (blockSumDevice != nullptr && threadIdx.x == actualBlockSize - 1) { + blockSumDevice[blockIdx.x] = blockSharedMem[actualBlockSize - 1] + idata[globalThreadIdx]; } } @@ -127,8 +129,11 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata) { timer().startGpuTimer(); + int nNextPow2 = nextPow2(n); + const int blockSize = 256; - dim3 blockCount = (n + blockSize - 1) / blockSize; + dim3 blockCount = (nNextPow2 + blockSize - 1) / blockSize; + // TODO: don't need this much shared memory. const int blockSharedMemSize = 2 * blockSize * sizeof(int); const int blockSumBlockSize = blockCount.x; @@ -136,11 +141,11 @@ namespace StreamCompaction { const int blockSumSharedMemSize = 2 * blockSumBlockSize * sizeof(int); int *idataDevice = nullptr; - cudaMalloc(&idataDevice, n * sizeof(int)); + cudaMalloc(&idataDevice, nNextPow2 * sizeof(int)); checkCUDAError("failed to malloc idataDevice"); int *odataDevice = nullptr; - cudaMalloc(&odataDevice, n * sizeof(int)); + cudaMalloc(&odataDevice, nNextPow2 * sizeof(int)); checkCUDAError("failed to malloc odataDevice"); int *iblockSumDevice = nullptr; @@ -162,7 +167,7 @@ namespace StreamCompaction { // reductionKernel<<>>(n, odataDevice, idataDevice); - exclusiveScanKernel<<>>(n, odataDevice, idataDevice, iblockSumDevice); + exclusiveScanKernel<<>>(nNextPow2, odataDevice, idataDevice, iblockSumDevice); // Debug. cudaMemcpy(odataDeviceDebug, odataDevice, n * sizeof(int), ::cudaMemcpyDeviceToHost); @@ -175,7 +180,7 @@ namespace StreamCompaction { cudaMemcpy(oblockSumDeviceDebug, oblockSumDevice, blockCount.x * sizeof(int), ::cudaMemcpyDeviceToHost); // Debug. - addBlockSumsKernel<<>>(n, odataDevice, oblockSumDevice); + addBlockSumsKernel<<>>(nNextPow2, odataDevice, oblockSumDevice); cudaMemcpy(odata, odataDevice, n * sizeof(int), ::cudaMemcpyDeviceToHost); From 8186d629ab2a9aad88aab8fb2671a31981b8a79d Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Sun, 15 Sep 2024 18:21:25 -0400 Subject: [PATCH 16/33] Implement kernMapToBoolean --- stream_compaction/common.cu | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 2ed6d63..bc6d9b2 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -23,7 +23,11 @@ namespace StreamCompaction { * which map to 0 will be removed, and elements which map to 1 will be kept. */ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { - // TODO + int globalThreadIdx = blockIdx.x*blockDim.x + threadIdx.x; + if (globalThreadIdx >= n) { + return; + } + bools[globalThreadIdx] = idata[globalThreadIdx] != 0 ? 1 : 0; } /** From b871f62781afd49d3871d9585a44a9ed81d397eb Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Sun, 15 Sep 2024 18:22:43 -0400 Subject: [PATCH 17/33] Implement kernScatter --- stream_compaction/common.cu | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index bc6d9b2..6dbf252 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -34,9 +34,16 @@ namespace StreamCompaction { * Performs scatter on an array. That is, for each element in idata, * if bools[idx] == 1, it copies idata[idx] to odata[indices[idx]]. */ - __global__ void kernScatter(int n, int *odata, - const int *idata, const int *bools, const int *indices) { - // TODO + __global__ void kernScatter( + int n, int *odata, const int *idata, const int *bools, const int *indices + ) { + int globalThreadIdx = blockIdx.x*blockDim.x + threadIdx.x; + if (globalThreadIdx >= n) { + return; + } + if (bools[globalThreadIdx] == 1) { + odata[indices[globalThreadIdx]] = idata[globalThreadIdx]; + } } } From 65b375769d276b69ff2dfe3bf82dd28cd0de69cb Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Sun, 15 Sep 2024 19:44:48 -0400 Subject: [PATCH 18/33] Implement StreamCompaction::Efficient::compact; fails for non-power-of-2 inputs --- stream_compaction/efficient.cu | 74 ++++++++++++++++++++++++++++++---- stream_compaction/efficient.h | 2 + 2 files changed, 68 insertions(+), 8 deletions(-) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index a0b7e46..9d498ed 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -123,12 +123,7 @@ namespace StreamCompaction { } } - /** - * Performs prefix-sum (aka scan) on idata, storing the result into odata. - */ - void scan(int n, int *odata, const int *idata) { - timer().startGpuTimer(); - + void scanNoTimer(int n, int *odata, const int *idata) { int nNextPow2 = nextPow2(n); const int blockSize = 256; @@ -195,6 +190,15 @@ namespace StreamCompaction { cudaFree(idataDevice); checkCUDAError("failed to free idataDevice"); + } + + /** + * Performs prefix-sum (aka scan) on idata, storing the result into odata. + */ + void scan(int n, int *odata, const int *idata) { + timer().startGpuTimer(); + + scanNoTimer(n, odata, idata); timer().endGpuTimer(); } @@ -210,9 +214,63 @@ namespace StreamCompaction { */ int compact(int n, int *odata, const int *idata) { timer().startGpuTimer(); - // TODO + + int blockSize = 256; + int blockCount = (n + blockSize - 1) / blockSize; + + int *idataDevice = nullptr; + cudaMalloc(&idataDevice, n * sizeof(int)); + checkCUDAError("failed to malloc idataDevice"); + cudaMemcpy(idataDevice, idata, n * sizeof(int), ::cudaMemcpyHostToDevice); + checkCUDAError("failed to memcpy idataDevice"); + + int *nonzeroMaskDevice = nullptr; + cudaMalloc(&nonzeroMaskDevice, n * sizeof(int)); + checkCUDAError("failed to malloc nonzeroMaskDevice"); + + int *nonzeroMaskPrefixSumDevice = nullptr; + cudaMalloc(&nonzeroMaskPrefixSumDevice, n * sizeof(int)); + checkCUDAError("failed to malloc nonzeroMaskPrefixSumDevice"); + + int *reducedNonzeroMaskDevice = nullptr; + cudaMalloc(&reducedNonzeroMaskDevice, n * sizeof(int)); + checkCUDAError("failed to malloc reducedNonzeroMaskDevice"); + + StreamCompaction::Common::kernMapToBoolean<<>>(n, nonzeroMaskDevice, idataDevice); + + scanNoTimer(n, nonzeroMaskPrefixSumDevice, nonzeroMaskDevice); + + reductionKernel<<>>(n, reducedNonzeroMaskDevice, nonzeroMaskDevice); + int nonzeroCount = 0; + cudaMemcpy(&nonzeroCount, &reducedNonzeroMaskDevice[n-1], sizeof(int), ::cudaMemcpyDeviceToHost); + + if (nonzeroCount > 0) { + int *odataDevice = nullptr; + cudaMalloc(&odataDevice, nonzeroCount * sizeof(int)); + checkCUDAError("failed to malloc odataDevice"); + + StreamCompaction::Common::kernScatter<<>>( + n, odataDevice, idataDevice, nonzeroMaskDevice, nonzeroMaskPrefixSumDevice + ); + + cudaMemcpy(odata, odataDevice, nonzeroCount * sizeof(int), ::cudaMemcpyDeviceToHost); + checkCUDAError("failed to memcpy odataDevice"); + + cudaFree(odataDevice); + checkCUDAError("failed to free odataDevice"); + } + + cudaFree(reducedNonzeroMaskDevice); + checkCUDAError("failed to free reducedNonzeroMaskDevice"); + cudaFree(nonzeroMaskPrefixSumDevice); + checkCUDAError("failed to free nonzeroMaskPrefixSumDevice"); + cudaFree(nonzeroMaskDevice); + checkCUDAError("failed to free nonzeroMaskDevice"); + cudaFree(idataDevice); + checkCUDAError("failed to free idataDevice"); + timer().endGpuTimer(); - return -1; + return nonzeroCount; } } } diff --git a/stream_compaction/efficient.h b/stream_compaction/efficient.h index 6107530..02eb445 100644 --- a/stream_compaction/efficient.h +++ b/stream_compaction/efficient.h @@ -10,6 +10,8 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata); + void scanNoTimer(int n, int *odata, const int *idata); + int compact(int n, int *odata, const int *idata); } } From 716067cdd08d8e4e4ec0219ca0907effb24ac412 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Sun, 15 Sep 2024 19:51:33 -0400 Subject: [PATCH 19/33] Get nonzero count from max prefix sum instead of reduction --- stream_compaction/efficient.cu | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 9d498ed..9976e2c 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -232,17 +232,15 @@ namespace StreamCompaction { cudaMalloc(&nonzeroMaskPrefixSumDevice, n * sizeof(int)); checkCUDAError("failed to malloc nonzeroMaskPrefixSumDevice"); - int *reducedNonzeroMaskDevice = nullptr; - cudaMalloc(&reducedNonzeroMaskDevice, n * sizeof(int)); - checkCUDAError("failed to malloc reducedNonzeroMaskDevice"); - StreamCompaction::Common::kernMapToBoolean<<>>(n, nonzeroMaskDevice, idataDevice); scanNoTimer(n, nonzeroMaskPrefixSumDevice, nonzeroMaskDevice); - reductionKernel<<>>(n, reducedNonzeroMaskDevice, nonzeroMaskDevice); - int nonzeroCount = 0; - cudaMemcpy(&nonzeroCount, &reducedNonzeroMaskDevice[n-1], sizeof(int), ::cudaMemcpyDeviceToHost); + int lastScanValue = 0; + int lastMaskValue = 0; + cudaMemcpy(&lastScanValue, &nonzeroMaskPrefixSumDevice[n - 1], sizeof(int), cudaMemcpyDeviceToHost); + cudaMemcpy(&lastMaskValue, &nonzeroMaskDevice[n - 1], sizeof(int), cudaMemcpyDeviceToHost); + int nonzeroCount = lastScanValue + lastMaskValue; if (nonzeroCount > 0) { int *odataDevice = nullptr; @@ -260,8 +258,6 @@ namespace StreamCompaction { checkCUDAError("failed to free odataDevice"); } - cudaFree(reducedNonzeroMaskDevice); - checkCUDAError("failed to free reducedNonzeroMaskDevice"); cudaFree(nonzeroMaskPrefixSumDevice); checkCUDAError("failed to free nonzeroMaskPrefixSumDevice"); cudaFree(nonzeroMaskDevice); From 08cc0ab7a69c84ef9e53735ba198bc27346828fc Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Mon, 16 Sep 2024 19:01:27 -0400 Subject: [PATCH 20/33] Run tests in loop of increasing sizes --- src/main.cpp | 164 +++++++++++++++++++++++----------------- src/testing_helpers.hpp | 11 ++- 2 files changed, 101 insertions(+), 74 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 0cd7784..196f204 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,22 +13,9 @@ #include #include "testing_helpers.hpp" -// TODO: work-efficient scan fails for size < 256. -const int SIZE = 1 << 8; // feel free to change the size of array -const int NPOT = SIZE - 3; // Non-Power-Of-Two -int *a = new int[SIZE]; -int *b = new int[SIZE]; -int *c = new int[SIZE]; -int *d = new int[SIZE]; - -int main(int argc, char* argv[]) { - // Scan tests - - printf("\n"); - printf("****************\n"); - printf("** SCAN TESTS **\n"); - printf("****************\n"); +#define MAX_SIZE 1 << 18 +void scanTests(const int SIZE, const int NPOT, int *a, int *b, int *c, int *d) { genArray(SIZE - 1, a, 50); // Leave a 0 at the end to test that edge case a[SIZE - 1] = 0; printArray(SIZE, a, true); @@ -46,43 +33,39 @@ int main(int argc, char* argv[]) { printDesc("cpu scan, non-power-of-two, exclusive, serial"); StreamCompaction::CPU::scan(NPOT, c, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - printArray(NPOT, c, true); - printCmpResult(NPOT, b, c); + if (!printCmpResult(NPOT, b, c)) printArray(NPOT, c, true); zeroArray(SIZE, d); printDesc("cpu scan, power-of-two, exclusive"); StreamCompaction::CPU::scanExclusive(SIZE, d, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - printArray(SIZE, d, true); - printCmpResult(SIZE, b, d); + if (!printCmpResult(SIZE, b, d)) printArray(SIZE, d, true); - zeroArray(SIZE, d); - printDesc("cpu scan, power-of-two, inclusive"); - StreamCompaction::CPU::scanInclusive(SIZE, d, a); - printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - printArray(SIZE, d, true); - printCmpResult(SIZE, b, d); + // zeroArray(SIZE, d); + // printDesc("cpu scan, power-of-two, inclusive"); + // StreamCompaction::CPU::scanInclusive(SIZE, d, a); + // printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + // printArray(SIZE, d, true); + // printCmpResult(SIZE, b, d); zeroArray(SIZE, d); printDesc("cpu scan, non-power-of-two, exclusive"); StreamCompaction::CPU::scanExclusive(NPOT, d, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - printArray(NPOT, d, true); - printCmpResult(NPOT, c, d); + if (!printCmpResult(NPOT, c, d)) printArray(NPOT, d, true); - zeroArray(SIZE, d); - printDesc("cpu scan, non-power-of-two, inclusive"); - StreamCompaction::CPU::scanInclusive(NPOT, d, a); - printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - printArray(NPOT, d, true); - printCmpResult(NPOT, c, d); + // zeroArray(SIZE, d); + // printDesc("cpu scan, non-power-of-two, inclusive"); + // StreamCompaction::CPU::scanInclusive(NPOT, d, a); + // printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + // printArray(NPOT, d, true); + // printCmpResult(NPOT, c, d); zeroArray(SIZE, c); printDesc("naive scan, power-of-two"); StreamCompaction::Naive::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - printArray(SIZE, c, true); - printCmpResult(SIZE, b, c); + if (!printCmpResult(SIZE, b, c)) printArray(SIZE, c, true); // For bug-finding only: Array of 1s to help find bugs in stream compaction or scan // onesArray(SIZE, c); @@ -94,8 +77,7 @@ int main(int argc, char* argv[]) { printDesc("naive scan, non-power-of-two"); StreamCompaction::Naive::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - printArray(SIZE, c, true); - printCmpResult(NPOT, b, c); + if (!printCmpResult(NPOT, b, c)) printArray(SIZE, c, true); // zeroArray(SIZE, c); // zeroArray(SIZE, d); @@ -117,43 +99,32 @@ int main(int argc, char* argv[]) { // printArray(NPOT, c, true); // printCmpResult(NPOT, c, d); - zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); StreamCompaction::Efficient::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - printArray(SIZE, c, true); - printCmpResult(SIZE, b, c); + if (!printCmpResult(SIZE, b, c)) printArray(SIZE, c, true); zeroArray(SIZE, c); printDesc("work-efficient scan, non-power-of-two"); StreamCompaction::Efficient::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - printArray(NPOT, c, true); - printCmpResult(NPOT, b, c); + if (!printCmpResult(NPOT, b, c)) printArray(NPOT, c, true); zeroArray(SIZE, c); printDesc("thrust scan, power-of-two"); StreamCompaction::Thrust::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); - printCmpResult(SIZE, b, c); + if (!printCmpResult(SIZE, b, c)) printArray(SIZE, c, true); zeroArray(SIZE, c); printDesc("thrust scan, non-power-of-two"); StreamCompaction::Thrust::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(NPOT, c, true); - printCmpResult(NPOT, b, c); - -/* - printf("\n"); - printf("*****************************\n"); - printf("** STREAM COMPACTION TESTS **\n"); - printf("*****************************\n"); - - // Compaction tests + if (!printCmpResult(NPOT, b, c)) printArray(NPOT, c, true); +} +void compactionTests(const int SIZE, const int NPOT, int *a, int *b, int *c, int *d) { genArray(SIZE - 1, a, 4); // Leave a 0 at the end to test that edge case a[SIZE - 1] = 0; printArray(SIZE, a, true); @@ -167,41 +138,94 @@ int main(int argc, char* argv[]) { count = StreamCompaction::CPU::compactWithoutScan(SIZE, b, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); expectedCount = count; - printArray(count, b, true); - printCmpLenResult(count, expectedCount, b, b); + if (!printCmpLenResult(count, expectedCount, b, b)) printArray(count, b, true); zeroArray(SIZE, c); printDesc("cpu compact without scan, non-power-of-two"); count = StreamCompaction::CPU::compactWithoutScan(NPOT, c, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); expectedNPOT = count; - printArray(count, c, true); - printCmpLenResult(count, expectedNPOT, b, c); + if (!printCmpLenResult(count, expectedNPOT, b, c)) printArray(count, c, true); zeroArray(SIZE, c); printDesc("cpu compact with scan"); count = StreamCompaction::CPU::compactWithScan(SIZE, c, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - printArray(count, c, true); - printCmpLenResult(count, expectedCount, b, c); + if (!printCmpLenResult(count, expectedCount, b, c)) printArray(count, c, true); zeroArray(SIZE, c); printDesc("work-efficient compact, power-of-two"); count = StreamCompaction::Efficient::compact(SIZE, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(count, c, true); - printCmpLenResult(count, expectedCount, b, c); + if (!printCmpLenResult(count, expectedCount, b, c)) printArray(count, c, true); zeroArray(SIZE, c); printDesc("work-efficient compact, non-power-of-two"); count = StreamCompaction::Efficient::compact(NPOT, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(count, c, true); - printCmpLenResult(count, expectedNPOT, b, c); -*/ - - system("pause"); // stop Win32 console from closing on exit - delete[] a; - delete[] b; - delete[] c; + if (!printCmpLenResult(count, expectedNPOT, b, c)) printArray(count, c, true); +} + +int main(int argc, char* argv[]) { + printf("\n"); + printf("****************\n"); + printf("** SCAN TESTS **\n"); + printf("****************\n"); + + // TODO: crashes for SIZE 1 and 2. + for (int SIZE = 4; SIZE <= MAX_SIZE; SIZE <<= 1) { + // TODO: work-efficient scan fails for size < 256. + // TODO: fails for 1 << 1. + // Non-power-of-two. + const int NPOT = SIZE - 3; + + printf("\n"); + printf("***********************************************************************\n"); + printf("**SCAN, SIZE = 2^%d = %d NPOT = %d **\n", ilog2(SIZE), SIZE, NPOT); + printf("***********************************************************************\n"); + + int *a = new int[SIZE]; + int *b = new int[SIZE]; + int *c = new int[SIZE]; + int *d = new int[SIZE]; + + scanTests(SIZE, NPOT, a, b, c, d); + + delete[] d; + delete[] c; + delete[] b; + delete[] a; + } + + printf("\n"); + printf("*****************************\n"); + printf("** STREAM COMPACTION TESTS **\n"); + printf("*****************************\n"); + + // TODO: crashes for SIZE 1 and 2. + for (int SIZE = 4; SIZE <= MAX_SIZE; SIZE <<= 1) { + // TODO: fails for 1 << 1. + // Non-power-of-two. + const int NPOT = SIZE - 3; + + printf("\n"); + printf("***********************************************************************\n"); + printf("**COMPACT, SIZE = 2^%d = %d NPOT = %d **\n", ilog2(SIZE), SIZE, NPOT); + printf("***********************************************************************\n"); + + int *a = new int[SIZE]; + int *b = new int[SIZE]; + int *c = new int[SIZE]; + int *d = new int[SIZE]; + + compactionTests(SIZE, NPOT, a, b, c, d); + + delete[] d; + delete[] c; + delete[] b; + delete[] a; + } + + // Stop Win32 console from closing on exit. + system("pause"); } diff --git a/src/testing_helpers.hpp b/src/testing_helpers.hpp index 025e94a..34e919c 100644 --- a/src/testing_helpers.hpp +++ b/src/testing_helpers.hpp @@ -22,19 +22,22 @@ void printDesc(const char *desc) { } template -void printCmpResult(int n, T *a, T *b) { - printf(" %s \n", - cmpArrays(n, a, b) ? "FAIL VALUE" : "passed"); +bool printCmpResult(int n, T *a, T *b) { + int passed = 0 == cmpArrays(n, a, b); + printf(" %s \n", !passed ? "FAIL VALUE" : "passed"); + return passed; } template -void printCmpLenResult(int n, int expN, T *a, T *b) { +bool printCmpLenResult(int n, int expN, T *a, T *b) { + bool passed = n == expN && 0 == cmpArrays(n, a, b); if (n != expN) { printf(" expected %d elements, got %d\n", expN, n); } printf(" %s \n", (n == -1 || n != expN) ? "FAIL COUNT" : cmpArrays(n, a, b) ? "FAIL VALUE" : "passed"); + return passed; } void zeroArray(int n, int *a) { From 0c43daef81c58c11588223a6d6183c030a6bf86a Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Mon, 16 Sep 2024 20:19:18 -0400 Subject: [PATCH 21/33] Refactor and clean up CPU scans --- src/main.cpp | 30 ++++-------- stream_compaction/cpu.cu | 100 ++++++++++++++------------------------- stream_compaction/cpu.h | 13 +++-- 3 files changed, 52 insertions(+), 91 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 196f204..f323e74 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -24,43 +24,29 @@ void scanTests(const int SIZE, const int NPOT, int *a, int *b, int *c, int *d) { // We use b for further comparison. Make sure your StreamCompaction::CPU::scan is correct. // At first all cases passed because b && c are all zeroes. zeroArray(SIZE, b); - printDesc("cpu scan, power-of-two, exclusive, serial"); - StreamCompaction::CPU::scan(SIZE, b, a); + printDesc("cpu scan, power-of-two, serial"); + StreamCompaction::CPU::scan(SIZE, b, a, /*simulateGPUScan=*/false); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(SIZE, b, true); zeroArray(SIZE, c); - printDesc("cpu scan, non-power-of-two, exclusive, serial"); - StreamCompaction::CPU::scan(NPOT, c, a); + printDesc("cpu scan, non-power-of-two, serial"); + StreamCompaction::CPU::scan(NPOT, c, a, /*simulateGPUScan=*/false); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); if (!printCmpResult(NPOT, b, c)) printArray(NPOT, c, true); zeroArray(SIZE, d); - printDesc("cpu scan, power-of-two, exclusive"); - StreamCompaction::CPU::scanExclusive(SIZE, d, a); + printDesc("cpu scan, power-of-two, simulated GPU scan"); + StreamCompaction::CPU::scan(SIZE, d, a, /*simulateGPUScan=*/true); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); if (!printCmpResult(SIZE, b, d)) printArray(SIZE, d, true); - // zeroArray(SIZE, d); - // printDesc("cpu scan, power-of-two, inclusive"); - // StreamCompaction::CPU::scanInclusive(SIZE, d, a); - // printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - // printArray(SIZE, d, true); - // printCmpResult(SIZE, b, d); - zeroArray(SIZE, d); - printDesc("cpu scan, non-power-of-two, exclusive"); - StreamCompaction::CPU::scanExclusive(NPOT, d, a); + printDesc("cpu scan, non-power-of-two, simulated GPU scan"); + StreamCompaction::CPU::scan(NPOT, d, a, /*simulateGPUScan=*/true); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); if (!printCmpResult(NPOT, c, d)) printArray(NPOT, d, true); - // zeroArray(SIZE, d); - // printDesc("cpu scan, non-power-of-two, inclusive"); - // StreamCompaction::CPU::scanInclusive(NPOT, d, a); - // printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - // printArray(NPOT, d, true); - // printCmpResult(NPOT, c, d); - zeroArray(SIZE, c); printDesc("naive scan, power-of-two"); StreamCompaction::Naive::scan(SIZE, c, a); diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index ade65a7..82d5de6 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -2,6 +2,7 @@ #include "cpu.h" #include "common.h" +#include namespace StreamCompaction { namespace CPU { @@ -13,20 +14,28 @@ namespace StreamCompaction { } /** - * CPU scan (prefix sum). + * CPU exlusive scan (prefix sum). * For performance analysis, this is supposed to be a simple for loop. - * (Optional) For better understanding before starting moving to GPU, you can simulate your GPU scan in this function first. - * Exclusive prefix sum. + * (Optional) For better understanding before starting moving to GPU, you can + * simulate your GPU scan in this function first. + * + * If simulateGPUScan is true, the algorithm mimics the GPU parallel algorithm + * of StreamCompaction::Naive::scan to some extent; differences lie around how + * the GPU version deals with arbitrary length inputs across more than 1 block. */ - void scan(int n, int *odata, const int *idata) { + void scan(int n, int *odata, const int *idata, bool simulateGPUScan) { timer().startCpuTimer(); - scanNoTimer(n, odata, idata); + if (simulateGPUScan) { + scanExclusiveSimulateGPU(n, odata, idata); + } else { + scanExclusiveSerial(n, odata, idata); + } timer().endCpuTimer(); } - void scanNoTimer(int n, int *odata, const int *idata) { + inline void scanExclusiveSerial(int n, int *odata, const int *idata) { // Put addition identity in first element. odata[0] = 0; // Serial version. @@ -35,71 +44,35 @@ namespace StreamCompaction { } } - // CPU version of parallel algorithm. Incorrect. - void scanExclusive(int n, int *odata, const int *idata) { - timer().startCpuTimer(); - - // Each new iteration should update k in [2^d, ...] only. - - int *auxBuffer = (int *)malloc(n * sizeof(int)); - int *iterInput = auxBuffer; + // CPU version of parallel algorithm. Mimics the GPU parallel algorithm in + // StreamCompaction::Naive::scan to some extent. The intention is not to be + // efficient, but to help understand the parallel algorithm. + inline void scanExclusiveSimulateGPU(int n, int *odata, const int *idata) { + // For each depth d, iterInput is read from and iterOutput is written to + // and then swapped. + std::vector auxBuffer(n); + int *iterInput = auxBuffer.data(); int *iterOutput = odata; + // Put addition identity in first element. iterInput[0] = 0; + + // Copy input data to iterInput, shifting by 1. This effectively turns + // an inclusive scan into an exclusive scan. for (int k = 1; k < n; ++k) { iterInput[k] = idata[k-1]; } for (int d = 1; d <= ilog2ceil(n); ++d) { - // At the beginning of each new iteration: - // - partial sums [0, 2^(d-1) - 1] are complete; - // - the rest are of the form x[k - 2^d - 1] + ... + x[k]. - for (int k = 0; k < n; ++k) { - if (k >= pow(2, d-1)) { - iterOutput[k] = iterInput[k - (int)pow(2, d-1)] + iterInput[k]; - } else { - iterOutput[k] = iterInput[k]; - } - - // y[k] is now: - // = x[k] + x[k - 1] + x[k - 2] + ... + x[k - 4] + .... + x[k - 2^(d-1)] - // = x[max(0, k - 2^(d) + 1), k - 2^(d-1)] + x[k - 2^(d-1) + 1, k] - // for d >= 1. - } - // Processing [2^d, n) completely before moving on to next d is equivalent - // to waiting on a barrier for all threads to reach it, in the parallel case. - - std::swap(iterInput, iterOutput); - } - - if (iterInput != odata) { - memcpy(odata, iterInput, n * sizeof(int)); - } + int delta = 1 << (d-1); - free(auxBuffer); - - timer().endCpuTimer(); - } - - void scanInclusive(int n, int *odata, const int *idata) { - timer().startCpuTimer(); - - // Each new iteration should update k in [2^d, ...] only. - - int *auxBuffer = (int *)malloc(n * sizeof(int)); - memcpy(auxBuffer, idata, n * sizeof(int)); - int *iterInput = auxBuffer; - int *iterOutput = odata; - - odata[0] = idata[0]; - - for (int d = 1; d <= ilog2ceil(n); ++d) { // At the beginning of each new iteration: // - partial sums [0, 2^(d-1) - 1] are complete; // - the rest are of the form x[k - 2^d - 1] + ... + x[k]. for (int k = 0; k < n; ++k) { - if (k >= pow(2, d-1)) { - iterOutput[k] = iterInput[k - (int)pow(2, d-1)] + iterInput[k]; + // Each new iteration should update k in [2^d, ...] only. + if (k >= delta) { + iterOutput[k] = iterInput[k - delta] + iterInput[k]; } else { iterOutput[k] = iterInput[k]; } @@ -109,19 +82,18 @@ namespace StreamCompaction { // = x[max(0, k - 2^(d) + 1), k - 2^(d-1)] + x[k - 2^(d-1) + 1, k] // for d >= 1. } - // Processing [2^d, n) completely before moving on to next d is equivalent + + // Processing [2^d, n) completely before moving on to next d is equivalent // to waiting on a barrier for all threads to reach it, in the parallel case. std::swap(iterInput, iterOutput); } + // Depending on the number of iterations, the final result (iterInput) may already + // be in odata. if (iterInput != odata) { memcpy(odata, iterInput, n * sizeof(int)); } - - free(auxBuffer); - - timer().endCpuTimer(); } /** @@ -159,7 +131,7 @@ namespace StreamCompaction { } int *nonzeroMaskPrefixSum = new int[n]; - scanNoTimer(n, nonzeroMaskPrefixSum, nonzeroMask); + scanExclusiveSerial(n, nonzeroMaskPrefixSum, nonzeroMask); int nonzeroCount = 0; for (int i = 0; i < n; ++i) { diff --git a/stream_compaction/cpu.h b/stream_compaction/cpu.h index b6af07b..234f40a 100644 --- a/stream_compaction/cpu.h +++ b/stream_compaction/cpu.h @@ -6,13 +6,16 @@ namespace StreamCompaction { namespace CPU { StreamCompaction::Common::PerformanceTimer& timer(); - void scan(int n, int *odata, const int *idata); + // Specify simulateGPUScan to choose between scanExclusiveSerial and + // scanExclusiveSimulateGPU. + void scan(int n, int *odata, const int *idata, bool simulateGPUScan = true); - void scanNoTimer(int n, int *odata, const int *idata); + // Completely serial version of exclusive scan in CPU. + void scanExclusiveSerial(int n, int *odata, const int *idata); - void scanExclusive(int n, int *odata, const int *idata); - - void scanInclusive(int n, int *odata, const int *idata); + // CPU version of parallel algorithm. Mimics the GPU parallel algorithm in + // StreamCompaction::Naive::scan to some extent. + void scanExclusiveSimulateGPU(int n, int *odata, const int *idata); int compactWithoutScan(int n, int *odata, const int *idata); From 472b9121877e6c1014bca088d25d8a192b53eb83 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Mon, 16 Sep 2024 21:17:51 -0400 Subject: [PATCH 22/33] Add comments to CPU compaction --- stream_compaction/cpu.cu | 3 +++ 1 file changed, 3 insertions(+) diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 82d5de6..77cdecb 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -125,14 +125,17 @@ namespace StreamCompaction { int compactWithScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); + // Identify non-zero elements by marking them with 1 in the mask. int *nonzeroMask = new int[n]; for (int i = 0; i < n; ++i) { nonzeroMask[i] = (idata[i] != 0) ? 1 : 0; } + // Exclusive scan the mask. int *nonzeroMaskPrefixSum = new int[n]; scanExclusiveSerial(n, nonzeroMaskPrefixSum, nonzeroMask); + // Scatter the non-zero elements. int nonzeroCount = 0; for (int i = 0; i < n; ++i) { if (nonzeroMask[i]) { From ae96f6d739ff184f55ca434e015881ba41599ca4 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Mon, 16 Sep 2024 22:44:55 -0400 Subject: [PATCH 23/33] Clean up and add comments to StreamCompation::Naive --- stream_compaction/cpu.cu | 7 ++-- stream_compaction/naive.cu | 72 ++++++++++++++++++++++++++------------ 2 files changed, 55 insertions(+), 24 deletions(-) diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 77cdecb..ea5afb4 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -64,14 +64,17 @@ namespace StreamCompaction { } for (int d = 1; d <= ilog2ceil(n); ++d) { + // Elements to be added are this much apart. int delta = 1 << (d-1); // At the beginning of each new iteration: // - partial sums [0, 2^(d-1) - 1] are complete; // - the rest are of the form x[k - 2^d - 1] + ... + x[k]. for (int k = 0; k < n; ++k) { - // Each new iteration should update k in [2^d, ...] only. - if (k >= delta) { + // Each new iteration should update k in [2^d-1, ...] only. + if (k > delta) { + // Note that if k = delta, then iterInput[k - delta] = 0, so + // that's handled by the other case. iterOutput[k] = iterInput[k - delta] + iterInput[k]; } else { iterOutput[k] = iterInput[k]; diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 78500e0..a201e4c 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -24,20 +24,35 @@ namespace StreamCompaction { return x == 1 ? 0 : ilog2(x - 1) + 1; } + // Performs exclusive scan on idata *per block*, not on the whole n elements at a time. + // Uses shared memory to perform the scan at the block level, alternating 2 buffers for + // reads and writes each iteration, before copying the resulting partial sums to odata + // at the end. + // + // If blockSumDevice is not nullptr, the final prefix sum computed by the block is stored + // in blockSumDevice[blockIdx.x]. __global__ void exclusiveScanKernel(int n, int *odata, int *idata, int *blockSumDevice = nullptr) { + // Shared memory buffer should be twice the size of the block, so that we may have 2 + // buffers to alternate reads and writes. extern __shared__ int blockSharedMem[]; int globalThreadIdx = blockIdx.x*blockDim.x + threadIdx.x; if (globalThreadIdx >= n) { + // Extra threads in the last block. return; } + // For each depth d, iterInput is read from and iterOutput is written to + // and then swapped. int *iterInput = blockSharedMem; int *iterOutput = blockSharedMem + blockDim.x; if (threadIdx.x == 0) { + // Put addition identity in first element. iterInput[threadIdx.x] = 0; } else { + // Copy input data to iterInput, shifting by 1. This effectively turns + // an inclusive scan into an exclusive scan. iterInput[threadIdx.x] = idata[globalThreadIdx-1]; } @@ -45,8 +60,17 @@ namespace StreamCompaction { int k = threadIdx.x; for (int d = 1; d <= ilog2ceil(n); ++d) { - if (k >= pow(2, d-1)) { - iterOutput[k] = iterInput[k - (int)pow(2, d-1)] + iterInput[k]; + // Elements to be added are this much apart. + int delta = 1 << (d-1); + + // At the beginning of each new iteration: + // - partial sums [0, 2^(d-1) - 1] are complete; + // - the rest are of the form x[k - 2^d - 1] + ... + x[k]. + + if (k > delta) { + // Note that if k = delta, then iterInput[k - delta] = 0, so that's handled + // by the other case. + iterOutput[k] = iterInput[k - delta] + iterInput[k]; } else { iterOutput[k] = iterInput[k]; } @@ -58,14 +82,25 @@ namespace StreamCompaction { iterOutput = tmp; } + // iterInput now contains the final result of the scan for this block. + // + // The synchronization barrier at the end of the loop ensures that all threads + // have finished writing to iterInput before we copy the results to odata; all + // threads execute exactly the same number of iterations, so we don't need to + // worry about threads in the same block being at different stages of the scan. odata[globalThreadIdx] = iterInput[threadIdx.x]; + // blockSumDevice will store the final prefix sums computed by all blocks to + // later combine all blocks' results. if (blockSumDevice != nullptr && threadIdx.x == blockDim.x - 1) { + // An exclusive scan doesn't include the last element, so we need to add it. blockSumDevice[blockIdx.x] = iterInput[blockDim.x - 1] + idata[globalThreadIdx]; } } - __global__ void addBlockSumsKernel(int n, int *odata, int *blockSums) { + // Adds the per-block final prefix sums stored in blockSums to the elements of the + // corresponding blocks in odata. + __global__ void addBlockIncrementsKernel(int n, int *odata, int *blockSums) { int globalThreadIdx = blockIdx.x*blockDim.x + threadIdx.x; if (globalThreadIdx >= n) { return; @@ -80,12 +115,16 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata) { timer().startGpuTimer(); + // Kernel configuration for the block-level scan and block sum computation. const int blockSize = 256; dim3 blockCount = (n + blockSize - 1) / blockSize; + // For double buffering, shared memory must be able to host 2 block-sized buffers. const int blockSharedMemSize = 2 * blockSize * sizeof(int); + // Kernel configuration for the block sum scan (all blocks' final prefix sums). const int blockSumBlockSize = blockCount.x; dim3 blockSumBlockCount = (blockCount.x + blockSumBlockSize - 1) / blockSumBlockSize; + // For double buffering, shared memory must be able to host 2 block-sized buffers. const int blockSumSharedMemSize = 2 * blockSumBlockSize * sizeof(int); int *idataDevice = nullptr; @@ -104,31 +143,20 @@ namespace StreamCompaction { cudaMalloc(&oblockSumDevice, blockCount.x * sizeof(int)); checkCUDAError("failed to malloc oblockSumDevice"); - // Debug. - int *odataDeviceDebug = (int *)malloc(n * sizeof(int)); - int *iblockSumDeviceDebug = (int *)malloc(blockCount.x * sizeof(int)); - int* oblockSumDeviceDebug = (int *)malloc(blockCount.x * sizeof(int)); - int* odataDeviceAfterSumDebug = (int*)malloc(n * sizeof(int)); - // Debug. - - cudaMemcpy(idataDevice, idata, n * sizeof(int), ::cudaMemcpyHostToDevice); + cudaMemcpy(idataDevice, idata, n * sizeof(int), cudaMemcpyHostToDevice); + // Per-block exclusive scan of the original input. iblockSumDevice will store the + // final prefix sums computed by each block. exclusiveScanKernel<<>>(n, odataDevice, idataDevice, iblockSumDevice); - // Debug. - cudaMemcpy(odataDeviceDebug, odataDevice, n * sizeof(int), ::cudaMemcpyDeviceToHost); - cudaMemcpy(iblockSumDeviceDebug, iblockSumDevice, blockCount.x * sizeof(int), ::cudaMemcpyDeviceToHost); - // Debug. - + // Exclusive scan of the final prefix sums computed by each block. oblockSumDevice + // will store the increments to be added to each block's scan results. exclusiveScanKernel<<>>(blockCount.x, oblockSumDevice, iblockSumDevice); - // Debug. - cudaMemcpy(oblockSumDeviceDebug, oblockSumDevice, blockCount.x * sizeof(int), ::cudaMemcpyDeviceToHost); - // Debug. - - addBlockSumsKernel<<>>(n, odataDevice, oblockSumDevice); + // Add the block increments to the original scan results to obtain final results. + addBlockIncrementsKernel<<>>(n, odataDevice, oblockSumDevice); - cudaMemcpy(odata, odataDevice, n * sizeof(int), ::cudaMemcpyDeviceToHost); + cudaMemcpy(odata, odataDevice, n * sizeof(int), cudaMemcpyDeviceToHost); cudaFree(oblockSumDevice); checkCUDAError("failed to free oblockSumDevice"); From b60123c0f8c813910b9c233c5af00f1f546f93d5 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Tue, 17 Sep 2024 13:14:57 -0400 Subject: [PATCH 24/33] Clean up and add comments to StreamCompaction::Efficient --- src/main.cpp | 20 ---- stream_compaction/efficient.cu | 162 +++++++++++++++++---------------- stream_compaction/efficient.h | 2 - stream_compaction/naive.cu | 3 - 4 files changed, 85 insertions(+), 102 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index f323e74..41f1c17 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -65,26 +65,6 @@ void scanTests(const int SIZE, const int NPOT, int *a, int *b, int *c, int *d) { printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); if (!printCmpResult(NPOT, b, c)) printArray(SIZE, c, true); - // zeroArray(SIZE, c); - // zeroArray(SIZE, d); - // printDesc("parallel reduction, power-of-two"); - // StreamCompaction::Efficient::reduce(SIZE, d, a); - // StreamCompaction::Efficient::scan(SIZE, c, a); - // printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - // printArray(SIZE, d, true); - // printArray(SIZE, c, true); - // printCmpResult(SIZE, c, d); - - // zeroArray(SIZE, c); - // zeroArray(SIZE, d); - // printDesc("parallel reduction, non-power-of-two"); - // StreamCompaction::Efficient::reduce(NPOT, d, a); - // StreamCompaction::Efficient::scan(NPOT, c, a); - // printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - // printArray(NPOT, d, true); - // printArray(NPOT, c, true); - // printCmpResult(NPOT, c, d); - zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); StreamCompaction::Efficient::scan(SIZE, c, a); diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 9976e2c..aba3260 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -24,42 +24,17 @@ namespace StreamCompaction { return x == 1 ? 0 : ilog2(x - 1) + 1; } - int nextPow2(int n) { - return 1 << (::ilog2ceil(n)); - } - - __global__ void reductionKernel(int n, int *odata, int *idata) { - extern __shared__ int blockSharedMem[]; - - int globalThreadIdx = blockIdx.x*blockDim.x + threadIdx.x; - if (globalThreadIdx >= n) { - return; - } - - blockSharedMem[threadIdx.x] = idata[globalThreadIdx]; - - __syncthreads(); - - for (int d = 0; d < ilog2(n); ++d) { - if ((threadIdx.x + 1) % (1 << (d+1)) == 0) { - int leftChildValue = blockSharedMem[threadIdx.x - (1 << d)]; - int rightChildValue = blockSharedMem[threadIdx.x]; - blockSharedMem[threadIdx.x] = leftChildValue + rightChildValue; - } - - __syncthreads(); - } - - odata[globalThreadIdx] = blockSharedMem[threadIdx.x]; - } - __global__ void exclusiveScanKernel(int n, int *odata, int *idata, int *blockSumDevice = nullptr) { + // Block-level scan is done in shared memory. extern __shared__ int blockSharedMem[]; - int actualBlockSize = n < blockDim.x ? n : blockDim.x; + int lastThreadIdxInBlock = (n < blockDim.x ? n : blockDim.x) - 1; int globalThreadIdx = blockIdx.x*blockDim.x + threadIdx.x; if (globalThreadIdx >= n) { + // Threads that don't correspond to actual elements in the input array pad the + // buffer with 0s so that the algorithm can proceed as if the input size were + // a power of 2. blockSharedMem[threadIdx.x] = 0; } else { blockSharedMem[threadIdx.x] = idata[globalThreadIdx]; @@ -67,6 +42,8 @@ namespace StreamCompaction { __syncthreads(); + // Up-sweep begins. + for (int d = 0; d < ilog2ceil(n); ++d) { if ((threadIdx.x + 1) % (1 << (d+1)) == 0) { int leftChildValue = blockSharedMem[threadIdx.x - (1 << d)]; @@ -77,7 +54,9 @@ namespace StreamCompaction { __syncthreads(); } - if (threadIdx.x == actualBlockSize - 1) { + // Down-sweep begins. + + if (threadIdx.x == lastThreadIdxInBlock) { blockSharedMem[threadIdx.x] = 0; } @@ -97,12 +76,17 @@ namespace StreamCompaction { odata[globalThreadIdx] = blockSharedMem[threadIdx.x]; - if (blockSumDevice != nullptr && threadIdx.x == actualBlockSize - 1) { - blockSumDevice[blockIdx.x] = blockSharedMem[actualBlockSize - 1] + idata[globalThreadIdx]; + // blockSumDevice will store the final prefix sums computed by all blocks to + // later combine all blocks' results. + if (blockSumDevice != nullptr && threadIdx.x == lastThreadIdxInBlock) { + // An exclusive scan doesn't include the last element, so we need to add it. + blockSumDevice[blockIdx.x] = blockSharedMem[lastThreadIdxInBlock] + idata[globalThreadIdx]; } } - __global__ void addBlockSumsKernel(int n, int *odata, int *blockSums) { + // Adds the per-block final prefix sums stored in blockSums to the elements of the + // corresponding blocks in odata. + __global__ void addBlockIncrementsKernel(int n, int *odata, int *blockSums) { int globalThreadIdx = blockIdx.x*blockDim.x + threadIdx.x; if (globalThreadIdx >= n) { return; @@ -111,29 +95,28 @@ namespace StreamCompaction { odata[globalThreadIdx] += blockSums[blockIdx.x]; } - void reduce(int n, int *odata, const int *idata) { - for (int i = 0; i < n; ++i) { - odata[i] = idata[i]; - } - - for (int d = 0; d < ::ilog2(n); ++d) { - for (int k = 0; k < n; k += (1 << (d+1))) { - odata[k + (1 << (d+1)) - 1] += odata[k + (1 << d) - 1]; - } - } - } - void scanNoTimer(int n, int *odata, const int *idata) { - int nNextPow2 = nextPow2(n); - + // Round up the input size to the next power of 2 to handle non-power-of-2 inputs + // and inputs smaller than the block size. Arrays will be padded with 0s to fill + // the extra space. Since the algorithm arranges its computations in a balanced + // binary tree, it's easier to have it perform extra work with the extra 0s while + // following a general algorithm, than to have it handle the edge cases introduced + // by incompatible input sizes. + // + // Padding with 0s is done in the kernel. + int nNextPow2 = 1 << (::ilog2ceil(n)); + + // Kernel configuration for the block-level scan and block sum computation. const int blockSize = 256; dim3 blockCount = (nNextPow2 + blockSize - 1) / blockSize; - // TODO: don't need this much shared memory. - const int blockSharedMemSize = 2 * blockSize * sizeof(int); + // No double buffering, so just one block-sized shared memory chunk is needed. + const int blockSharedMemSize = blockSize * sizeof(int); + // Kernel configuration for the block sum scan (all blocks' final prefix sums). const int blockSumBlockSize = blockCount.x; dim3 blockSumBlockCount = (blockCount.x + blockSumBlockSize - 1) / blockSumBlockSize; - const int blockSumSharedMemSize = 2 * blockSumBlockSize * sizeof(int); + // No double buffering, so just one block-sized shared memory chunk is needed. + const int blockSumSharedMemSize = blockSumBlockSize * sizeof(int); int *idataDevice = nullptr; cudaMalloc(&idataDevice, nNextPow2 * sizeof(int)); @@ -151,43 +134,28 @@ namespace StreamCompaction { cudaMalloc(&oblockSumDevice, blockCount.x * sizeof(int)); checkCUDAError("failed to malloc oblockSumDevice"); - // Debug. - int *odataDeviceDebug = (int *)malloc(n * sizeof(int)); - int *iblockSumDeviceDebug = (int *)malloc(blockCount.x * sizeof(int)); - int* oblockSumDeviceDebug = (int *)malloc(blockCount.x * sizeof(int)); - int* odataDeviceAfterSumDebug = (int*)malloc(n * sizeof(int)); - // Debug. - - cudaMemcpy(idataDevice, idata, n * sizeof(int), ::cudaMemcpyHostToDevice); - - // reductionKernel<<>>(n, odataDevice, idataDevice); + // If input needs to be padded with 0s, that'll be done in the kernel. + cudaMemcpy(idataDevice, idata, n * sizeof(int), cudaMemcpyHostToDevice); + // Per-block exclusive scan of the original input. iblockSumDevice will store the + // final prefix sums computed by each block. exclusiveScanKernel<<>>(nNextPow2, odataDevice, idataDevice, iblockSumDevice); - // Debug. - cudaMemcpy(odataDeviceDebug, odataDevice, n * sizeof(int), ::cudaMemcpyDeviceToHost); - cudaMemcpy(iblockSumDeviceDebug, iblockSumDevice, blockCount.x * sizeof(int), ::cudaMemcpyDeviceToHost); - // Debug. - + // Exclusive scan of the final prefix sums computed by each block. oblockSumDevice + // will store the increments to be added to each block's scan results. exclusiveScanKernel<<>>(blockCount.x, oblockSumDevice, iblockSumDevice); - // Debug. - cudaMemcpy(oblockSumDeviceDebug, oblockSumDevice, blockCount.x * sizeof(int), ::cudaMemcpyDeviceToHost); - // Debug. - - addBlockSumsKernel<<>>(nNextPow2, odataDevice, oblockSumDevice); + // Add the block increments to the original scan results to obtain final results. + addBlockIncrementsKernel<<>>(nNextPow2, odataDevice, oblockSumDevice); - cudaMemcpy(odata, odataDevice, n * sizeof(int), ::cudaMemcpyDeviceToHost); + cudaMemcpy(odata, odataDevice, n * sizeof(int), cudaMemcpyDeviceToHost); cudaFree(oblockSumDevice); checkCUDAError("failed to free oblockSumDevice"); - cudaFree(iblockSumDevice); checkCUDAError("failed to free iblockSumDevice"); - cudaFree(odataDevice); checkCUDAError("failed to free odataDevice"); - cudaFree(idataDevice); checkCUDAError("failed to free idataDevice"); } @@ -221,7 +189,7 @@ namespace StreamCompaction { int *idataDevice = nullptr; cudaMalloc(&idataDevice, n * sizeof(int)); checkCUDAError("failed to malloc idataDevice"); - cudaMemcpy(idataDevice, idata, n * sizeof(int), ::cudaMemcpyHostToDevice); + cudaMemcpy(idataDevice, idata, n * sizeof(int), cudaMemcpyHostToDevice); checkCUDAError("failed to memcpy idataDevice"); int *nonzeroMaskDevice = nullptr; @@ -251,7 +219,7 @@ namespace StreamCompaction { n, odataDevice, idataDevice, nonzeroMaskDevice, nonzeroMaskPrefixSumDevice ); - cudaMemcpy(odata, odataDevice, nonzeroCount * sizeof(int), ::cudaMemcpyDeviceToHost); + cudaMemcpy(odata, odataDevice, nonzeroCount * sizeof(int), cudaMemcpyDeviceToHost); checkCUDAError("failed to memcpy odataDevice"); cudaFree(odataDevice); @@ -268,5 +236,45 @@ namespace StreamCompaction { timer().endGpuTimer(); return nonzeroCount; } + + // Parallel reduction corresponding to up-sweep phase of scan. Standalone version + // to test it. + __global__ void reductionKernel(int n, int *odata, int *idata) { + extern __shared__ int blockSharedMem[]; + + int globalThreadIdx = blockIdx.x*blockDim.x + threadIdx.x; + if (globalThreadIdx >= n) { + blockSharedMem[threadIdx.x] = 0; + } else { + blockSharedMem[threadIdx.x] = idata[globalThreadIdx]; + } + + __syncthreads(); + + for (int d = 0; d < ilog2ceil(n); ++d) { + if ((threadIdx.x + 1) % (1 << (d+1)) == 0) { + int leftChildValue = blockSharedMem[threadIdx.x - (1 << d)]; + int rightChildValue = blockSharedMem[threadIdx.x]; + blockSharedMem[threadIdx.x] = leftChildValue + rightChildValue; + } + + __syncthreads(); + } + + odata[globalThreadIdx] = blockSharedMem[threadIdx.x]; + } + + // CPU version of the reduction kernel (up-sweep), for testing and comparison. + void reduce(int n, int *odata, const int *idata) { + for (int i = 0; i < n; ++i) { + odata[i] = idata[i]; + } + + for (int d = 0; d < ::ilog2(n); ++d) { + for (int k = 0; k < n; k += (1 << (d+1))) { + odata[k + (1 << (d+1)) - 1] += odata[k + (1 << d) - 1]; + } + } + } } } diff --git a/stream_compaction/efficient.h b/stream_compaction/efficient.h index 02eb445..083a218 100644 --- a/stream_compaction/efficient.h +++ b/stream_compaction/efficient.h @@ -6,8 +6,6 @@ namespace StreamCompaction { namespace Efficient { StreamCompaction::Common::PerformanceTimer& timer(); - void reduce(int n, int *odata, const int *idata); - void scan(int n, int *odata, const int *idata); void scanNoTimer(int n, int *odata, const int *idata); diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index a201e4c..b8fba0b 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -160,13 +160,10 @@ namespace StreamCompaction { cudaFree(oblockSumDevice); checkCUDAError("failed to free oblockSumDevice"); - cudaFree(iblockSumDevice); checkCUDAError("failed to free iblockSumDevice"); - cudaFree(odataDevice); checkCUDAError("failed to free odataDevice"); - cudaFree(idataDevice); checkCUDAError("failed to free idataDevice"); From 3defe6efec66625540a9bcfe827d2ed8c47bc296 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Tue, 17 Sep 2024 13:41:00 -0400 Subject: [PATCH 25/33] Synchronize CPU-GPU after kernel launches --- stream_compaction/efficient.cu | 5 +++++ stream_compaction/naive.cu | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index aba3260..cd6ffc4 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -137,16 +137,21 @@ namespace StreamCompaction { // If input needs to be padded with 0s, that'll be done in the kernel. cudaMemcpy(idataDevice, idata, n * sizeof(int), cudaMemcpyHostToDevice); + // No need to synchronize here: the CPU blocks until the transfer is complete. + // Per-block exclusive scan of the original input. iblockSumDevice will store the // final prefix sums computed by each block. exclusiveScanKernel<<>>(nNextPow2, odataDevice, idataDevice, iblockSumDevice); + cudaDeviceSynchronize(); // Exclusive scan of the final prefix sums computed by each block. oblockSumDevice // will store the increments to be added to each block's scan results. exclusiveScanKernel<<>>(blockCount.x, oblockSumDevice, iblockSumDevice); + cudaDeviceSynchronize(); // Add the block increments to the original scan results to obtain final results. addBlockIncrementsKernel<<>>(nNextPow2, odataDevice, oblockSumDevice); + cudaDeviceSynchronize(); cudaMemcpy(odata, odataDevice, n * sizeof(int), cudaMemcpyDeviceToHost); diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index b8fba0b..61c0b33 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -145,16 +145,21 @@ namespace StreamCompaction { cudaMemcpy(idataDevice, idata, n * sizeof(int), cudaMemcpyHostToDevice); + // No need to synchronize here: the CPU blocks until the transfer is complete. + // Per-block exclusive scan of the original input. iblockSumDevice will store the // final prefix sums computed by each block. exclusiveScanKernel<<>>(n, odataDevice, idataDevice, iblockSumDevice); + cudaDeviceSynchronize(); // Exclusive scan of the final prefix sums computed by each block. oblockSumDevice // will store the increments to be added to each block's scan results. exclusiveScanKernel<<>>(blockCount.x, oblockSumDevice, iblockSumDevice); + cudaDeviceSynchronize(); // Add the block increments to the original scan results to obtain final results. addBlockIncrementsKernel<<>>(n, odataDevice, oblockSumDevice); + cudaDeviceSynchronize(); cudaMemcpy(odata, odataDevice, n * sizeof(int), cudaMemcpyDeviceToHost); From 1b7af7fca9156fb3dd93021ce7a9638daafe1187 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Tue, 17 Sep 2024 14:46:19 -0400 Subject: [PATCH 26/33] Synchronize CPU-GPU after kernel calls in compact --- stream_compaction/efficient.cu | 28 ++++++++++++++++++++++++---- stream_compaction/naive.cu | 7 ++++++- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index cd6ffc4..401e199 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -112,6 +112,7 @@ namespace StreamCompaction { // No double buffering, so just one block-sized shared memory chunk is needed. const int blockSharedMemSize = blockSize * sizeof(int); + // TODO: block count should be just enough for n, not nNextPow2. // Kernel configuration for the block sum scan (all blocks' final prefix sums). const int blockSumBlockSize = blockCount.x; dim3 blockSumBlockCount = (blockCount.x + blockSumBlockSize - 1) / blockSumBlockSize; @@ -136,8 +137,12 @@ namespace StreamCompaction { // If input needs to be padded with 0s, that'll be done in the kernel. cudaMemcpy(idataDevice, idata, n * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("failed to mempcy idata to idataDevice"); - // No need to synchronize here: the CPU blocks until the transfer is complete. + // No need to synchronize CPU-GPU here: the CPU blocks until the transfer is complete. + // "The function will return once the pageable buffer has been copied to the staging + // memory for DMA transfer to device memory ...", according to + // https://docs.nvidia.com/cuda/cuda-runtime-api/api-sync-behavior.html#api-sync-behavior__memcpy-sync. // Per-block exclusive scan of the original input. iblockSumDevice will store the // final prefix sums computed by each block. @@ -154,6 +159,7 @@ namespace StreamCompaction { cudaDeviceSynchronize(); cudaMemcpy(odata, odataDevice, n * sizeof(int), cudaMemcpyDeviceToHost); + checkCUDAError("failed to mempcy odataDevice to odata"); cudaFree(oblockSumDevice); checkCUDAError("failed to free oblockSumDevice"); @@ -194,8 +200,6 @@ namespace StreamCompaction { int *idataDevice = nullptr; cudaMalloc(&idataDevice, n * sizeof(int)); checkCUDAError("failed to malloc idataDevice"); - cudaMemcpy(idataDevice, idata, n * sizeof(int), cudaMemcpyHostToDevice); - checkCUDAError("failed to memcpy idataDevice"); int *nonzeroMaskDevice = nullptr; cudaMalloc(&nonzeroMaskDevice, n * sizeof(int)); @@ -205,13 +209,26 @@ namespace StreamCompaction { cudaMalloc(&nonzeroMaskPrefixSumDevice, n * sizeof(int)); checkCUDAError("failed to malloc nonzeroMaskPrefixSumDevice"); + cudaMemcpy(idataDevice, idata, n * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("failed to memcpy idata to idataDevice"); + + // No need to synchronize CPU-GPU here: the CPU blocks until the transfer is complete. + // "The function will return once the pageable buffer has been copied to the staging + // memory for DMA transfer to device memory ...", according to + // https://docs.nvidia.com/cuda/cuda-runtime-api/api-sync-behavior.html#api-sync-behavior__memcpy-sync. + + // Identify non-zero elements by marking them with 1 in the mask. StreamCompaction::Common::kernMapToBoolean<<>>(n, nonzeroMaskDevice, idataDevice); + cudaDeviceSynchronize(); + // Exclusive scan the mask. scanNoTimer(n, nonzeroMaskPrefixSumDevice, nonzeroMaskDevice); + cudaDeviceSynchronize(); int lastScanValue = 0; int lastMaskValue = 0; cudaMemcpy(&lastScanValue, &nonzeroMaskPrefixSumDevice[n - 1], sizeof(int), cudaMemcpyDeviceToHost); + // An exclusive scan doesn't include the last element, so we need to add it. cudaMemcpy(&lastMaskValue, &nonzeroMaskDevice[n - 1], sizeof(int), cudaMemcpyDeviceToHost); int nonzeroCount = lastScanValue + lastMaskValue; @@ -220,16 +237,19 @@ namespace StreamCompaction { cudaMalloc(&odataDevice, nonzeroCount * sizeof(int)); checkCUDAError("failed to malloc odataDevice"); + // Scatter the non-zero elements. StreamCompaction::Common::kernScatter<<>>( n, odataDevice, idataDevice, nonzeroMaskDevice, nonzeroMaskPrefixSumDevice ); + cudaDeviceSynchronize(); cudaMemcpy(odata, odataDevice, nonzeroCount * sizeof(int), cudaMemcpyDeviceToHost); - checkCUDAError("failed to memcpy odataDevice"); + checkCUDAError("failed to memcpy odataDevice to odata"); cudaFree(odataDevice); checkCUDAError("failed to free odataDevice"); } + // odata will be left untouched if there are no nonzero elements. cudaFree(nonzeroMaskPrefixSumDevice); checkCUDAError("failed to free nonzeroMaskPrefixSumDevice"); diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 61c0b33..9544f9e 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -144,8 +144,12 @@ namespace StreamCompaction { checkCUDAError("failed to malloc oblockSumDevice"); cudaMemcpy(idataDevice, idata, n * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("failed to mempcy idata to idataDevice"); - // No need to synchronize here: the CPU blocks until the transfer is complete. + // No need to synchronize CPU-GPU here: the CPU blocks until the transfer is complete. + // "The function will return once the pageable buffer has been copied to the staging + // memory for DMA transfer to device memory ...", according to + // https://docs.nvidia.com/cuda/cuda-runtime-api/api-sync-behavior.html#api-sync-behavior__memcpy-sync. // Per-block exclusive scan of the original input. iblockSumDevice will store the // final prefix sums computed by each block. @@ -162,6 +166,7 @@ namespace StreamCompaction { cudaDeviceSynchronize(); cudaMemcpy(odata, odataDevice, n * sizeof(int), cudaMemcpyDeviceToHost); + checkCUDAError("failed to mempcy odataDevice to odata"); cudaFree(oblockSumDevice); checkCUDAError("failed to free oblockSumDevice"); From 4c037572b3dcf6676a79f111c17c070ff2a3eea9 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Tue, 17 Sep 2024 19:35:58 -0400 Subject: [PATCH 27/33] Add profileScan --- src/main.cpp | 46 ++++++++++++++++++++++++++-------- stream_compaction/efficient.cu | 4 ++- stream_compaction/naive.cu | 4 ++- 3 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 41f1c17..1b8f600 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,9 +14,12 @@ #include "testing_helpers.hpp" #define MAX_SIZE 1 << 18 +// Must be 4 so that NPOT >= 1. +#define MIN_SIZE 4 +#define MAX_ELEMENT_VALUE 50 void scanTests(const int SIZE, const int NPOT, int *a, int *b, int *c, int *d) { - genArray(SIZE - 1, a, 50); // Leave a 0 at the end to test that edge case + genArray(SIZE - 1, a, MAX_ELEMENT_VALUE); // Leave a 0 at the end to test that edge case a[SIZE - 1] = 0; printArray(SIZE, a, true); @@ -91,7 +94,7 @@ void scanTests(const int SIZE, const int NPOT, int *a, int *b, int *c, int *d) { } void compactionTests(const int SIZE, const int NPOT, int *a, int *b, int *c, int *d) { - genArray(SIZE - 1, a, 4); // Leave a 0 at the end to test that edge case + genArray(SIZE - 1, a, MAX_ELEMENT_VALUE); // Leave a 0 at the end to test that edge case a[SIZE - 1] = 0; printArray(SIZE, a, true); @@ -132,16 +135,36 @@ void compactionTests(const int SIZE, const int NPOT, int *a, int *b, int *c, int if (!printCmpLenResult(count, expectedNPOT, b, c)) printArray(count, c, true); } +void profileScan(const int SIZE, bool testCorrectness = false) { + int *input = new int[SIZE]; + int *output = new int[SIZE]; + int *reference; + genArray(SIZE - 1, input, MAX_ELEMENT_VALUE); + input[SIZE - 1] = 0; + + if (testCorrectness) { + reference = new int[SIZE]; + StreamCompaction::CPU::scan(SIZE, reference, input, /*simulateGPUScan=*/false); + } + + StreamCompaction::Naive::scan(SIZE, output, input); + + if (testCorrectness) { + printCmpResult(SIZE, reference, output); + free(reference); + } + + free(output); + free(input); +} + int main(int argc, char* argv[]) { printf("\n"); printf("****************\n"); printf("** SCAN TESTS **\n"); printf("****************\n"); - - // TODO: crashes for SIZE 1 and 2. - for (int SIZE = 4; SIZE <= MAX_SIZE; SIZE <<= 1) { - // TODO: work-efficient scan fails for size < 256. - // TODO: fails for 1 << 1. + + for (int SIZE = MIN_SIZE; SIZE <= MAX_SIZE; SIZE <<= 1) { // Non-power-of-two. const int NPOT = SIZE - 3; @@ -168,9 +191,7 @@ int main(int argc, char* argv[]) { printf("** STREAM COMPACTION TESTS **\n"); printf("*****************************\n"); - // TODO: crashes for SIZE 1 and 2. - for (int SIZE = 4; SIZE <= MAX_SIZE; SIZE <<= 1) { - // TODO: fails for 1 << 1. + for (int SIZE = MIN_SIZE; SIZE <= MAX_SIZE; SIZE <<= 1) { // Non-power-of-two. const int NPOT = SIZE - 3; @@ -192,6 +213,9 @@ int main(int argc, char* argv[]) { delete[] a; } - // Stop Win32 console from closing on exit. + int SIZE = 1 << 18; + profileScan(SIZE, /*testCorrectness=*/true); + + // Stop Win32 console from closing on exit. system("pause"); } diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 401e199..025c4d1 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -3,6 +3,8 @@ #include "common.h" #include "efficient.h" +#define BLOCK_SIZE 256 + namespace StreamCompaction { namespace Efficient { using StreamCompaction::Common::PerformanceTimer; @@ -107,7 +109,7 @@ namespace StreamCompaction { int nNextPow2 = 1 << (::ilog2ceil(n)); // Kernel configuration for the block-level scan and block sum computation. - const int blockSize = 256; + const int blockSize = BLOCK_SIZE; dim3 blockCount = (nNextPow2 + blockSize - 1) / blockSize; // No double buffering, so just one block-sized shared memory chunk is needed. const int blockSharedMemSize = blockSize * sizeof(int); diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 9544f9e..3b6aa7e 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -3,6 +3,8 @@ #include "common.h" #include "naive.h" +#define BLOCK_SIZE 1 << 10 + namespace StreamCompaction { namespace Naive { using StreamCompaction::Common::PerformanceTimer; @@ -116,7 +118,7 @@ namespace StreamCompaction { timer().startGpuTimer(); // Kernel configuration for the block-level scan and block sum computation. - const int blockSize = 256; + const int blockSize = BLOCK_SIZE; dim3 blockCount = (n + blockSize - 1) / blockSize; // For double buffering, shared memory must be able to host 2 block-sized buffers. const int blockSharedMemSize = 2 * blockSize * sizeof(int); From f2908de6083d0ee397344fbdd84c273b5fde0a89 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Tue, 17 Sep 2024 21:17:41 -0400 Subject: [PATCH 28/33] Choose 128 block size for naive, following Nsight Compute reports --- stream_compaction/naive.cu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 3b6aa7e..8b6e134 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -3,7 +3,7 @@ #include "common.h" #include "naive.h" -#define BLOCK_SIZE 1 << 10 +#define BLOCK_SIZE 1 << 7 namespace StreamCompaction { namespace Naive { From 7c87180e16ccb13f1413c1f00dac184c2c5c8ce7 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Tue, 17 Sep 2024 23:17:17 -0400 Subject: [PATCH 29/33] Process only genuine input elements, not zero pads --- stream_compaction/efficient.cu | 45 +++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 025c4d1..d80e466 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -30,8 +30,6 @@ namespace StreamCompaction { // Block-level scan is done in shared memory. extern __shared__ int blockSharedMem[]; - int lastThreadIdxInBlock = (n < blockDim.x ? n : blockDim.x) - 1; - int globalThreadIdx = blockIdx.x*blockDim.x + threadIdx.x; if (globalThreadIdx >= n) { // Threads that don't correspond to actual elements in the input array pad the @@ -46,9 +44,13 @@ namespace StreamCompaction { // Up-sweep begins. - for (int d = 0; d < ilog2ceil(n); ++d) { - if ((threadIdx.x + 1) % (1 << (d+1)) == 0) { - int leftChildValue = blockSharedMem[threadIdx.x - (1 << d)]; + for (int d = 0; d < ilog2ceil(blockDim.x); ++d) { + int delta = 1 << (d + 1); + // The condition detects parent nodes in the binary tree of the scan, which + // are the only ones that need to be updated. The second condition ensures that + // the left child is within the block's bounds. + if ((threadIdx.x + 1) % delta == 0) { + int leftChildValue = blockSharedMem[threadIdx.x - (delta / 2)]; int rightChildValue = blockSharedMem[threadIdx.x]; blockSharedMem[threadIdx.x] = leftChildValue + rightChildValue; } @@ -58,15 +60,17 @@ namespace StreamCompaction { // Down-sweep begins. - if (threadIdx.x == lastThreadIdxInBlock) { + if (threadIdx.x == blockDim.x - 1) { blockSharedMem[threadIdx.x] = 0; } __syncthreads(); - for (int d = ilog2ceil(n) - 1; d >= 0; --d) { - if ((threadIdx.x + 1) % (1 << (d+1)) == 0) { - int leftChildIdx = threadIdx.x - (1 << d); + for (int d = ilog2ceil(blockDim.x) - 1; d >= 0; --d) { + int delta = 1 << (d + 1); + // The condition detects right child nodes in the binary tree of the scan. + if ((threadIdx.x + 1) % delta == 0) { + int leftChildIdx = threadIdx.x - (delta / 2); int parentIdx = threadIdx.x; int rightChildIdx = parentIdx; int oldLeftChildValue = blockSharedMem[leftChildIdx]; @@ -76,13 +80,15 @@ namespace StreamCompaction { __syncthreads(); } - odata[globalThreadIdx] = blockSharedMem[threadIdx.x]; + if (globalThreadIdx < n) { + odata[globalThreadIdx] = blockSharedMem[threadIdx.x]; + } // blockSumDevice will store the final prefix sums computed by all blocks to // later combine all blocks' results. - if (blockSumDevice != nullptr && threadIdx.x == lastThreadIdxInBlock) { + if (blockSumDevice != nullptr && threadIdx.x == blockDim.x - 1) { // An exclusive scan doesn't include the last element, so we need to add it. - blockSumDevice[blockIdx.x] = blockSharedMem[lastThreadIdxInBlock] + idata[globalThreadIdx]; + blockSumDevice[blockIdx.x] = blockSharedMem[threadIdx.x] + idata[globalThreadIdx]; } } @@ -101,9 +107,8 @@ namespace StreamCompaction { // Round up the input size to the next power of 2 to handle non-power-of-2 inputs // and inputs smaller than the block size. Arrays will be padded with 0s to fill // the extra space. Since the algorithm arranges its computations in a balanced - // binary tree, it's easier to have it perform extra work with the extra 0s while - // following a general algorithm, than to have it handle the edge cases introduced - // by incompatible input sizes. + // binary tree, it needs enough input elements; care must be taken not to needlessly + // process 0-padding elements. // // Padding with 0s is done in the kernel. int nNextPow2 = 1 << (::ilog2ceil(n)); @@ -114,19 +119,19 @@ namespace StreamCompaction { // No double buffering, so just one block-sized shared memory chunk is needed. const int blockSharedMemSize = blockSize * sizeof(int); - // TODO: block count should be just enough for n, not nNextPow2. // Kernel configuration for the block sum scan (all blocks' final prefix sums). const int blockSumBlockSize = blockCount.x; dim3 blockSumBlockCount = (blockCount.x + blockSumBlockSize - 1) / blockSumBlockSize; + blockSumBlockCount = 1; // No double buffering, so just one block-sized shared memory chunk is needed. const int blockSumSharedMemSize = blockSumBlockSize * sizeof(int); int *idataDevice = nullptr; - cudaMalloc(&idataDevice, nNextPow2 * sizeof(int)); + cudaMalloc(&idataDevice, n * sizeof(int)); checkCUDAError("failed to malloc idataDevice"); int *odataDevice = nullptr; - cudaMalloc(&odataDevice, nNextPow2 * sizeof(int)); + cudaMalloc(&odataDevice, n * sizeof(int)); checkCUDAError("failed to malloc odataDevice"); int *iblockSumDevice = nullptr; @@ -148,7 +153,7 @@ namespace StreamCompaction { // Per-block exclusive scan of the original input. iblockSumDevice will store the // final prefix sums computed by each block. - exclusiveScanKernel<<>>(nNextPow2, odataDevice, idataDevice, iblockSumDevice); + exclusiveScanKernel<<>>(n, odataDevice, idataDevice, iblockSumDevice); cudaDeviceSynchronize(); // Exclusive scan of the final prefix sums computed by each block. oblockSumDevice @@ -157,7 +162,7 @@ namespace StreamCompaction { cudaDeviceSynchronize(); // Add the block increments to the original scan results to obtain final results. - addBlockIncrementsKernel<<>>(nNextPow2, odataDevice, oblockSumDevice); + addBlockIncrementsKernel<<>>(n, odataDevice, oblockSumDevice); cudaDeviceSynchronize(); cudaMemcpy(odata, odataDevice, n * sizeof(int), cudaMemcpyDeviceToHost); From 13d1bc77fa3a21ce5c76f9231b42f5e9fc4be00f Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Tue, 17 Sep 2024 23:17:36 -0400 Subject: [PATCH 30/33] Add all versions to profileScan --- src/main.cpp | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 1b8f600..4b0e7b4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,8 @@ #include #include "testing_helpers.hpp" -#define MAX_SIZE 1 << 18 +// Failures occur for larger sizes. +#define MAX_SIZE 1 << 16 // Must be 4 so that NPOT >= 1. #define MIN_SIZE 4 #define MAX_ELEMENT_VALUE 50 @@ -135,7 +136,12 @@ void compactionTests(const int SIZE, const int NPOT, int *a, int *b, int *c, int if (!printCmpLenResult(count, expectedNPOT, b, c)) printArray(count, c, true); } -void profileScan(const int SIZE, bool testCorrectness = false) { +typedef enum { + NAIVE, + EFFICIENT, + THRUST +} ScanType; +void profileScan(const int SIZE, ScanType scanType, bool testCorrectness = false) { int *input = new int[SIZE]; int *output = new int[SIZE]; int *reference; @@ -147,7 +153,17 @@ void profileScan(const int SIZE, bool testCorrectness = false) { StreamCompaction::CPU::scan(SIZE, reference, input, /*simulateGPUScan=*/false); } - StreamCompaction::Naive::scan(SIZE, output, input); + switch (scanType) { + case NAIVE: + StreamCompaction::Naive::scan(SIZE, output, input); + break; + case EFFICIENT: + StreamCompaction::Efficient::scan(SIZE, output, input); + break; + case THRUST: + StreamCompaction::Thrust::scan(SIZE, output, input); + break; + } if (testCorrectness) { printCmpResult(SIZE, reference, output); @@ -213,8 +229,8 @@ int main(int argc, char* argv[]) { delete[] a; } - int SIZE = 1 << 18; - profileScan(SIZE, /*testCorrectness=*/true); + int SIZE = 1 << 16; + profileScan(SIZE, EFFICIENT, /*testCorrectness=*/true); // Stop Win32 console from closing on exit. system("pause"); From 2d8e54fdf5160cc71fbc40233dc6cdc4a0ec7246 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Tue, 17 Sep 2024 23:42:25 -0400 Subject: [PATCH 31/33] Add README --- README.md | 131 +++++++++++++++++++++++++- img/efficient_improvement.png | Bin 0 -> 157377 bytes img/naive_block_size_choice_chart.png | Bin 0 -> 20166 bytes img/naive_block_size_choice_table.png | Bin 0 -> 15232 bytes 4 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 img/efficient_improvement.png create mode 100644 img/naive_block_size_choice_chart.png create mode 100644 img/naive_block_size_choice_table.png diff --git a/README.md b/README.md index 0e38ddb..f801ce5 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,133 @@ CUDA Stream Compaction **University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 2** -* (TODO) YOUR NAME HERE - * (TODO) [LinkedIn](), [personal website](), [twitter](), etc. -* Tested on: (TODO) Windows 22, i7-2222 @ 2.22GHz 22GB, GTX 222 222MB (Moore 2222 Lab) - -### (TODO: Your README) +* CARLOS LOPEZ GARCES + * [LinkedIn](https://www.linkedin.com/in/clopezgarces/) + * [Personal website](https://carlos-lopez-garces.github.io/) +* Tested on: Windows 11, 13th Gen Intel(R) Core(TM) i9-13900HX @ 2.20 GHz, RAM 32GB, NVIDIA GeForce RTX 4060, personal laptop. Include analysis, etc. (Remember, this is public, so don't put anything here that you don't want to share with the world.) +- Determine best block size for each implementation. +- Evaluate Efficient, then deal with blocks and depth levels that operate only on padding, and compare. +- Memory bank conflicts. +- Don't process extra padding in addBlockINcrementsKernel. +- In the current code, you store the block sum in blockSumDevice[blockIdx.x] = blockSharedMem[lastThreadIdxInBlock] + idata[globalThreadIdx];. However, globalThreadIdx may be out of bounds for threads in padded sections. You should check whether globalThreadIdx < n before accessing idata. +- Check for coalesced access. +- Check that shared memory size is not exceeded. + +### Description + +This project implements several versions of the ***exclusive parallel prefix sum*** algorithm (aka parallel scan): + +- `StreamCompaction::Naive::scan` + +- `StreamCompaction::Efficient::scan` + +- `StreamCompaction::Thrust::scan` + +Using the work-efficient scan version, this project also implements ***stream compaction*** for efficiently removing 0s from an array of integers. StreamCompaction::Efficient::compact + +To test them for correctness, their outputs have been compared to CPU versions of these algorithms, which are more straighforward and thus more likely to be correct. + +### Improving the efficient scan + +When I originally wrote the efficient scan with 0-padding to deal with non-power-of-two input sizes, I was aware that there would be entire blocks of 0-padding elements. In my original implementation, my algorithm would perform all the steps of the up-sweep and down-sweep for these 0-padding elements; since these elements are all 0s, operating on them as if they were genuine input elements did not influence the result. Still, the blocks of 0-padding elements and threads assigned to them are scheduled and thus take up compute time and resources. + +In my final version, I deal with these threads more carefully so that they + +To determine the gains in efficiency of the improved version, I ran Nsight Compute for a single call of the original version and a single call of the improved version for a large input size (2^16). In the report, `Duration` reports the `gpu__time_duration_measured_user` metric in microseconds and represents total time spent in this invocation of the kernel across the GPU. The improved version decreased duration signifcantly for the first `exclusiveScanKernel` invocation (although it increased it a little for the `addBlockIncrementsKernel` kernel). + +![](img/efficient_improvement.png) + +### Determining block size for naive scan + +To try to determine the best block size for the naive implementation of the scan, I ran Nsight Compute on a single invocation of the scan, for each block size in {64, 128, 256, 512, 1024} and input size in {128, 256, 500, 512, 1024, 2^16} (I included 500 to see if a non-power-of-two input size made any difference). From the reports, among all of the available metrics, I chose the `Duration` metric for the first invocation of `exclusiveScanKernel` (which is where the bulk of the work takes place; it's also the most complex kernel). `Duration` reports the `gpu__time_duration_measured_user` metric in microseconds and represents total time spent in this invocation of the kernel across the GPU. + +This table shows input sizes from left to right and block sizes from top to bottom. In blue is marked the case where the block size equals the input size (so that only one block is used). + +![](img/naive_block_size_choice_table.png) + +This chart shows multiple color bars per input size on the horizontal axis; each color represents a different block size. On the vertical axis, kernel duration is represented. + +![](img/naive_block_size_choice_chart.png) + +There is no clear winner, but we can choose one block size by elimination: a 1024 block size takes a noticeable longer time to process an input of equal size (1024); it is not a good sign when a kernel that can run for the entire input using only one block performs badly; a 512 block size takes significantly longer to process the largest input (2^16) than smaller block sizes; between block sizes 64 and 128, **I choose 128** because it yields slightly shorter duration than 64 across all input sizes (compare blue and red bars across input sizes). + +### Determining block size for efficient scan + +Following a similar procedure, I arrived at a block size of 256 for the work-efficient implementation. + +### Test program output + +All original tests pass when GPU scan and compact outputs are compared to reference outputs obtained using the CPU versions of the code. + +``` +**************** +** SCAN TESTS ** +**************** + [ 6 23 12 1 47 5 17 25 14 22 5 22 12 ... 41 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 0.0021ms (std::chrono Measured) + [ 0 6 29 41 42 89 94 111 136 150 172 177 199 ... 5758 5799 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 0.0022ms (std::chrono Measured) + [ 0 6 29 41 42 89 94 111 136 150 172 177 199 ... 5688 5694 ] + passed +==== naive scan, power-of-two ==== + elapsed time: 1.2056ms (CUDA Measured) + passed +==== naive scan, non-power-of-two ==== + elapsed time: 0.431104ms (CUDA Measured) + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 0.643136ms (CUDA Measured) + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 0.389312ms (CUDA Measured) + passed +==== thrust scan, power-of-two ==== + elapsed time: 1.09962ms (CUDA Measured) + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 0.311904ms (CUDA Measured) + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 2 3 0 1 1 3 1 1 2 0 3 0 2 ... 3 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 0.0007ms (std::chrono Measured) + [ 2 3 1 1 3 1 1 2 3 2 1 1 2 ... 2 3 ] + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 0.0007ms (std::chrono Measured) + [ 2 3 1 1 3 1 1 2 3 2 1 1 2 ... 3 2 ] + passed +==== cpu compact with scan ==== + elapsed time: 0.0018ms (std::chrono Measured) + [ 2 3 1 1 3 1 1 2 3 2 1 1 2 ... 2 3 ] + passed +==== work-efficient compact, power-of-two ==== + elapsed time: 0.714784ms (CUDA Measured) + passed +==== work-efficient compact, non-power-of-two ==== + elapsed time: 0.467104ms (CUDA Measured) + passed +``` + +### Extra tests + +I modified `main.cpp` to run the original set of tests for a range of input sizes (power of 2 and non-power-of-2): from `MIN_SIZE = 4` (so that NPOT>=1) to `MAX_SIZE = 1 << 16`. + +All tests pass in that range of sizes. + +``` +for (int SIZE = MIN_SIZE; SIZE <= MAX_SIZE; SIZE <<= 1) { ... scanTests(SIZE, NPOT, a, b, c, d); } + +for (int SIZE = MIN_SIZE; SIZE <= MAX_SIZE; SIZE <<= 1) { ... compactionTests(SIZE, NPOT, a, b, c, d); } +``` + +Unfortunately, for larger sizes, I get errors like `failed to mempcy odataDevice to odata: invalid configuration argument` from the naive implementation. I couldn't determine the cause. \ No newline at end of file diff --git a/img/efficient_improvement.png b/img/efficient_improvement.png new file mode 100644 index 0000000000000000000000000000000000000000..8930b79d135f2ac3d7b7b85fcd8bbdd62a2af9ad GIT binary patch literal 157377 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 literal 0 HcmV?d00001 diff --git a/img/naive_block_size_choice_chart.png b/img/naive_block_size_choice_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..d0a1db9b9c26d3344b51e83465919f71cc622b0c GIT binary patch literal 20166 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 literal 0 HcmV?d00001 diff --git a/img/naive_block_size_choice_table.png b/img/naive_block_size_choice_table.png new file mode 100644 index 0000000000000000000000000000000000000000..edc22ed044632715500526e06476519d4391ac64 GIT binary patch literal 15232 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 Xs2x$YdP;EopZe64v=nRPEyMl?Daw^u literal 0 HcmV?d00001 From 834cfbafc00252daa20b7b72f101ab604d2ebb08 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Wed, 18 Sep 2024 02:16:21 -0400 Subject: [PATCH 32/33] Update README; add scanPerformance --- README.md | 50 ++++++++++++++++++++++-------------- img/perf_bars.png | Bin 0 -> 19486 bytes img/perf_bars_npot.png | Bin 0 -> 20692 bytes img/perf_lines.png | Bin 0 -> 59107 bytes img/perf_lines_inset.png | Bin 0 -> 26032 bytes src/main.cpp | 53 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 84 insertions(+), 19 deletions(-) create mode 100644 img/perf_bars.png create mode 100644 img/perf_bars_npot.png create mode 100644 img/perf_lines.png create mode 100644 img/perf_lines_inset.png diff --git a/README.md b/README.md index f801ce5..4a432e6 100644 --- a/README.md +++ b/README.md @@ -7,37 +7,30 @@ CUDA Stream Compaction * [LinkedIn](https://www.linkedin.com/in/clopezgarces/) * [Personal website](https://carlos-lopez-garces.github.io/) * Tested on: Windows 11, 13th Gen Intel(R) Core(TM) i9-13900HX @ 2.20 GHz, RAM 32GB, NVIDIA GeForce RTX 4060, personal laptop. + +### Description -Include analysis, etc. (Remember, this is public, so don't put -anything here that you don't want to share with the world.) +This project implements several versions of the ***exclusive parallel prefix sum*** algorithm (aka parallel scan): -- Determine best block size for each implementation. -- Evaluate Efficient, then deal with blocks and depth levels that operate only on padding, and compare. -- Memory bank conflicts. -- Don't process extra padding in addBlockINcrementsKernel. -- In the current code, you store the block sum in blockSumDevice[blockIdx.x] = blockSharedMem[lastThreadIdxInBlock] + idata[globalThreadIdx];. However, globalThreadIdx may be out of bounds for threads in padded sections. You should check whether globalThreadIdx < n before accessing idata. -- Check for coalesced access. -- Check that shared memory size is not exceeded. +- `StreamCompaction::Naive::scan`, which first computes a per-block exclusive scan on input data, storing partial results in shared memory, then uses a second kernel to compute the exclusive scan of the block sums. Finally, it adds the block sums to the partial results from the previous step to produce the final scan result across all blocks. -### Description +- `StreamCompaction::Efficient::scan`, which performs a prefix sum computation using a balanced binary tree approach. It first runs an up-sweep phase to compute partial sums across the blocks of input data, followed by a down-sweep phase to propagate the exclusive scan results. For larger arrays, it combines the results from multiple blocks, performing a final addition of block-level results to complete the scan. -This project implements several versions of the ***exclusive parallel prefix sum*** algorithm (aka parallel scan): +- `StreamCompaction::Thrust::scan`, which simply calls `thrust::exclusive_scan` on the input. -- `StreamCompaction::Naive::scan` +Using the work-efficient scan version, this project also implements ***stream compaction*** for efficiently removing 0s from an array of integers. Implementation is `StreamCompaction::Efficient::compact`. -- `StreamCompaction::Efficient::scan` +To test them for correctness, their outputs have been compared to CPU versions of these algorithms, which are more straighforward and thus more likely to be correct. Implementations are called from `StreamCompaction::CPU::scan`. If `simulateGPUScan` is true, the algorithm mimics the GPU parallel algorithm of StreamCompaction::Naive::scan to some extent; differences lie around how the GPU version deals with arbitrary length inputs across more than 1 block. -- `StreamCompaction::Thrust::scan` +### Extra Credit 2: GPU Scan Using Shared Memory -Using the work-efficient scan version, this project also implements ***stream compaction*** for efficiently removing 0s from an array of integers. StreamCompaction::Efficient::compact +`Naive::scan` performs the scan at the block level on shared memory (not in global memory). The shared memory chunk is twice the size of the block's size, so that we can alternate reads and writes using double-buffering (the first half of the shared memory chunk is one buffer and the second half is the other). `Efficient::scan` also performs the scan in shared memory (double-buffering is not needed in this case because a thread doesn't overwrite elements that other threads might need concurrently). -To test them for correctness, their outputs have been compared to CPU versions of these algorithms, which are more straighforward and thus more likely to be correct. +I didn't deal with memory bank conflicts. ### Improving the efficient scan -When I originally wrote the efficient scan with 0-padding to deal with non-power-of-two input sizes, I was aware that there would be entire blocks of 0-padding elements. In my original implementation, my algorithm would perform all the steps of the up-sweep and down-sweep for these 0-padding elements; since these elements are all 0s, operating on them as if they were genuine input elements did not influence the result. Still, the blocks of 0-padding elements and threads assigned to them are scheduled and thus take up compute time and resources. - -In my final version, I deal with these threads more carefully so that they +When I originally wrote the efficient scan with 0-padding to deal with non-power-of-two input sizes, I was aware that there would be entire blocks of 0-padding elements. In my original implementation, my algorithm would perform all the steps of the up-sweep and down-sweep for these 0-padding elements; since these elements are all 0s, operating on them as if they were genuine input elements did not influence the result. Still, the blocks of 0-padding elements and threads assigned to them are scheduled and thus take up compute time and resources. In my final version, I deal with these threads more carefully so that they don't perform unnecessary global memory writes. To determine the gains in efficiency of the improved version, I ran Nsight Compute for a single call of the original version and a single call of the improved version for a large input size (2^16). In the report, `Duration` reports the `gpu__time_duration_measured_user` metric in microseconds and represents total time spent in this invocation of the kernel across the GPU. The improved version decreased duration signifcantly for the first `exclusiveScanKernel` invocation (although it increased it a little for the `addBlockIncrementsKernel` kernel). @@ -61,6 +54,25 @@ There is no clear winner, but we can choose one block size by elimination: a 102 Following a similar procedure, I arrived at a block size of 256 for the work-efficient implementation. +### Performance analysis for scan + +The following charts compare the execution times (in milliseconds) of all the scan implementations across a range of increasing power-of-2 input sizes. + +We observe that the GPU Efficient implementation consistently beats the execution time of the GPU Naive implementation; interestingly enough, though, for input size 1024, GPU Naive shows lower execution time. + +The CPU implementation shows shorter execution times for small input sizes but eventually takes off (at about input size 1024) and increases rapidly as input size grows. On the other hand, execution time of GPU implementations fluctuate somewhat, increasing and decreasing as the input size grows. + +![](img/perf_bars.png) + +The same information is shown in the following charts, where the lower one is a close-up of the upper one for small input sizes. In them, we can appreciate how the GPU Efficient implementation beats the GPU Naive one consistently, although the difference between them in execution time appears to remain constant (not growing, as one might hope). + +![](img/perf_lines.png) + +It's interesting to see how execution time changes when input size delta is small between a non-power-of-2 input and a power-of-2 input. Observe, for example, that there's a 0.2 ms difference between input size 32765 (NPOT) and 32768 (power of 2) for GPU Naive. + +![](img/perf_bars_npot.png) + + ### Test program output All original tests pass when GPU scan and compact outputs are compared to reference outputs obtained using the CPU versions of the code. diff --git a/img/perf_bars.png b/img/perf_bars.png new file mode 100644 index 0000000000000000000000000000000000000000..c93de3cbe8e665f8e28514c2224709a447a0f5b0 GIT binary patch literal 19486 zcmeHvWn7e9*Dr_yN{a&01|V%vA|VJO4T6NEC?ZG;BEwKOA|;`ev~)@{^Z-gINH;^n zP$MA23>{}*;2qENzUMvfmlGcjAN>99d#-Emz1IG(wO9Q26`-M}Kyilg3;_WFh2nj= z2LuEs^auzDUy>4o|1*ttDJ39KMk~t6XumdI9y?unz9~W4KJ?y4P2!t@GL3TbqxPrv zxmHl`$awtQE;j#=Q`CMZ9?-2heO4oYvYG!LAwBiXRi3M)S)V>-$!IoGh&EDqv;QKH zxf4aw=ZVBW7)0W8s&glDmzLaCH(#nHxl~u#>W;1Cpz2UYV|KJMa^O$RCWVWdhK5FS z{aXDc@aOoBkPiIk`zPdu{@{=KiI+ThYLkf%IuO^-M*_aeS2e=BzXR<*1;J)miW3XD~- zqmmj?eL0RHBjO_~ABW`@AumcR&|o6wRy_}^D|VK0n^NS1aPs5)h7}ry&ixOIDUqY@ zn`7q7Zn%YR7#;79RNwr?{JaWWO5lqY2Nl#M!HaDh7cmIY00V_G8(u5cTFI^FqV28) zg2qI7R+^2ST8-iy!-bE1erjJ<2(w2|CipvY4(lvHXALS}})_xWu1#227ueFXczM0PSmStDSA4&&xjQ|d-Y3D< z_PyK4#FX?{oJxi`axF4*xVA_=T~IUj`%$h8nMstr-gfVWmTW1c2xi1w{{9?W|-zBx_H z*sobjAKmtr{K6$c6C=0fGPBVN2kcAEZcMl~mvE?!4S8o)=a5av$>m2!qL$*YP z`__nU6>ayp5dqcR;Rx0Q-GbC`ZWE_*mqQ%KbFWiksou?j!5Jb92RS~J#LFi<-aq+N zjC^u!%x$&Syl$vy&7S*yr(Z$|d>i`!SpmD(i+7e=$E**<_>fT9MzHltZjNfb($HPp z8ikF|C%WZFbjo$IeZD)om!+A?SWDtVzQ&Q9DZTr%Bz@Cjc*WsaM?ClXOpx5*=#Fa4 zjr49u;o3cH+xriU66-&1Iu5t6dFBaPHNNs(YU_(Qxmt_KuLgsN5-dR4+wSH3R!o(; zxaHP#UiX`OZy)|jnVlqy7NcZRtew@are(#2JDq-Po*7cPLgsElWr?cXx!EXIk}K{p zvDyar4g93+P|+!?syWh6mv_Zcou~Cfxib#J&6$QgL{M-C?ePqRa%4ttZ|eHa&NNnj z-hETuq=r~eQR`fad0O`E#J&y>bfm75YleD~KreN6XUt87gR>t+?GoP&ygvXt8jVeP ze37D#@)y~Y{+x&DMA3_6vYDBfb%({J8w?(&;9FCEH#GJpeW+$7de)ThdI~mkOufuA ztbA}FF3Xs*ECd^NShPCGh_n5GGHZ_&#_E#x{CY7z7iSl>xYd+_xQ*q}N4PQXjodMg zkL(jJ_ZT$stX26MO}O+HZY4cA7`RfqIUe3-P3&ngob*X5h+?$czh|6glT`;?_kLG*1- zdp9)t3f?T3E7VX~F0cn?3uHKf)w*|ml5sTlWF`=&>{)wpM{{)_*Q>5Ms%tnS zk`b6v%ih+WwOcs+!n%W{!=nC1GR)J-^Qx-8`lDTue$jx$3GE5KWd(GcgsUSrMW0l& zg$}Mbu2?emQD;U3+7UHFPKlkazQtq90)s^%pBfzIxli01o&Nz-xsFfbL)CAT49^8U z$+3%im5p7*;YznFoP<}aJ$I&s>swC{g%!>GlG@u}$}MP(%Jmnv4Lq3EaP8Lk(Ack~ zJ~%(q(=T|*SzoIG|2l2PsW@dk$b|gN303z5hiUBMq7`exU75+8p47pj)J3JJWmXak zOI&fp+yIpeM~=|D!L7aZPPAZt#fzVMY}n~&lUTl8T3i)J!^g9|RsG&qs{TfRrPzy4 zFIr(eBjr*__c{ya;zm6B_C9bZD_MTpxV{mdQdiCm`5S8`{r0hq1qD)K`?(VqH&nJ& zEi-U@?%xpy`nw*?ah=(Sy5)b_dKk3zQf$$QB5Yu9APYJ}Yua#^O7hBt9|_0O4sNmc zIgvaU-{ATZ(Iw{$m`El~wj;jzv&VU14s0lGw7R#4b{x4cgA` z&6`h$i4jTdA|~+_JFy6FZlffUxF=aazWg~GM9jfBpL=ukmy>$0snf(4CVeneZ{(ap z%`NNL@1Tu}%zTkq?{X|~^#vXFa+re7mh@bctN!_^Q36Ihy$+lT-4k(9`9W=vhtThZ zP@A(J=h45278YiCa&p{#(`aoWH8iT@V~hY%3Z-5~lKYMC#nKn^Z8>v7cBUsiTRzG-M}^L_x9I#=*TQTAurXzZSD-QIxI@H_RL3;u)#GlW_swG zXH5CXkVy{@78=BkA)Hnx%0Gr!#T3Ik@>~nGEmgYK`+xR6WmZ5Voj2fL_Z< z^$0ei5Elv#?`lfNKp@_M58(Jvk|9;Q#3sh#wKW+T3XeT6QLU);XA5e?2_^x|S}$dc zx=gs=u*2P>tY7Zmf#J3*N-J=DyInYsrY0B;_=ey_lcdhr{5d>oq<>7m+u$euZ&A++ z=X1eaMnOcU-^wN#M_o=SDXDDI1N6-r*|+JeFO|7`og+I$AK@LaY*Erq0?BE&bX_~? zAKprvNK1XYd0pU|v}I4)16F4LumKP#xR#&4^om@^Z7DnRskm*6_B9Pw%ZkL1mOGPq zr(T`xNpT6C3OScHh0rowZ4oOpu&qqj-0#o6H|kBDKCg9~#aU>KAAiM}Me6}vV1DsbEChDZiKD(et zzge}}*z0)T9sC8Of5!mpV93nE>fn4yMy{*1i?!!ZzlE{**PrJf!mUFqoY>5pY}|yU zs9kI>eyguw9etlM&PH*6dLTJEGF@#_MY6$3z~x%jGvHJg<{pps9diMLV7~N!~rlbX)u?D-%}Tb4M!` zzM#>4pNWdOcRfojb&2HlR=iRWWyrw#)DC=9*u773F^0u*Q5+?{_}dD$&dMBcCBYw< z^kvoLEp9pXVbVEIYKh~&`G-pF+&AgFAGLoPHuhmMkDoYw3Dd;w;Vubq_6Yb3_vf&> zX){R}%FKK-BX~Izi5{EvgOE@|6MuT4XoOdQ5^NH1+ZkyfOyV5!%(}dkdowaxcz?NkB5L_$ z0pbJw^lR!X8Zj`K3fv4wI%?%>#U^jN zQE1{n@h~dydl0(eyHkO=!u+e$QqOA&f3YT=`0M23J%eNgR#&+L1qUYiDq5n>PhSqF zUVgrx^d1aMs6zm}kPA0^{keUMWX`1|4h-#qq_=9=!?a1FL$5vsqd?q+0Dpf5(^Fn0 z8l=R}+G9Bmqr(>uHMo=D*nl5yosyg14&8kBwk(DOky|M$Exq4)PZM3dbSdW)dEp5S znYZnA))$1Hhy4g@3)Cbn4hv~}7x@NCkNZ!|6Gn-9O{fi%JyeJlJz#r>ZYbUycT+dHvQl^GQK_=8 z>(FO0-57wCc1UH8@N>kMDC8WNcDb#dNxZgCg@3eHBzJvJLgLB1r;~4Z zfm`vL_w={jp(mk{=>>X4vLHfGKvJ!?#H1wO^%LPC>IG4)!7EPg*pND1LkC|5VJq#Y z%fZ8N%C6|_Y;HO}J@$zpA2_t+P*cT%wwIlfgIANtd8Z4->f zE@FDumuR0_(j)NfmoA;KBc$^{*KNW7M+p!awSY97E=N6KEHW9ZXn@~ajas7WN!LNDCB*P)&yWz;eA^K1OAm$Sne zuIqE(Cr>UG)E&SUYjX}5-WloY>ME(5?cO@~@ZL)a5XL&Ph*)UguqjD2C_-;u#Q7e3 zPK8d35<&cp=^p&H5ER@02rY>mvKv~pa+|RZ|9~*Ap|`-KBwbgoF8oXaY9z183OUsi z4WmNXi5A6DQ?u6OyNQIeYKTZEBi0#4gSQukV*z^0BS<{!K#J8ov2OkP`L49O)Ar28g7)n&v|Nqm?hwcU<8DaSnzsSF3|wb!q-|eiNi&#*|9( z@%A^SW7aM0xhc0(8$uL&U^EOluN+Y}<==0{hou`04fy!`lh&NlQ;y=}R&M#onKo0L z@CV_@{azCL+!}`UR8xs_J$?G=eyp(j9W!bYdrcJ=G#VH>I<79gQyzVT4pizDRN(xM zy>%zD``l1|MX3wOMS>pY>MRBY$zce`C`;PfmF^)Cfdj~|m z=3d#M?*k14|KL7vfBD;&c0#47SC0*-Kvn4%o#`S8>yOKlu(u~?(yZ5~vFtsG?i>1* z%ogXag)!S!OcA?2J8?~eX&aop={;@_Z#mFL@$$6K{RsPje(A+?nfIi~){lxS=_D@| zaaa(HI0@UWSK>BLAd;b|s{t)$c&XW332&@Ix&q=;qgIPYf{4MS0~}XO$R|=vU~7+n zH3n3}PL7}8lO(7oy8b?-L@-c%-G}ILL~Bsd!!sQNlf?`t$ek^w{An)F-XM2uk?1Hj z%_FCLHvwN)U91)Jd4ujQ70Wr$f4a@w6>;O*JyP#0Cy3+xg6=J%7eR(;HU7*br>5I` zwL*x#yd&@0-05gvHg}w6rDPFhe7`mhKV8g*pzpCq+=RKLeMmRDYWdp$qNKJSjrpE; zpY>*>PYpGC;NzG2#B{QOge_umX+?&-h8SN#oX6zpV4)YmV=+={X}-w0<2`b3p!0nh zxy0KO7D4v&iOc2p`l;MUWoZSc&1x&pa26qHtrw@Z=k3Ou{bcFjd(0Xd z?SGpoCf(@c$EDxu*sDsq^)f>u$eTbW0UaP!qQsJQeW1x{(+HO@vjqa+r{b&$UUf@9 z0>!(sPg^jg^r7YR=+QHLCy8%JSxZ+&{znI5WuT{gPgM6)(MF|7);?e9GOS zGh5b!{GF~gj80!#A?n62uZQjlI}!IfGoh&8HO@UCjvObk^v=vFVX2sf)38I;rzBzr z){pDBy&8d)Z|h!<;r#Xwj2O0lA*Acf`7#^~vgKsWPlRH$UKZk0^|>8=laHfeVQE?O z(o<8>noIinu&O^~T3;87H`^yOpS0SN_IPb-5s~Amqb~*4(Knou#vPofeiYb>?4Fh3 z?AV*^VJ80Lvh+%0-(WyV7->jRaN%d`n*9wFmWE}BE{n)GmkY<+?TA}`5_=ByicsWF zNBK}{MfuXDl#It-@RRRQ;NSnDSOWjhTH75bO+9sCAJpup%1w*3W#6t~S4 zv$-EJ=54AV7wz%MD*Zlivs2=-G}TgNuiEVZdJ}k&btR@V7zepQ^^o?0lJ@ynR=IRl zgsin^Z`voR+bb2R3lnvo!wJF1A$7R-(qU&YGid6oUo=*(?#Hj(6=2opGUFWs9bB~y zVLC8^NRi?C2D50RSMNQizH=o-5YFWmARo2P?7Y0Z-$<)|j*MQwI>Pwr(SxLA`{C?Y z@3@Ot4{2P1UxpyG*-JU4L5qzqPQ2B6xiHLhd^xFn5G!6wAd}7xJ$SV z%4Wt6T{0w*Hbk{Q=DLW$hTZeuPyZNo*#^|z%?fHath7b>cGr^*`9i?f^uV>9j1wYJ zuJZ{^id+d-jG=IW^>2(oN&#Rfa4HO;-T%;_pWom^5~QUr*7^8BJ=E8Z zpVwIg@r?YU${isVd;RI`%*3-V2J&b^C9wWOp!Ujy#-PdzwlF4#JSH=IgaS{paZvt) zq$gpE95+1L5`WY^O(eoIegRuCNE)vZ`aPU0$cIX5=p&bfzJk+T+t2m!LipiPFU#0iX&3Ek2IS+$iH(z)lxvJT&d+kNWM{ZYhAY!i$KW& z-aFbDrkHqvkogygGo810TBHvgEKLOjY~+c&j#d2jAZC5!AcMO~Vp;gaIH&ZmCTW? zIiLn`t}{XwyK#+?EbhTo{OSJBlFrs1sqIU+_XmR2u4Dh8uvsvLWuDOtq7wLRFJ@bnyZ+$U>$+Lxt?trhDJA?mDfn8ER>W1jn2n`=iS{B=O89!o!-#ioBUC%G6XjR*VQ8w@!NWO=WHgr zt#I3&2@voEv2jz~;ci_UddI@COgamDtv*Kv!uCTlNYCH+p?|OPLI3(^F@y7~Z*#4G zI-f7E8RA>X#E3phi+f5xvSUK~&#ZnE8}t2sB|slFY)AhI&3LyJADdF%gB z2ljX0SI3!fV0X1n@D<3ryHn)Jy3>{EuiK0WNh*H_)oHoijb;4P>z)VjqVJq>5vovc z7?C63CNj6R-Z?Ey2a_&;&Y+3iRjmK^BsNL>eQF zOP&P}nFaBeGE+dg=V9!Lyl{0XeP*XF8MEBah_k?7WNm@40M7@#TLispThcDVTRUFi zkUHelt9n_P>E!4LVZ_GX5Ya?HqhL_k+gmXOUl2 zs^KFq-x58PZT06w6|k6dytk^d?$8@Ky$8`nonED5`T{s&#OC8);`q!}2nTGdmpKI~ zE>*6oSNnKt8;O7$jX{j>dvMIDh(0b6b=2z-4)(P2y5=DSIa!0 zvYlfAsvDOA`^Bn2etjwB8Hg6a%>UQA`*~-C?3=$%`?q)s9G(Rngf(Czcl_RoX)$jt zEMf%#7|w&p?#!D>B?wFXPruEUO{c}_ey@vsN2qhk3|f5u(iS0a({<6j2v6P%;Mqoq znUHh-4_@JiH;DDl`$KW=LtYR7lS2%K93Aq)s|=9MXn$rf)w~9g9I_r=uTL?B0IpdE zhHQX%5Ghto1VMisX{SGsknYsi<57wD&VZ=;|H^<$MKHV-RPk|u9F^QZrRco zgKF_kJ&I;Sg^$euXm6sRjLkrSDJ4H&Ezh7_jZd%e&O0Vi zwG5YqE*Xh~t(hHz7bC67K5}E<6^md;$v zJaqf0!*I{=zcdwp*FHVt%Ad+C{xuyW7#PBGyLHg6X6@||0B$2_lM37mW&Mo4VhZgV z$UmZdi73VHfC9mTyhmk9)|Kce$F5ykb%~2Ud{##slzwqyJvs=xpt3JWQZ*wWJF2f| zVzMe+4+DgRrj_bdfi_G}deBD^o7lwkr@#TFxbJSj95b9NjzD0=0*D->X~YzaSJZAV z3pq5>D10l0iiu7uqxx-&9m5t${KVu8>{0v%oS^Y_8Mg5=+v2^{!PXP~P*oAjn$y;U zQ;bK-bS5w4%WCs(VRg&XD}DZ61=E)u{(2ujSQfuB`Gb~~j1Y=;(J`eqC>?SZ@jeFA z;ry?{M7KyLZ;kwfbT&&y^ap zrZbYmxj_O|_i?KeCQyeQw~W$_f7x*h7Ih~y_aSQ+!I$EZU~ z0A#XKr6o2fL<$I8r-5S*Z_8#T;!Cj}qW90CBI0udIr*O}rMuPgx0pfk;6!4Qs=e2z zet_J|{q;$<&+B+QF3qbD>gf~%vhM;1dj9YbpOo&qA*ByQ? z!avs=%3c5HmQz^P?d|*9{PF^Di}Y?j`w^z@px{+zJ0`vc(#{|)wOjI?N`CProDr9{XJAU)rDm{$5k!7#%=u!t7uX zYrpkNmU=Jv!{O|OnF3q@rfQussVpDSvUjT5nH{PzAb+UFj3LN+0QUSP{_ zfDb*3vyn40N=Q_>{;%(R3A=b#uE4mq@ry56Q*$sAzA5eczs|T*!5h+`^vvoG*uv=| zL2C39beBxZ%Isyd$pnMx`^1t5@GQWMi=jr%ny3L)gL1w>Hwu6?H`);rzD zac94nU66+JZ}ngwi%V^PA%K+mNrEU(qM(SjaxzztTJzTNJ9H`*Imn$Q-Xe6A!P56D zKPawt67Y7u_$eo_wL~UYX8qTZ9k{qPOGcE(0A+1%E0q?h%70jWk@k|pp)dL1@QxKG!@$1K~nN$U;_ew z=mKA7jvx#XM4;mU&;j#g1gclGMo!qUEB#lac{zh>en5~QQjZU?5KZKW5ftABWtz05 zG~fRv0siAj6jrsR<EcYj7%^|mze_@CFCodSXfT&KEk1CV@}&=Cc{L<6u30hm3Kd{n3kv|10*row>z@boqtfRWtDF`uWvIqw zSiJv$ZBLSx{>Gt-BA&&3GUJi9&(T*eRwu~t)JfCN`HZX%V|6Rbucp^3vxn~ zJ;>0DJoaH1^d3*{p5}`GWZ^sq(r!8;Vsh%XD1KV^9UP6M+eTl>eZ}qHX$0%{1ggJg zfWnow7LydAe*y>WU)^3?o&R}Worv_uNRT|3TMA6&X#@L%gTbu3v$eSR6@1d*`#X5r zK_eFVy`lHI`sRjdg_gZ-Evv$U! zCOU)Xw-~RW@9tBIFR&N&>lg$8+Ko1R8y%f)E;TH|ZbEWiYulB~h{QO>T7w(aaDZb>}4w{>BGE1n}B( zD z(4y|FevsmA^g!yQ?(Rx;0kh~p*$drU_ob=++IQK(i%#3}n*U*IZX{#_a&SRoltI;g zoqYe7|9WCZg*)w~fO%R3*q9~3ysc=WAouV^yO!2^_;49cnQUeQNeZjF-u{YU1)mwbZZh5cS02^ z1L6Hi_8gI8oPKzbRs#Cc4hP%wL7=RP3A#Td3UD3Sh4#s&bUkC_p{d>a>RUB`tcU$< zung<=?|CbU^$M-}d5Z7@2AJ_$V!48?^l-e2>vEJ4UCvf6-2!6q{A$OKC3~ zy{fcAIIz&2icWab_wmTNoi>vC_}9|>YEUWJ(zBmQoj)!8Et~sjBuwQi@Y}e&|7wyf zA~f$RlfYk|PJZ~ve*U8nJ9i;h&>Fq?mMrP`X;78*{x2WCv5qHY(lWqtAA=CER{{La zSN|+l)@Ph+31u^hx<_ICKb7Bg;Nq&Xmb`g23taL`b03}ind4)yfKUgDD@r=045CC_ zu}`}ZHmG7DE7Kzw$VO9Th|h8#BlqGe;`tJlYg-AWt4S;m4{CWbS2A`aMg1=~1H$y$ zM*i~AOG%z(!08r&F7$Q#$vZ`zQo9TKibLR#zU`3s@4E>Ufz9)=WSVW?`1xKP0bG|` zDgQ)d7opk$)(9LzfGn#V|7ye%t1_^O+>~7NVcWYC@6dc<8Z<-tOFjVHyS|#1Xd}^L z!JezyOUa5@4s$UO!u!>r^+|d~zQrvMUrw?v_bJ$TZh++dYpE&L)=V0S31XdpAw|}X z1XV)kS}w2U`RjWr%ki2%e^{DKk)({N(TR6j=h@Z;C;0D`J@$IY4vbr#OXM%`_$+>k zE$>1#Y~;z0+jRG_!Ef03NnlJzh+T8j#4DbMwopAM<@@!IF@SVX1K!YM8=Z33j}lxE zpu4dQD8zJZ9$U##;q?f@%7sSGs%FO26kOX(b>M6 z)y9WR%hSFIL5UnOJ60Y3??7Bes)^^>}x`Bj6^T)r2VV*G`zQj6i)lotROY= zJ3g3~20q8Zho1NSh`HGmz?GSv0s+ z@X`##c=S-Wv_{*%4kSEupyb*2&rJa^9*Qz)M-f1>!dFP@tlJ7Q_PgSJs)Lrh;;}}j z|571f?4)KQp0F-L&ips55zfDy4JvH5<%ftN7~5=*Qh5wVnW*k2-y(6LM`Qx>B9>S!;6gB9diVV;+cScMQ826OWeH&r zn;%2zBD4uqU~+CJ7VEZokLQyhP&M$N+3?A=`In{7MXX|4T(n*XI6<9^M8>}ihZ`3GK#;JkqgX_vYmUPNy@%SIV}~mEY|zjorumDNgb)V z0YRBhd6g3wo`KZnT_O_{2tLAGSY+8o|0Y&<%AQb$Gm{vk}=d(a8s5q(NuYNx3Cvi#otI(`2C&;l#zJC z{u_gVr0xF?_WzvD4$xG89iiW=DU+#IlH2@_eLs2OnJa(e_BZynqdoV$-umzy@VE|M z#5G9%hLB78(uq9KxHI_)>R-@lnW7vmUE;hL$J9w-kj^k#-G43}gk$}6=-m;T87H;8GxaGpe05+5P+ z*a{vv6Vi1^^!N9F9|Uz3;2^HgRD{g;?S_E7PR)=~* z60sPN9i_`Ng((GzutRB=Y;-8_OVGco;(#-v{V35{tZD+TFLIDmD$&-W{YL!FI8}06 zOCw~|!2P}9V*~xC9D#bP-i%IyEm=Cqo9l#aFpg7wq#RK(b zYUs+R!(5C-pvmFR;54S7Zh+oR^yQq2!?1bu_uEQ$BdDy&rci`$Y{{%iC}hihyOs%t z=)RN_831rT|MBrUHl$@@f5l}d#So6`R!9LwSTk^UX*!TMpBmzh>4DoIiS4;{hx@C= zlz`Zh`5N5(o2A9CrU*CRW!WRwgYn37aIbOMI?+yvP7^l7wHw@g7%fVcf{n!b)21pNB~cPZaeu?g5B zx1Vjp0Ii|;ru5E2su_N1^*}vNeal(s^{>eui4C7N&t%iw|8k93IOy08`(rQ|eEDmKK23%1y=!CD zE`sS44A<^3175;=Ll02TD(udlCljdnWGy9FHb7?#Uz5M?w(+wE{tf6EtYCmrMHbQpL-46&<7Od4a^xVf|OXBu6%IhLM z>G>aB0g>z++}>iezFh+Khb6ULqRrIyd{Xp`p|LAE^1-9TWdao&&G~Bnj~jOrm+OVX z#5-RR43#rHx#^0X1wY#~Xd^pZZu>K-Bw83;a~DJp)2U3fyCQt%03F8EBEdOop)1*E zFTEI4xwe(fL8k;JQUJp(T!dIp+l+OSuZGR(0a@k*zwY`JoApdz0p(%Fb8x4F9=f5t zhxadb0fq5x-?>(ZA5FCcYE=mm{WYMc98mURaA|m!kP1Dmj0S04KfS2(2#{h#c7)w{ z!bawluIDal0w-TtO2m=Re{b8GOmX*O=qmz6qHOnaqWU{a%LtSjbiaA}3z=Yq1)m1p zY&YG9)==y)We;)qd^cSWG8$g)o3=V9F(LzQ9`jri5->C|1{|gMmV&4nDCZNgf_ESM z@{^8WY4?MAeelEG2~pOeuI~;Bo`AOX;qdZV6ET6uKkLD^7{^NQ{rVb=uP?aF3^($8 zFZ++RCPV#_R^Eb$g6l|gpf9sVf0}fg$!eCXiZ+^S!*m}u?y@cud?0?XYfI7vy6?p{ z_U*!h-%L+f2-Le6+~+k}``0y>u0ESs{!|J2zdU=eW=m|R^r4~2EV)O*7+~mO2Oo@j zQ{aC&xU-o&fcPNrVDE5nMx4F9TpC`J$R;`Vj-bAUp8MS6$&7Y(<0P9YkavggvYCtw zkyOlj6R{u~zXDcrPaFBC)&(3StWH~4DOy|t=|^E zUYqWD!6r*J%J+qR95CPR8b9-=9BL9=0ECBIAKE@Ie1f463nl#L9!uZ(=G|8@>r2Fa z!l?c=o1uW@;of=^R7^#`>O{bkmf8DEv0b7ua&6`NwgNoFdfKE%yk_SfZ+&*9Ua)>$@r}Dl(_G971tU(tm#it&GVH`v%c-DK|lZ=q4 zi&ojc&eP}eQVTTYWm{+JqlhieUR${YtH<+qddFQPdC5gF+Z_E&$gAF?KK;U=db=8< zHXFKx9|^7r6jO@bbOOD$? zYc4%^Y)|b@)vR}fH#~Iul*?=Bvy=)ilQ-OH;9xsNqQ@+;&Zv^04R1 z?bVu+3UEzYX)!+ye`*4qNinwpHv36dN<+I02}|DsHgk2ABkq7|lqQ%w*r<4fYTbZ>Ck7V)Wcr{q*%`&!a@?qrRFv=!W4a2VH;0vAPrrkS>nEY+Mq z>zx&9Ai^&Ue8PP*vTh(%gDw8LCLH9CSa&G#MNVpU6TiIdf46J#a#&ywNuS?JXg+9L z zGhIp<)g!o=be3)D^rEJ#G>eh$8-#`p(TFM(8lkVOHuPD_f+t+1IL5DZa;3%DT7O$# zTrhM^}<@TrhB(MWW}$H4NdMYE`)7Fylw(ch^5bD@%IY)v${m- z&Uu5GecFR5kU%LS>H#DsHVx0fc;v_9X{YAwH~-NkJ26CnP!HG~rjw;wqVk2v4DY$* ztBWp%W;SB5tbHcupk?|yK6t}U1_!EEGxpgDI=Vom86rCl7Qnrxh-K(AIbx3ZTfJG$ zY()LKl~o72Z~u9a2qMV;Gao29^8^sQU}tGGG&V{w+YtO@a+S(?|HzRtJ|9Q zJg|V+%mFbsEm{G;M%oDJ=O5cVR(_V|p=7l8JH^o*Pi%OSKOl1H6F&qD?{m-G3?wmn^5recJunu$6wzT<3RsS^&QJ?9XN;$rojg<&Os#}l@^g9 z=RqU1$i8^hq4# zC~m4B;?&J8@&@wsFLyrW&Tuvz0rWWY9W1)7$ucv66VscjK(*E`IuS9>Bn)^--Jq1% z1MivFD}EXvwmlmzj~Vz3G3Oe4(v{7{Pn3cZvI^1zup-go&?h?P9XKi5E@rE}RzE!0 zm!I!QKuessZ2iQVonE-TFZ1rPX5cQB8AKaK|H05vv!Glok z31Z2;o(|x8NkU6BnVQ!(`nvToYcvy zgT`*3;rpnG109eX+)WI=AO(M&+V->+T$$tIRE^b+Ro`KTvYv{WklRlu{qE3O^iS3u zVCouy&%JCilgA|R;$SV*Gh!Xe72s@F`cI=N8HMh{0Vl|j6-BoWeX|8{;rUKkR#k|5 zTQV(z3kR10gQC7?uQ7lYovweWRiL(ohGyS~mAok-<_kt$YFiEo=(r&0%D2{!IFJel zjnts^PHB_G?goACcl{unC|7F3Z`MNJyGaXI<1wN{fz`@GiD+;sAjHa*L|a!cBZ~Pr z7GFYL!t|SRdI-pe4t7ect5}lj4(1y*J=8VgfXJ-3LdB;XnXmLKP9PvslLX3llFA}x zy0QN>&gQA(R|--8%tTm@kcqA?SNUlg^XTyzfB%Dv+zdU@pN*<@koTyQlg0vjCZdT6 zPd1-f1_4ld>B6pk_VTyOp%D$Gtt*r z6$6l~x^+8|H8%xv069!2)ayA4@ma6XRK`+j@#W;tupHW`soGW$3b6}vzgitP>Rn&O$a zICBQ7HzkVYqmDt$(P>%L!}i&^F013_t6z(sd!AE()2-@BP{9nbgL~KU< z!S{7qUEh&>)yo4Za&`n)w%QJ28PL+0twT$mTh&)9K1jeh^N`+Kt5l6eEjonwmSs26nX%ORf5q;vHMLvG2lDh#P0}`X(EE+Qv6~lMb|rFNw!T-U4M_ zbb`-oW7?IlASor8&qOmHe~F6|HeXI=%~FpRFlvN8S^%><*Fm}HLeuO{8Sj33t&tYZ zar>lOxAF(@^`Z}}O-4Rm?8NJ&SrKXCizqsmi!0?59@B0UyT;sigcWnbk!l>aafFCd zCqyo_c8mg?#a>)7HFl~v>E}JYRBW2=K}kQ?k-+OCC`=seUz|N=M|BCC@qs9u=JGv% zaBbruGJm$S+wiqe^Gv8T;19n~AKBl4xUJZubLRh%?^q2TlEj_$em-2C^B8>hi$GCc LO)g*7^pF1mTi9#p literal 0 HcmV?d00001 diff --git a/img/perf_bars_npot.png b/img/perf_bars_npot.png new file mode 100644 index 0000000000000000000000000000000000000000..0323886d3f1c4b646b1c2581d5894887fb4f1a07 GIT binary patch literal 20692 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 literal 0 HcmV?d00001 diff --git a/img/perf_lines.png b/img/perf_lines.png new file mode 100644 index 0000000000000000000000000000000000000000..50c0426c352be811079a522c0296025e51ee655b GIT binary patch literal 59107 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 z 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 literal 0 HcmV?d00001 diff --git a/img/perf_lines_inset.png b/img/perf_lines_inset.png new file mode 100644 index 0000000000000000000000000000000000000000..87cd91dec22349afdb628afc1bc0f3ec6b934b91 GIT binary patch literal 26032 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 literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp index 4b0e7b4..99f456c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -174,6 +174,38 @@ void profileScan(const int SIZE, ScanType scanType, bool testCorrectness = false free(input); } +void scanPerformance(const int SIZE) { + int *input = new int[SIZE]; + int *output = new int[SIZE]; + int *reference = new int[SIZE]; + genArray(SIZE - 1, input, MAX_ELEMENT_VALUE); + input[SIZE - 1] = 0; + + zeroArray(SIZE, output); + StreamCompaction::CPU::scan(SIZE, reference, input, /*simulateGPUScan=*/false); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "CPU::scan"); + + zeroArray(SIZE, output); + StreamCompaction::CPU::scan(SIZE, reference, input, /*simulateGPUScan=*/true); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "CPU::scan, simulated GPU scan"); + + zeroArray(SIZE, output); + StreamCompaction::Naive::scan(SIZE, output, input); + printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "Naive::scan"); + + zeroArray(SIZE, output); + StreamCompaction::Efficient::scan(SIZE, output, input); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "Efficient::scan"); + + zeroArray(SIZE, output); + StreamCompaction::Thrust::scan(SIZE, output, input); + printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "Thrust::scan"); + + free(reference); + free(output); + free(input); +} + int main(int argc, char* argv[]) { printf("\n"); printf("****************\n"); @@ -229,6 +261,27 @@ int main(int argc, char* argv[]) { delete[] a; } + printf("\n"); + printf("****************\n"); + printf("** PERF TESTS **\n"); + printf("****************\n"); + + for (int SIZE = MIN_SIZE; SIZE <= MAX_SIZE; SIZE <<= 1) { + const int NPOT = SIZE - 3; + + printf("\n"); + printf("***********************************************************************\n"); + printf("**SIZE = 2^%d = %d**\n", ilog2(SIZE), SIZE); + printf("***********************************************************************\n"); + scanPerformance(SIZE); + + printf("\n"); + printf("***********************************************************************\n"); + printf("**NPOT = 2^%d-3 = %d **\n", ilog2(SIZE), NPOT); + printf("***********************************************************************\n"); + scanPerformance(NPOT); + } + int SIZE = 1 << 16; profileScan(SIZE, EFFICIENT, /*testCorrectness=*/true); From b55d1547958d65091bd8c7697fd47a1302d49373 Mon Sep 17 00:00:00 2001 From: carlos-lopez-garces Date: Wed, 18 Sep 2024 20:39:21 -0400 Subject: [PATCH 33/33] Update README with Nsight Compute analysis --- README.md | 37 +++++++++++++++++++++++++-- img/efficient_compute_throughput.png | Bin 0 -> 42058 bytes img/efficient_memory.png | Bin 0 -> 40017 bytes img/efficient_occupancy.png | Bin 0 -> 41751 bytes img/naive_compute_throughput.png | Bin 0 -> 44985 bytes img/naive_memory.png | Bin 0 -> 40609 bytes img/naive_occuppancy.png | Bin 0 -> 45982 bytes img/thrust_kernels.png | Bin 0 -> 31304 bytes 8 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 img/efficient_compute_throughput.png create mode 100644 img/efficient_memory.png create mode 100644 img/efficient_occupancy.png create mode 100644 img/naive_compute_throughput.png create mode 100644 img/naive_memory.png create mode 100644 img/naive_occuppancy.png create mode 100644 img/thrust_kernels.png diff --git a/README.md b/README.md index 4a432e6..b3eed3c 100644 --- a/README.md +++ b/README.md @@ -58,13 +58,15 @@ Following a similar procedure, I arrived at a block size of 256 for the work-eff The following charts compare the execution times (in milliseconds) of all the scan implementations across a range of increasing power-of-2 input sizes. +![](img/perf_bars.png) + We observe that the GPU Efficient implementation consistently beats the execution time of the GPU Naive implementation; interestingly enough, though, for input size 1024, GPU Naive shows lower execution time. The CPU implementation shows shorter execution times for small input sizes but eventually takes off (at about input size 1024) and increases rapidly as input size grows. On the other hand, execution time of GPU implementations fluctuate somewhat, increasing and decreasing as the input size grows. -![](img/perf_bars.png) +One may speculate as to why the CPU version beats the GPU versions for small input size: the overhead of launching the different kernels combined with the many more instructions computed per iteration in the first scan kernel may offset the gains of parallelization. -The same information is shown in the following charts, where the lower one is a close-up of the upper one for small input sizes. In them, we can appreciate how the GPU Efficient implementation beats the GPU Naive one consistently, although the difference between them in execution time appears to remain constant (not growing, as one might hope). +The same information is shown in the following charts in different format, where the lower one is a close-up of the upper one for small input sizes. In them, we can appreciate how the GPU Efficient implementation beats the GPU Naive one consistently, although the difference between them in execution time appears to remain constant (not growing, as one might hope). ![](img/perf_lines.png) @@ -72,6 +74,37 @@ It's interesting to see how execution time changes when input size delta is smal ![](img/perf_bars_npot.png) +### Performance bottlenecks for scan + +Digging a little deeper, the **efficient scan implementation** doesn't seem to be memory bound. As reported by Nsight Compute for an input size of 32768, memory hardware units are not fully utilized by the first `exclusiveScanKernel` invocation, and memory bandwidth is only partially consumed: `Mem Busy` is at 19% and `Max Bandwith` is at 34%. The maximum throughput for memory instructions is at 34% too. This all indicates that this version of the scan is not memory bound. + +![](img/efficient_memory.png) + +The achieved warp occupancy is at 74%, though, so latency is not being hidden very well in this efficient scan implementation. + +![](img/efficient_occupancy.png) + +Furthermore, 43% of compute throughput is very poor: compute units could be utilized more to improve performances. Based on warp occupancy and compute throughput, I would say this **efficient scan implementation is compute-bound**. + +![](img/efficient_compute_throughput.png) + +Analysing the same set of metrics for the **efficient implementation**, Nsight Compute reports that it is less memory-bound than the efficient version: `Mem Busy` is only at 11% and `Max Bandwith` at 18%, which indicates that neither the memory units nor the communication bandwith within them are fully utilized. + +![](img/naive_memory.png) + +Warp occupancy is at 69%, which is lower than in the efficient implementation case (74%). I speculate that this is so because the `exclusiveScanKernel` in the naive case uses twice the amount of shared memory than in the efficient case (because it does double buffering and the efficient case doesn't). With higher memory requirements, fewer warps can be scheduled, which leads to lower occupancy. + +![](img/naive_occuppancy.png) + +Due to its low occupancy and apparent memory unit and bandwith subutilization, I would say that the **naive implementation is compute-bound**. Its lower occupancy compared to the efficient implementation might be part of the reason why the efficient implementation has a lower execution time. + +### Brief Thrust analysis + +The Thrust-based implementation launches 3 different kernels. The second one appears to prepare the data for the third kernel, which appears to the one that actually performs the scan, based on its duration. + +![](img/thrust_kernels.png) + +This version achieves an occupancy of 81%, suggesting that it carefully balances memory requirements of each block with the number an size of blocks that it divides the launch into. ### Test program output diff --git a/img/efficient_compute_throughput.png b/img/efficient_compute_throughput.png new file mode 100644 index 0000000000000000000000000000000000000000..3ee3e24b66785d5d7caa88e744163312f7cc1712 GIT binary patch literal 42058 zcma&M1yGz#(>4krKnNBiI3z%D3GNVrySoN=g1aOHNYLPJ!QGujg6qQKy12sv3oN_K z!r^(J_xrz7b*lb4Q+3zY+}m?ccTdku&o$RCH5FO>=VZ^((9rPZ<)k#w(4O+5p`p`0 z!+Lx}GbGgW_=E1QA^RDvdXnPsvGUYLLRkV0tu7At?hEE)9p|f@zB?KkLEk?Q`jAVh zB^p`*SYAp(%g5vtU>Z$1lnf5GtV)zycBD|$36aWq|6xoL>w9M=Z=GUIgrY*yCi;7t zb6nKNyoh%PF%lsmSD#3ph#JH`>wEVC$1Lwz^QW(@Am0y`>>!GfMgvt@?&cff}` zj3Bzb?T@Lq7-rcEH~a$48xccPBQWg{beR7&_;dl`;9j*1UJ4g|G|$@xo&< z1N30UJRpM~I8f^l6xEvR5akue!*2I%Fb0}T?gKRVK90}+E-LtfV+Svq?B6yap8fx{ zh!eZrz{p5T%L|6O+~WrxNKz-bJbGxdNHMjs1&f@P?W6s_@@Vt;-M0fA2ZZ+xl3pMgSRNJ^IGkfKGRX~e;d>mZ|aeq%`OY>vHhKRyjGa0!F;wyNuDVsPjwA7px-0Kl<;K-TH>Q*R)UD@|{EDTx!bH%|u+b zA*I!*J>o;Ed*}pY%2ed;qv+lF!T~lyI91DHKqg~~Uvrf^UkpF7U1*O2_3` zX>^+kSXaE@;eL~U$2a(b5~PaU;$Il-(II#0Qn*X`LMjEmh<8F5>_sR7XH<6}H+Laj zDalsj0w5x$a8`acUoqS7La_7Hb|2Wava`?0zzp_3Cgf4pk!~zrOd}tp2<4#L67BoV z=j|&8IoN&2m)rMogVlgsv7<- zr0#a$C2}jgZ*t-Gx)_DB2Z{+|R8v6{vCYAkB7ukGT(f}vsH-AZs+hXeXc8xdu}^^Q zh501ie-@U{T?wGr0`4v+^%)EzGaL>seB zIT@B46@x@AoCviyn^!5q9`_3c0YrF)Ty**uh; z+nGE2HQA)YBYE9*5^RL>cam#86mr zZ+J^QMCR_}NNn%|ke2o`+j|u*-~Lb_B_4eG$~bUHFxWjg=xz@wMg16Fz9m_Sh6KeF zJMv*rhy9<^LTa}DeS-|PlFpoYJ(hX5IHC_l5fd75Uk3DVM?4LZ#iPQBY|=mP{mpNE zj1OsEHEu=i`_G-SK0P`V8;9uG{e>ULY@*}eQ7?Qj84A@U-~OB;cQ;_FJY~~AQkbPW z6$>1dp5}Vj-h4zBS*TQ*8u^!f#I+%h#pkOd7QhAMeg8cdivNehKvM6A|5?7jV>F>W zEk~~J(Mx%6OD6f$!!B7-FguttZhu!TU*eeiD!nqORFWYC9}7%(`sPhx?pT}lNs4Xu zZDn<)tJZp16z+Ai+1+h4^Y=x6K3pEe9@Nw=2zd9qD}MJsGqC5`SLDzk6|Y&~!$dAf z*llz-oBV|8LcJZz4s9cFM>%;QU)TU48OsWWEz1^>orPfDBB1J;C$aJfujVA?y-N#- zI@}qJx%>X3msm$lz}x3`@!*IB&c~=F%yxK~f_)l33lY96I`xamOzUEOt z8lgklybOMEViBX&xkg;S04{lhZDNH7Akhq4Jg;U+eL>W;&_%|&#o{~!7(Fp-hA7+O z%21`a%^>Z${G_tQd?jMn0vy&A>D9{lpsj8P@KWg_d2haE+1-auek~p6Y+c zrWhxZJh9ac&n_7jh;JQBFyDb|ofncm6~B{d4%o*gt}oHtyg1XKA7CIDFRvisN12Y{ z>A?an9AfaW94kkUo`Sh6UYoi_Ka*bd%k&jpgX%B86k7=d*62%4i(U=XnMC}PX`sFM ziafQ~D;=zaq*iYF>@yp;d;AJQtoz`Riu*n2v_l6!WbY}a-hW#UFvVY{#aNG94`x`K zTBwDg=W-4{0X&tRG(}(+v8+SOBGH3+Mc#Ek6hLM&AIxUlL(lGJMTNR0oi%}QI+R{@ zhg1zJ3;S4FvPTy3KsOzCiZUt41$z+&mT!jK19I;HBBA0V$PA^QUxnA4nV(5J4Eu{0 zb;sRxby18$JIsE6=^M-D-!aiWq%2E(=rN(8gCk+$F(oeephWf1FMWfrRYfEo&cG;P zLCpy6yfZX{gLK00-Px8;kz1|4XUX-h^Mk^I4ofr#yNck$`FCBHV7L349V*zA4Q@&pbC%G{)rLsz zp;u|-4M(@=yEmCm-~L^bdu(63J9x(>IXJI(rlXu(yIY2wS`J@+1bEK?ntiebcaC?8 zp3g0CLAv2Ek6oLaRb{{ZaI)KVFNU?lry^F)cel?`N@B;`ll})eE3;^DNH&yT_Ye{k z5Gs2Bzl@CJIc~UVU|sTgn5bxE_PyxE7B654eki_i9IkGFbzE2=I_5;;f^TB|s>#NK zdHk!DVPH6H`)aKiw9XTV_-VRNSuWD_lK#ecq<1zYbP|$Bp%wIyWV$~oe8}go0zSh+ z-Hrlx8r%;UnEpZ?4t`EIsE4+pZdMLWQ5C@-a*uuz3Rzsx{^4YzqyH}2WfuUu<_Z&8 zw9*w&RPNX88B8cOB|CpTnoaqH_J;-C2)H-F$5?wcjBT2_lD3W zhkAnee-em63aS;4L1WFU2){yvrU50W5$+Fx6B3B0x~7uJ%^>*?vd=HQolD>IPG^@L zyF5*-fy~7G#ovA-VzusXN-l11m);emX-EJuDx$tWkJ$R~`s<2QjEL$yxhOer5PZxO z6#M{r$kx%(*-;V>I_Kr2vOGp8{uV&LzxbeEJSBVOMsm%1vCYp(ew91%s|$m=*DZ7Q zm~5LQg`Q8%QRK)^sq%d$&VRN8w2Vd8kJS7Py~XbL%{Yhx;MeHJyW4_a0V~=QPOvFz ztc8HRL~l?G^<)0m#9fi|J{Kj~RRMkb`*Ha#RO?>?-cU3*Y6e3$lJ-Nf~LpZapYd;juya%>84g*&1~HIqKB((Fk7Z z&d&FPNEZ-z$sud|F);jV`FtP%v4Qei5+_81_#gk_8dA{ndQ!v%$a~$ZB{}jNj1hLF zoZg(L*9fh@b$nB+E*+Z9DAEbWHmtJlQ0$Zk!<&Oc1LPySaR(AAW8foDMR@GXrIg&b zDNR4z$vdMXPx0I4lV^YH`03)|lT5qq6Z`Oe_|y*}<( zxRe)j5d+^X2_H>3vvk2uB{r0iI-96^=uH+pEjXpX3UL*m?KVjio9Pjl4Bey3Xsx&f zFiGyitqzl*M;s_Ye^GcA<(>!JW}gu-L?&cT_c%$Rnc#y5!MqXvu8Wu(Ec~dBj-TXr znpidBcY}RbwQGCzm_jlURE-TUKb^6KdImx?qQWH}#GVl#F2}$;7(DBro9JRA+H|Tl zU10be_n6pJO`MXmpLD=8cm%$N6Cye?Tb_<-wT9UWR6)>&U}^Bnf=_HJq>qQb&H`u_ z)ulM?Gp`Kl_;KS3;-nJ|=04u5cfm`!hIa;{7uwAD;zz!664F5U>pO zLxFhli11F~9zjOdM+t(*vuN>sHxs{Z^)P@xkw5jJZsJOox;tk5;gHC{&imLIzGTmt z?X3i&RxN{dyC$>SjM)bj$9!rD4EXDt8#is;HMzU@ypC;Sl8IlHc7d19uNxMuP@z0i z;-gBQ_3C!Xs@=ecIBYamxf~C5C%?TXJa_=Tz+p(v6jxNPXNbdY=xW`4JiP#xNh_8*iUwjVPlL`OGLSP-`n7Gc3!R+k*oEOME|zacBezxmJkG*+TIzV7Iy-zcYt zXLsL=f2`~=YjfQWr&9 zVEau@O|cIIc2E+G6hHLC2pt^aQ=KX9SkGr6=BUW`?-}Boxhn2B$Yvo%p*M>K``=gA zA3ufS!Sj3|CBcdh4Zr0^LQg!kGVX5zGj3I>OJLuT2w0Sn_YfAs;#&X1RB&t-uzC!H zYPq`q0X_K)|5$d2Byq}FmlE=wMn07zGunb@s}V$ZTHG@SE9%-NRx{kdlC91FHcPzQ z_$^>;DxZ*bzhgGRnVwQ~g%I@ucLB9yUGZ)Iwt%gkmh4l1?An!yR+?*ds|1UXVf@$S z3G;qT@JHE4SA;Z4zb?QcLF1K4)>ytLi00)ikO3ODKbd0E|E<9=`9lcCOP;nFq4?2O z>wGvh`Wssuw?*9jN$G!}5X7E$ zH!}PF;Su?ne!xH*Of}?pTs%*`t^}phe$jX{GcupqfpRHVU&1=PJdH7-le6Q1mi5AWEa2xmV^M94X zCFgvcTcQXQ__2e3&<6WHEONm|a0ob8q5I{3FqcY~`@`J(U-$6b2YoSgw81b#7XXpW zf7M6Z&?D=lm7@F04dfcb4X1TI%@IKYZftdq!Xs6#@ zx}5am9Q=qsgd&Ux4ddASERC$5TWo`nUOnGEj!Qx{OZfWvC0H8DIx&$tf4rz%1!GXq7K zNYlEVJFBy}E9dwRquwTSm5M2kvk%s!cGgCi_BT^l*YErJzPM{{G{W8g;It|H7DUq> zw;NWK=+-|P9;~~Tq6pfY7e`WM<)!4nfy_#@D&Hc4^9HY<{Xsy><<&LEb9?M ze_Bim*G;XbxbWY`9bkGLOfwjg)IB!Z%9>l> z2?U*pbFg+SIvtHJyht)EG#x+w7L{1zRxC7e4V>0WDSBb@x;cW&KFH?i8%Jh&j_DFT zQP6z^oT0F@W^6oYt;EDAn(eexVV}LSoX)8rTb}f@$IYGeHRKtadNtchr_1DJ3qA1f z4W$!y)2X3cwLd;mvdzUOUEY6P=MpFZCMoU%5mN4V(F3)3;>F-*1XjFG>Q=LXbXE8?cqg;(oj2WRkZ9ELH zEmF)gx?K|+)g#jIUrxf=&&#JS=(2Y4JYn+TxZ+>Ic*dNXGnSAh8dtj6FPCL{zQz0A zQ@(9`=SvM9Adz=!pUys*AR5~}5)=SGG@vsxTK!dgJ~{gSzVUAr13xJbGg z0rE8MfS@m)L9x`Mz6A?3L#qlkpa%cj4$Nz*u>SS)wftMr%YZGLs&az1#b3p{ZM}u6 zV8uX#Ir!VcIAIj!egpENLkUO>;pY^V<#DO5tIlq3P)iVZ(JU9yIyG=K;=nwkm_;cG zO^5;^zbE;B2ybJmB#0Q!Sva?Z-Ae&X>)29vb#Ziai$pK+20I~}KB9AD#pB~&_7GVU zti`isS$a9dO!GLJ;az6ilRmB~_1Bl}>~2fMZ-}Jd18Skr$7~9ZAXZ>TY|8{h29`OBS13Z774(M?jIwk)=X?0DX-!)jPs2AOu+SNaH+~`4Kf^_zCU1W{f>0xDzmzIHVV-7=OKvV-x>|ImvCn_; z4PmHu_GqeYbG+3W39nYD$;MzYvyVwz+oj?Fq548wm}4bk6L&uU4Xan`)mc%FV2z2v znuCgsUqJYmaM{fY;)ASv{n0>Bnvg(AP`;2|i-j(JIJv}GWO@R9wL2(Z5HPURmz7&? z4uNqWZG9I<>-0POu7G^%1f|XcH7gLGU_39}-6v-`>OQ3O9aw-_t?nW-S_ z1$J2y<%v7fc?!VJm7D&iRyn;mU=V{$~<4C@t}e^{(jY;Iynw%q+Yx~ z8djct>WQSi7EUq6q;KF4gEp$tI`_>lgiH=hwX9I3;{Z-o-LfZ zhxS&0(K7A?yx4H7H&?ytvms_dLI>T2luF}gsR*`H;mX|h8t>yI<=hp9-TFS_g6lx* znjc)_Ki|oM$zL=b$}xu))9tzBbLfm5wgS29Rf}x81X36i3^=yx8v}!iUUg#66y80? zUU)qZjiN&QMa*%p^{zS6OV`xobdaVjP$kE-PHcLCR`WPTG7>K`hC!;k)yE`fUL$2! z2ERF|m7Quyoh$M9&r=f9gb&5xb84Wn_<99v?#k~(>tojKKCktxxV+gv=3rJ3Po^tm z_~iOYakl%2)u4SYotiI}7i*CDt*a~}T@G1{dK^Acq zT_4GA@_q^VhDlj=_{HrQ?)xeWv zbAT_c@`1Nfpb%&@kI4zzax4ZM?GoB3zDbTZg5IqKm9Kb- zdhX77u_i3;C+($Ph!8jF*qXF}EY&WI$02T_?NzK}F=X~;y*ij) zs}A^}XC6T1X(RlK zsXfd8D0A!99NlP%y?cSKMl$8C+ybmK^hhrvo2(P4I9B7;^!xQ4+2M66d)f7F5vl3| z$^F?lL}HznVJ3nT?Wu#q2=N~K-Dyqi0t=km>=2HEeZPuVZ*xRWlNdFDIEbfL7!c<~;N z%!#UQ)zreGU&izWb_%sG$Q)Ai%oJ@{B4_tQN#EIH#5CWI1U7wl%CSj0{zK$Naqt0% zt|#1&jT?~U{cGU5B;Z`Y=gt;-A1brOU?*q}VAHUH(Ilxj-m?EiWHD=zV_TbznmA~T zf{rM0>EFgOs!hyi#yzK;Gd7$*`q=?sS(ILG>lT$MiMjff0Q0iIdSl^R8k(A%RwGeE zmxNC8Ww7wh5szffBOBdo#VYBrku)k=B{%V1=qk>o1|)v3zVh|saels*kEizI9!7x0 z`zw*RLJeA@j$iTWI@`{6lkJ#Yp-w-x@&DLh93`#o1PtSIVK4c_uPwB`zJNA{v2E4o zYVQ8!`NYzsNbI}*KHsn|s?Lm$hs;w4cx;#4m2)VYU2Z!=Fs-i=GcI@a1t(0k1!yNc z=C~CnH4kk5d}-1&bibgN+YA9evy0;#KXJ;~w_ul5qO7?ZWGRw1vB5CWZ*jy}4j*$g zn)Oe&UX&P8yQYZPvr1PjPt((j-x&V9ALxPISk*CK#2Gm@N_*6;WH|^*4NGna8tNiH3tY6o#qZ|co+i)r~DUhxP1NqE8`grX@Bc5OJ zu~?1KO?q#Dx5o-Y$&4W!)2W3;pR9Kd>SkFv#g7nq`w~@~X8H>8-W6^|s%-gtZi(1q zL!+DH(ZfOpLFTJwD1H1QqjP7n%QFA!4BMN|;u*H51R6zeM1qkFEAmPL|2lh6s*8}- zCxDvjj@ZkfR3ULx{g>YHS`=osf@XQxluqQY@6&WLp#j5K%DsWy=ox0Db1Qv9+yT)+ z;?=7-FNX`R_(Ghs_eBY4wv!smX6k8wBuW%poYNL%9xSnIbj{p*DGeNxy#j#C8;S~N z-8l?g<-t=GPv#?plB=2smw&VsweFho3J2U8dNHH-Iy`)rn>Bs`u~|D!lpeXnVys6h zfAT0+TW836OwPLGpim<21rWG(x=o+yrwHG#`uoOHRDvD+euB{K zu5Ry3jw03uhZ6!TEI`3Gg)eQaijacLshN|&4HlpDy5Fdy z@uhIk`Xw6vGyEjkb01p;4i`24Sy@Ak-B0cT z))OyXevW^xkE_LHts&M3vsmb{_Fu-rv>;V8FCFxq%4hmfgb`xJkOBo> zE*4Gf{lFS=OGkUXTEPwFDOCV z9BnOWIxBX`G0eDvum##Fi64zBRv@|R-3F8Gj&fLns9Xho7Fbn4G%dK-*}@erpcaiz zU55J58M3QCN8XRef2+q0_FD3$?A|fQws&1MMp-ZQ zeA&be;WsgawVRq};YFipaV?-xT_$8@eXs@Qp?tHr&qonecq7QyO^?g<2fJ~Un4d8yuN4Exd>_A~h>%O@>cbhL0hVB{~5!Hhhz5k+Z>kI;M(Y9oEUQTy%5 zBk>~ev;V=xMggG=>N@%&fK|nOcKXJ<4^xP~bWgV%K_q(KgK;%)=<-M)6Xh)?pyHUU zB>3G%n$ULAOQG!*CPqV> z#}b+xo&RW}Mkj-f)>F{U`M+o>nowTN|GSFye}!BJTR(dKR#EK9Q%qeowr;mL+OYF< zvGK<9wWj*!8%dC(0~8NbL-8_(UyP@WQ!MOiF8*SnyB7M$<6{a7YHDyBEUjjkS`cBq zQZ9&odMy=7{R}YMvDt|H!sQ$|`5PpxgNhkzy%N=^&eHL$%&x8vyeGc8pekE{XvziV z2DQvcz%U$C!wHq=M{Z@Q0~y6hcn6=%<-N7BGf(y|UsNzeHX0595?>#IaWXm=0@&R+ z(iQ3FOhe5{fQ~~+>rz=-_xQz`m}VaFqSx|GE7$83#ah&Z4;8VVY}R4wvF1a5Tm)!n z%UtdO@zxAF*Jo6Q$+1zCVj7P+s6SaQoyVuD9kg0Pe33(tl7seq2@#lUlgHk&*D=|M zQqCWhP6dMo=`VAaB+AJ=TE#tAM}2R;W`E)|gx!plzG|U>!P6Uvg{Il?vJDQto zv=g9ZP|^ko!#g&I;Y(_^*Gr#$j;Y)-`Vc!u4UG))A#vQqb`r1|c->dmjJ;{tw|Ts> zxE~Bw428#H+>L#Vt-px~t`RfTMWHza*7K5tYDQc zJBW2@B*2}uavWqX-TmZWPNv7`Qlg?lV0xaD@R$GGZGU>M>G4%Uhv6w!V?zY-!5b**Wt zR6D=|1pAHo2~<$drf;0jsB7O`QgYO(=h9mfXG8jI3?hN-J5h<$VQxu^k&8&I1*tL7 z*7=EGxc{^z&jfqtO4wc^BgMR)m`qUCeUyuZ`a^7K^5;k4rLOrw`ADU zOgXcqe7R$?^b(+|qHQ>gb2(OnMjB)yePkX!5#@UtSVZP|hj?cib!e_J+L6}$7f{cY zJ2E=bK|j9GdCol6FVd1$ynMx|f!t@lyk{L|Fy#2#PVO(`qkJxQV|?d5oNMFEl$(vT z@zqQTe+Mjp5zb^L7XbLW*~fu*oba~K{zu6bE>n>R4sVx~_L@s^W$~YL`;lFR-%n5# zIl8U|qe2d2A8!G^*5?H4O};@&nAh*->Hi9Cb}I@pohm0Lgl}Y=qa4MM`tKp66S;bD z{I0m!MWpsYOf)!UbjPNX<2tw^_OD`5vy&tz+a7GX^Vv}x?AiW(P#_Li{C(hMmS4K_ z3?$Xv2eOP{0Sb#Hrh2|N6#Xkkw+<<4&fK}tPJVc)v@T#bw$2@3U8#Z%DZT8j9i}VQ z+{+p0to0l(Y-ztcg{n}qvfFV!8h3Q{%}wU@YEAvxyqdAt2Ox*Ps`O&`@#r)_cgY3C zGk9$AUbUV__c|4h4CCTAp&Eci?Mg%+1@QT9T;o_lM#fJT{CopE|LO|`tE2eqCIaw= zMR<$%iGS`@MGZYMw)`N@X#047p19QBQsu7LI7&*=)rdHyn819K4*-)02Bzx!hCLV6+O zzJy)QK|-ecEuP1|%kQ6eD!O$&O)91x^LBlCxn98U&9e>SlV$GsNhcH0Vf2S|K5RsE zF>=tT5XzUWaWmsZnJlFBR?vz=QAq$iTcT|&TfX|I_1jZtdFD7hoL@L^#JaaTjY`0Q z8GE7a*#+y5l)D~N2kX`1S%6oomHk#=C3`k2d(6uPvFg;L=bD4x2I}nDv{j9AzrGw%GnQ2%&zfBR zsnSsXK8omXZ5P|QFeDF(2)cAkhH>T#h^H?|Lr~8b`Djn2M*lj@WJRjwub7(*AYilig80>73DQXPv!cY6B03Si(dr_X ze9p-4mp331{a`@*WjNeX9z_v7_B0#aGgC-*qVPqu2BMv8M^c-mkZo zX0QJOnPyTcZ&CKUL6jq0*$r8#Cy3oFjtE=&?&5uDP**3I?TB{3RSxccY}s8Efho$v z`Jh?4KrU!3qQ6~esvRRJn#Wo)-ca3{{d{#&Yar+A)u``W--1YW*3-63nb3QV+v<@Qa#WtD4%0mYZ&ir>0Rjp@R zTQ|f$eF$+kvg!}Yq}O&O_P{5^5BK8{_My;Q>-_;sD}M>*Q5q*gB} z?RQ!^Eo{4l1eO>w9hoeR4!^U{jS_FwAe<$BsJS9vNTBKw?CXze6~&A8KBM7F`58J> zBRa~kfPG{|fT``wN(>tJP>dR&b%P|n^+em<@avc&i})2Ofc0>W613HbOei_)RCLydHKucf-lzS1-C)TJ6%M5s|Lt1DiDWBL6{u zv2g9y`yjjLAM{$%U7mk_X%?Dm#L>E>qZq6{7{8Rk!+5~M}REp=WI zki0kEw92^O7a_-QoRH02j(&RGUn+F*;+e_l!EDVe%0D`>t_NWUjE<1axhd zTa!4-iAP3nlED)&y}w3HJlg%WE`S5P;F1l} zUQ|=X%po6YA1zDR1+La)3t|o%Wo4GhX|LHQ~fMLr?!gr6dtPZ@Wcck|wb7CYdQx*Za!}u*G z3?tl%=JzFPCH!RBg=sDZ&blwBT^xmt0bkjJWeM$UHj%#wW+@JBW>Mw4&QD?x-BRB@ zctO{HyJ+s}A-Qn*+%z zj!RJ$19*yvhW*^>J+``mZY&OE^JVh;oL85(!`V6x<8uX=0W>D+^SATRzQxOIcAy8_%Uw=-NJ7 zo9$iq$`A78jCx*vPO#o;j;)sD3xJjTK(70X_0i~G|hk?11_Ui2N^V-j* z9?7T11YWiI)rs6#6}F}KQj2*tmRglDj;$r zt5?YV^)eR2c;&O6k>1Q-&Cd&7-Ib`0nYC4mYOCwsQ>vGWGh-}^hueV0D-#7zl)iL= zVREP49-^+;VFX7RpXbyR4BpzUu@L^cGa25eDRW|UeBFM^DD5V(fV=WA?A~`@+uT{? z9FF>>F@?+R#vZmS9$qS0s0=C3n`*5F)4x&0!W_2*qVO25KYwiD}ZvA)Xd5&2V+jtg`8Jp{6VzU)~(MbpfJt5O+_s55H&`e`S_5eh~TSQw)}uUFygr&BV!2GnGj# zsPbJ5=^Zr>8fR0s*EbQ?Ow`I{I}tPS#^;uIU)H4KJ6F{1CvSXDdZ&-6(n9I^(6GGt z1xXEE<-_ph&SY&@zno1S->XB`B8)Rh8}OJ4Nb>7eNqj0Vz@5-ha+?^XCU_BKA?R~n zii~IZgGUu)uFb}KsP<}leODJ~XUgKFS?ILJm-*LX%L2cJM*_j@m2IM|B?t1_kj zLpUIT(YxZX_MxI@j#Cm)bj?K^!DHOvJ&I&3t`vjiXWz*6t*J&vMv3~Rr(K%y7Z0N< z7VPhfk(%_Lq=U_D8<2VZl!_-Kj(vNKyhHqU+&&`5nEC6-*O7R zu*p1RbI=v=lyQ(#O}6#!qa@boJ6iXNY*p^O`FR^B65YtGg>@fzD16!GJH5`^{+}ze zAuCvlvXsv;!0+YI|c zkm41lHnKLTaRjI-Ccl*Ok)WgwN_x7-dTckyJu+wi>FwsCU)!@X$O@n7C~g(M;<4J# zYDi=M!f=ypWiV%ZBbmbjla37G-t%%A&2j5n{p+zrtnc;$?Qi)?f9UVCIQS7eu#E-* zqB*Q^$`~sMaMn1Cqp$Ug+BgPyC=@*md=-Pq1|TbA2W3DGwPdP@{`6|MPvRXEv>z(tlhK?->SNu=dU$Nc zRHuR;S$z%Qfv;fpfn@ztO)+1I`WDprKc~BK!jJ{c`BCipFgXOa%M6{43onC|&gf?x z9&{ywJ(VWSv-<*Fj&}pKhyra(BHO+Bs5nb@6II*PCFd`ELItmXo10}aWu%wArjYr? zSUvWdm_uD)6eD?})Mhvr<8PPCdrfUZ;I5@zCdZz4ymym>#LBY(?U&11W9w>GjOd$w z2C_LywLJa3gJ=hXQ|}^|PAUuXn58%~vvnb>4d0hvnj6Pe`Dbh34`o4D48rf4Q)*3g zDpNB@$SOR1;_JDxHDtek;Qkcm!r@?xY?hKc`t!Pw#X{j)f3vMxj@ji<)xr)Jal_?z z42`nQCzX%ONk4?0xQfT48B$Q3pMQCcCPi{MVnSuNDL842m{E-%YF8%o3 zA3-<$CnBz9ZCxtQu9{SM8H~Y-jw>|5xH6gTMeE9TnOy`2+CfBRKkJH)q%@5!wRY1< zWt(!NYdt-kzimI6J8YE@NqD}DpRtlS|G>+mLbR@FX(XPS&v3X5u)xEK7gI=il1vKh za4C6CjwV7DqJ8D3&2M2TgCFew{B6fF-zhl;q zM&$`>A-R&LV67V>>A9)ya9)!_&va5kfZ-h?i@f?W8}B6c%{^b*YRaP;r)`eKJaWYR zwBCGTg1LV@`wNSH?-l070Gcp6qT*cO`(BlZ%F(3|lcc_+OPzyz9yxNt-%5K6z#oM- zP9vxD{n_VOcOY@AQ@*C)GhrQcuRlTV>qPT6;ZC&FQVh}`T*9u(Or+d0V+rDWJytw> zmlFC9OrY#`*Gr7YXDWEBgRjl$|JVZPlaH=6mJAD?7Q8rN3#+6=P<#(azF{qxUD$aw_@3ldbx}lFmCsCxc3ah4Itafuanc3kDD{XdhsGrIWihF{rEmmf|7Q-96*qYW9{B*LsDnNbyHOT7^Rl#Tc zVfVqV32#5V{hf|Ji9NUOMrxcIvubCQ{c00&Hb%cTecb4&@|QKs&#>e^vrnt3f03mO zmAU|C1?|wJ#v|DIGnAVGxUI#R_c0iU49OxvErp(a|9riOGe5Essh_p zA(s^)(UP5B99)bn*j@Cc{O&C7ApTbFC8kS9lCSMgvI{LKUNAt05<1Ih;7y;P#im}H z$DQ}WLB@bp&(na1zim~R%kVQ&*3>B)nchRu#km*4LGhpPO@J5G34{J%WmdA$F> zRAVgb*)+k)>GZYJlAcoTEUwJ_ZHf`3kBh3ZGIF+e=BRyU0JV-BeM2cy1=@EeW=-?R z-1Zpybp-1u-t#^7<8?RMSB%rPFn+y<`g-*6bE;kJ8YJsE)7@nK$T&We1at8Wo(9qZ zisM}7v768Mu|KO96CqN*B+Y$1j=17L{2cbHmHC$QWbn<5jbiRx=@UZz8ds9{s`xJ> znJtct1od@G=g&t{-Ka7n7`>au`+II^oWMHI2VZms|RA1 zWB`uyTn>Ve;~(~xQ&wD|^y)8%h_%CuSv>tg>e6%51Nx6l*FS=D-7af>Y4ekN=dS5{ zoYD1UIw&)X$d`KtDHfU9XgzY=?pbeb7;HW5Ca?4(WHp7_!c$3T+wLsQy@CfE``?_d z4w~DGati6xUTiRnc0?o(it>1LJYHcApKwB0nlx&X|N7VOcNMO_w!Dp2TcYDUa;lL> zV8z1xPVjZ%$kS043BZe%|%CWCnL?7eQDGS5fJY4IXLxi`S81;)Wui7e~=e!^P zeKa)t|Iqf9VQqF>yC^M1ik9L~q@}pKdvSLu?oM$DR;;)?1b5d0!KJuca40Ut3BlRv zTI>D3z4y8HzRvk^=FjALlBr`3xyL;w>!#Gzag`y zq_HHW|3p-Sx`pB;PkV{4#q=d5w3VaA($mVj^A=E-acFr^(37#U3=PBHQ<*c-@;Dn? z=B79!=!&gMJ@m2&s}cTrNBcuotxV0vMiAvvSShygl{>fQU+?!k)E#g5uA?(4r^zbH z4ZERnsB8PojwpiJF`IC&thc?{zvj}LQffy?evvwOn5G2uG&oA-lYMWn&VIAn+vL1n z)a;!xb@M5BG79P|`uxR2cgIUTB~{~a^f-0p<(y*VvNNu@R#93gq{eg|T)45?R(^^A zsXp>!|EZ6ARm@JeFR@303juj-AA(N{z~aP&Kx_B?o`Q?;ft zqq>i5m_G%tQasq-CW!jFpQ$CdtDW{-$!^S+u+{u|xN?5;>$<&_%6;^ntN+cJX2MSv z1j{yzS0g+nt{vAiPUV1!FJy|sAp8kbIp z9+iJ0({_%vB-;|@;5`hZ?BVCV&dhNYb;xkqvry&I_@&b43yOrG<;1$soJdUPi+ouw({Lo{E2pxCKL?Pbh_ z?V)~w-`9@m-sLhDEilO_9~ZxBAtyT$GX+W41K z!^}-OY^G6@HRZ$UwbzE+i{`R=)Se;<;J5QK3}L@%f=9XHDDv8+#V;)=Yp_xATjgOX z)yaQYQvABe(m<&^bkggXbF0+p&Oq{tQD5mqX4Hx4hP_wc!NvU{WvUK^(FzvMD)-3r z1@_C-XKqK$`U^w?O3)^aQRMfRBR@4XHVD5qoA}E3z5r*sZf5+orbUX2az~6~eK7&j zq|?8yme^8seZ^AJ&iTvL2?T990CGBqfFd>1z9g7J zSIe?l||qirs38tLK|8-rF1}h?i%pOnseuN(|dkJL38L^aQ^&aW_1P`r_@x;>ZsoT*^{5#zq7l)F%h;~ ziAwdSH7B(0l8jkstVnWaeyTn6w$JWQ!J@i;(Ia)^Q_1{kdptfuyyt>IRzJ$i#Kgn= zQOw_DWg<7vW!tTWUkZP2r4>B>!4g5)JZj}FeV!>B!z+vf*V91n85m$#7k>X&76?kG z&x3!st|7^2Wj;4-1|hv-&=Z4yOOF~O=>%DlU}sU@-v_=2=}P~o!*ep;6SfQqLBcCn z?p?-Ro!m>UktY<7rthCsMz>IWQr6JaI^+eU(TA1)LDhhN|3G@B7^04wLSJzNcau8L zP=uC-v04VN`qS$Jj;+eq^Q$3snyw(VTkEhXmF(SWIX^)#q_0RukZ$hk3PhUhMaa2d zZi8~a+tD4f@b%EA0VVNwN9IWM71gw=A6LzzN8A0M_HwN(1ULA#d!hV*YAs{^xO7yzmwk&ybueEm&&&|2M}R^>vHjapJIoE z0Vw!M3BdqlFQg7ZKxg&!P+=mFaQJAYb=0vxnta>&(Y|ZS& zipeoSzqS*@Yl6?vW;Vi+k0 zO=Ma9;1DqUCLJ=*&cPMoAH#S(6=%vmZ?9ccO7>6#4fQrfA~~R6AdiIa#$&zP+T9mxU62q>`6i zai5>CO!-SOuL^5S)rY%k(^9+VU1uiakBEbt43^kFq5QC=kbHwF9nCcGPC-HHePv0a@X6nPTI z%46VMTOB1-Pc1Y%*>S37ZaDIDq2Lc_J=-rL7jwAyRH?L*aHxz(bIv@fI*v;ZdGVPw zoq^W!1j8qMRCYd1>r@PZKa&vOWU-&Q$!7F}Ra(+shM8GfKov0c^|C)ECi}t z_cA4pg-pIbL4XCa$ZM(7q$%AEnJJmfxJB4fR>-+|ht7ZPHM^EyGz@hvf;_Z+zM<$C z`XfeW^-wJBuOpsekX<~BUOveLhdmR?y%5*$ASOyGMHlG~U(rgHyne;7w#XIcJ%_xqSoOW8 z3X6fzx^F>ZnsSHI_`F3$aEsadomvB^loOug3%$abkJoqmJ zMYPgx(!hx6Ll+!;7jC(i&2(*;^5>AO?!E>&Hf)So;=^JcxSgLz^QreE|BywwQ4+Hi zEEv(4peZu(0f|%BjOH@?_TcIx)n;!wcyFH< zjzY5Vc!maeQy|HdB;t}=T6;Bk^wUS=E+c zkmJeZGel!}6nYAxbu08%hD3MUq;SP`q}9Zu#HgAsg)dHpe|Ed!rqr_>G@|B(Il4w z={jcvL!3qfJO?Pcy}uTE@8HQyj}EGp z$kEDSI}Q)LV3~^awOAI2al3K*o&2!Nif~w9@vuJRqkkp7G(zpbf!kxgtP9F~2g+&X zs9Uy(*o>+xETXYS$WNgcUyCxG2PCO&E#rP-XKJcrBbxb|OpL-K@fryEds7QOeX<`Fs@}uK~qe zve-(vmH{=p(JPp)dl#Qhs3Yj;)nr`s^UkcD+eKZ8%UBP}`!i1~I@yQKMnt&`79WVT zy!_VDJboru&!At~kV}6hHhNj3r$P)X=lh-ET5S8TJ>ekO6yaJV42p_eJ>+mCZgh%` zIi8tv{q+~&d?;nY5x*28l~ujXn3Byheg%>*Ay&`PhasBr%&nt|b*8{<=59EUaTvh; zTDyjPWu}Q3q~C0vLQ<;{0oK+0dOHI4QkWi-??Yqg19Dzk9SD*`(}CO#*!Ffr4wkc)8*nx^_y@Sly;sJ&#oL5?96G@Y%URA>PL-EPRvy#L@S& zN+2=CC5~N zTB6f7n%_Bbf7!*ALcgIPh(tZGk?4md@SZqMo38t>XE!8sMV?j|y;}JxX3jC*00(q8 zNZhZKYCuVr14BwjbeG}Sl`U2I^4F6PXG4S9RsBf})p!2@kCBI6x(t@2ZyBY_OMYfO z(X8|7HXdPJ$%I7^qNdu7o5oo_V#M@Tud%`(^P%#(=n#X?`>*FWi!zhpf#fBV$?hi- zwXsb(2_P*hd{3bN$yhqg!IQ^F#>0&!Tc4L&CXm7U0h=;}Q`sy^j4N+O?GIAMYDq#u z=geIA)@H+*bwW?B_m{xGAba6T1%j6kUc#Yl^9_ zFqd?USq7-Bkx{t3OA6li(>Qz+Qb(EP-&G5x@}Q#;kP>jpVmwgD`HiV;m#ZCXrEfbk zKmuA&Xj}OD7Y2=fC}Y9DBN;+U#jJXLsSadnnp9ly+Dg;+pL1CyN#22aJr^aJ`;7;_ zn1J*(yvDAJ)}V7Q%{6Uz)r|8ii+*ABy`=7@P77q?Rb$qvB#^5iJ4=#3Hx1+f_)$;} z$^Ne2cwJCy5+SDh=z?)_@rig=~COXS2%SF%6<8;!A&=I=8Bo(SC-trnc z{&~JD=sbYA%?W-h4XUjo?6z)do@W7UkR8nS@i#m3SYp2;YCEgdV{aC7sTZ_#3jGYU z@WOj9gMT(lqNB8AFF1lr*r}vpTKUByetwjCzM+zR`ue7l36ug+vR?_!@hKNCxg~6#R&u8_8UQkg&3tV zrkn9irTV{*tbQnk2i>Np=Dr8dWct)oJM@DFVqQ$swm@owPmYQzIANtlE(nw){r9re z?eJIgPF*5m#kf8~FhBBYGRUr+rGzZ`=##g}x@PlSW+mtUx%!KAr|{KO)%m*v7GI#s z9<4rW&+G$?Fz?}=$TK2*aFuyv1ATcN#4@f0PY3KZkYaWSQ_LhyL&x%Qa6Z8yhBpdo zdK1yYNJwiPjB2o1XE@mM1DnRtNbtppcc>2%44;m)uDjter(nbhl$Lz4Wv^zW7c(&4 zRGtaYujm+6vADGJG%TET+rtIJyrHM9)i$BH>ZmY}CV{0Hep!52Cc=UMiwzol2VS`e z2`x>1^_5-d&9R&3Zre)~r`m^PA5iV-`kT0l@FI8-%WwRd#bOMv4FW)*F9+2y#)Sa& z;)7g_b2LE=G(-kr!p~a+V-0@a%9PCX_tRTkGE&dJRqa^4N2Du_xA-*L45JW@~vDgF%br0ltWfVs? z*1FN#&kqLPf8prp%U~%!SeJSBPdE*Mfu{f6L{JwRRf3xL+FTDgjAwkiA4=Zs6h16Oy0$lYig2<6BRWV&Ik1v3K1A z*p2jlY)oG5dgt+JzM}B%jIAb_@Imp}u~&dOl2!$3a4!_uKnK>Cm}Jsir;jR&2Q19Z zNqm%-)BO;&xqcLe7v05{B}7PyM^Ll5q;Y`A$YRBXMJrar)@Gox7VIEI<1zWRq~+XabFApE}h_F`Koy zu^h?wcXuMv7%B%dbXgV^f64PBln=o3z&Kql1J1S_u6CA|sR4y4UTr>ZiQPnbWl-2t zmwiV%J}S9;y3;p>c5x`pPCSkCCt=oe#&4AERBZf0S`#{YcF`Mq5{S;6>82VQCd6$kEqBMl`gE>&TV7 zUq7o6lDo1~PRmaGeuHzuA&Pfkc4O*=sE`;!<}#~@p09iMSk-IzNTRv6 zpxuW3CqQyS+IkRb14rHrza=9#N@j}e+|z#XoyLC0qd?hN7X>kn(#dLZD5#<_$r2eT zSc&-S=tUsSB0l};4?^DMkQ_Llk6m=dT@(F)5Ym1p;K<4Tppo71dyrNunGDckHwPz3 zoHGi*J$g&bqAsXY+Fbe>Tc{7mKHG!CC2OxFh$BZ(zIfymiiXJq%h8ZOS7koCIoRN= zHVogj3)|uU&*%fPX=7nL9X=;;nRP)|$=o}^-yo|9Ztj6pkcj9C7|872(IlZA;lq}S z@j%+bd7apERW%HfXOm0t=+5br>n#H8_%0)N*1<7MN_dn%0I$M@TJ=gD=L1UG=MH(hC_mGXh}(T$z2QSXB^HfpU?Ks%)G3qHln)v#3?*zd}y zeEsh~my~MD;kh6Pr10Q-$NYxaLj>`A2m!KUCGyJw+n$K5_saWll{^gWjlMxo{cr7v zmH`IuaoB_4vob_5mO9+BN5IF321H36U4Rxjt$P`7-hToI2bj2$(T$V@7S(^~P7C(~N_2cwQ5+vTh6t0m5f~mL z-lbme)Aa~TSJUDm;Yz7z1z~;jQF7sRxpDd1$th;|$n;%iPjhLX2+{m)<^D?n8vjJc zc#%pqewiO)t>3C=Zs#d?MU6ECY4ryw2I9otDM9Evg5P{C{|`-dcS}4W41m4HC~A4Y zGe~{zPEY$AmWnX6y*0Mo`)}aEuAcjNVDm}o(l7-knzhHpdGmz2wN6&aoe}>yjy%gm zK+-kcL^gxBLfV?njyNG#cX2}|qT|QoLERSF$&4?zZJ|Sd{Jj`3ZEu}CihkS6t_;j6 zX9>#4RfuLcU`33+Y>9P#kh-i=R^q{vvCO6jKj8RbZ7d#NPQA{X!%!V*cy4CUls71$ z$_vgtvYZb6wVPgx_8$sDI1vXJXqH8(k=%*IGj5C(HLFUaVsjU}J*odq2gl%JVYrtO z(yu+D%h#?Mo^N{a^1klR1J}4gS;m1mtu$BX_Z=grBqSDv>HSXRzry!Ykf*oSsj|%e< zUH{1@ul^Ceg!P7iHYKl|`U5;=UAF5Fg$Cktw|EOJ9#T0CdGs>FM6Yy%j2!ivWvUce z6JD)&!iZbwcUB9d?^^%48I62e{~dib0^N1Pl2iWEa$g>gw7T;Dn~rPgl=`3V;NXG~ z{?GhMu%Am|BpdpN(Hr&>#oPb)7yCc=H7q&l|6dNLRamxG3MPyxl$PvY|G7ZrvEj?z z0i)Zz{MTx45Bv~*H1^*7j&xAfyq>^*{ttN-j3g}W_5V#b`QL^RI$+`b=a<&uyw>=| zmTBg$4?LH!B=g9bp)W+j#^tY4mP^~Fv~zhpkKMLwhySM-J6#Wu%+~=+p$g!HB}+Y- zLBnGZd`T*iVN_1;QD|9T(Lq0kTM7ZYI454`qTbi(qt5xSQgia8<{ild>KXnnQzduQ z_dLwYt`u{=UbcfN!n;)j%Y%0tE|avn@$9hgMQ~*#(I<&&VvUg}ScA}s27k_8Hi2o# zR3F%{%)QcgJ%FOYIltFUuWViIz4%GwXmU)_2QbDSF+(c#=3%2ye0l{JU>rYMqdL9g z9m9Fjw(3{o&PM)`k)-yn4*!aSckqC4gnQPP`0gdzmFx{nEeddxj#lYwfg@dEO7Y~q z$yzQ&oUr{xsl57u-g+LVwlQ|BvVDA%Vi{Q_A$0{)oe0F z`M~EZufz|M6O$`bBy|J2-Gkbi1K_kI@=wElizceWyvbB;&bdvfh|w$y&F=a5q*wKiANnGpofGeYZGH zGR*`j+(Zn3DbIa~Z_)(k~d2OLb0 zB9gT__X(L#H-=_q!3U7Q87eQ{yLVnUk;&$|3njvimy||V`(*htx_RcEG&^H11Ik1*8cMoA z+NzXc-5Q|$ain?$IGp*&t-+_>G@-gjviRjxb7UBYXykmk@$V@Nhs}%UfcBF|6%Ptn z&u>rVBqDus1$E#AAjRK!OycI?`i}XEzv*(YBww$@FZ1j<U z5eeecDG*AA!^mk4TT2b7LlaK;QBf3`zmbxa^ojc6B$u8HUe4pg={at z`)PJ6o@J{4qJjd>S*D#-ZeGvKR?#Qxl^h{}heO$&e(HOUdS%G#ce*Pyg{*cLr4r}^ zfK2q}7jTooLf}mUIJhZ#(3!E5T78z;)&60gOo|tDkeaT1>e4xVqQe5QZ^?0VM@(NA zaX8&Y*Tah6i>38UgvwDq?!cL3#7qh}@g4@=EFKwl2rE>$ZmFjFJA0MPve87DXR|6L z39O^^NdeB_>1^IF0L3aAQ8xjWH?^7N?CdUggj*MFLT5~qEsuh1ifDPwVi&vuVOgut zO@tI<~wwzSARd##?$gf^3(R{J)kWXcCDJpV^9J7O{D4&? zP871XN$+=0r}9!IzhtYVxy>FjrrZ_iS=pxy)BL(=nFyeW5gSCwp#gjxK6FQyvpk3^ zQ^zV$C7Zr;R-jFkY!&_)f4pgXy?EhUNQAT?2M>oBM&wi8X*qLj3xE9v88ZNLs)^y| zONPqg0pZHw;$if4JIU&ZnWWRV%(xWRPuF(gOe!b8j_b=-6_OHxx#-4ONHNs42TuA* z1F#9vCYyVMqVUTbBkKyOA!2j`AQ65TvG|TOk9Cvnu+HoC8j8{O`wGjU@wdOx4hPLx zF=Vw{C2NLrcr8*wq6O?0r89^5#3u=(2e2=fztuZOc+RXd*oJqrKVMpERqCOx(_Ii! zb$DfkMg3&g-;z)_pL4R#JY6_E#w}W1T4E!yi%nL$G;M@Q@2;iCMJINa>hpIE*yQ$6 zy^?;oNb5hER!5S$2K9;N+i!F5J+}$-uWpr1BB4k-)um zHJfY685vkG@2zn80_XV0M7Uub8m~EPHeL=$(|&8dXg@zvH;R2b#sBr-A*Ices9?&S z&!~ytsSDlIJ!x9T@A`{IcDtmvhN5`LIL$OY&XLjDER*kA{mL68a}QgMo7PD8uGPR- za3UW`oviEFK0P_r%g1y_&5Z<3c^YEXbu+txlwGEdjlZoPqx zuO^9zGfK6t^EabT1EC94dcC}wh@D;qTS8Df&=fv6l$F1G`7nO!HtE8snK9bqj!hAjN1WRx|z>HVD7O~E8F+S@t*zt=&X`ics(+I z_qarBiR3s#WORZ(!yl8o*pCL72;hP0vbT22VGASL!_I{KeWbt`nx&`DeUdu+XIF4} zWgva(yJ>67elG?G7j9vzV4Xf1731tWsDn|LrG}{s`_j1sW?dr5x*r_A|o&6Rz zL!t(RRpb)}6FJt+JoAX&WWp^Im*rZtT(*nqB1T|1XLO>~W7xLv&d7Afo$fkp45fUn ze^rw6uRd0qk3+>jE^|Jiw@{-)d>s z@yt)Ni=0>)ywMp@0oxH7g0{w=W_r z^(m#+IdzvYAx)F1o1z!LmWEAcEW8uOcieBYb-7)=y4%>HCr3Q=z=(wLg9& zb}-Rky)8Mz)Ss`s==#v#AwMDDA^WlpzyRod;MY97aeSQ;%C3}pnBG@!Z-4t$2G9fz zd4p!IM_K+_iS`2*Um$=5zTir=qXmC>ogmRiJR_X;x9Me2v;Qd2@H1Pdk4@i=X>|hS zB;=Bx)3<|Y9>@5bauvhg_is&gEJSg5a4^Rjy4A^P>BpyhdT`66B_=A^lr>Yp$z56v zoPJ9}HR{An?y>bp;vaS(8yFEYWJ83sF3_Z$Fy9$jOS8HF!kE^j39faI-R z8yWzRbkMG5|T}lV1M|>#ZEq`JdJ2eLuK(q!XmS` zz0vF1C_2u@E@o>G6kM>Gd!3$b2aaN@O`dsV)Nbh%GhuWx5b zLsoJ0WW%cZh8HP5C7;}P*VYwEYp-|H`1Zi>dN7lAD)3*R$)52{?%nN!hKDz2BK7i8 zlAbHfz=7yruP(Ybmk3z9uT?w<1$R1#>HFK1%m#{j_EN|CY3Hl=LHQfT1>TSZ##gZ8 zIt3%5RdDQj`swq!W6HzVuH%ReHv4pU=RbtyF$K=yIv@*Qor@RL;2TAmSJGFd2IVZ3 z@534T4l)6URxr&J`xnijK4Rp*DlfoZWV!4voyH#{{j<*Z`<3xls4K3hulnz%=9Q$JdbcO`S3frQe_K%j zT>s{-jp7a~`zw_G)dD!-{}*oB>&ry`(-v`|{}|G+XQD{|7FVi$gh|Z*G+X$SvWsKG z7u|n9RjD9!86P{2s~yJ_Rer0wuar9j<6Y) z8tZOd%LSxG$$_*C(~6Y*?@?X1BC@Qyld%nzyPh}%y+jrNc8`%jOXsZq_z;T(XEgWe zP?X9Jf{>wc--EwQgD?0|GMNgSky)_XEqw`Ja~C$|N+r4|qP7F;y61(r*c52G!1?o}M)iaHbl=L(BXTtTDmk?^8%h7G`TcSo^ ze|vHid(@M#(#@0oBsH_V080m$VEM9J=NhcsqV za^&q`VX^}jH(6x3pv_Kn>_*U|ugW*W{8Z+5_AN?uC)Fi~2R~6=pCE306)-ymowfey zwcy>YoU^3U?i--G?{WV+vzpH>C^B0Uetmu(ulgLereJ8fU;9q;^0$t00)o}g-(TgM z(@t)`G0#2vh28#WyrLpc3R@5YlqSjOc~pF>WGXAbTzOr%P_u6!b3Q61UsT)Y+|7I% zheCnlZ9_|aC2=tL)_XEA(uzi-VgC=z?YJhMlh_sMP|d}-_I7_$@O7%rl>o#cU9RLI z8*mrIxT5a*y@)g>Bao%gQ=oi0IHG7`f9HD^WPs7f=~qs}9J2SgRj z0@HM%GqvZCjQk&Ri`ChdomvMtwqZlv3Al!%hm>g=j?m7we- z(}dQ8S#<~ES|_r0K`TbLoO%{>RO z(R$iDG#xz%5V zDj#Mp%E=*w7p|ZDPTkEI92UsHjip?c^CI=TA4cWFT&ddKWmAD>wumS#KM0CmyJdUR z#$`Bko*H{EtvlWz=Z9IBn$ZT4D`M4E;C{ zEa2NmtC`O<)@~8JdGmk3B$yk!r+ZR9J$3d}AXC(IPn-4*yf!`gZ96}`O9*T$`2ArD zsgs>cJjEbjp5A7lN$S4yCT~S)5Mb`8M4En#Av7r+PG!4ROcP23ey_z`^TADjsHxEI zyl%m>!UlA$i?O(*fAg-K{?Zd6J&Z?geQ4of^x`*w?&iOJ4S9WLak=AGWM*X!rLo`S zgYdPn(*t2d0kT}M6Gz6W%rT1Dt6wtLEhoU3K~R8h6IbP+dl-_3)F%+Op#&~~AH@>i ziU_XPRC;GV;33z6wszfma&+QbFew+CDFb&xm{)gqaHJ+nW^z}3c{u8vep4KNfZN3X z-5wO{8I>J+VEg^THWj1W!c9`cGV1mIvA^LabXoF24mYeHnq&zaqe})sv1Pd#2*{2W zB@Fk>RScfSAo5S`IQnd}S`_zMA)RwyQW4<-AOo<=7)WBx%GrOEjjA*-7FyGJ&Nwd` zi6Gp^B==TdtIAmHEg!EM!enEcp4S=_i8WBjM7{OWm+dB2*$bH#W3KA5_R;rc=|pEY z96go}y7pnX50!cUwK9uCwgN%}&^VGfFQQSwk*rp@im^i7pZVD=xak-b8C3V@I2qFFLVC;?5 z*pD)2){x}xg0N`he6r64Ir!6WcMUdX>OeYa-;ACo=XVBWg-+hO7XZUjLKmGE& z@xsqP6GikB-pvxD5nps^(=h6TK;(Ox*K+oK`BE%F*92NgB5E&`uD6}|5xC@|bLk2N zoOyXezekR}TVuKDl}9&|(%lb_2?PtQaLgUi=^r^?!I6^?wp#~X{9&`-f7Q7X>yQAK zV~;kJzW;+Apf5W;H4$ilsgG)F3g)=O%MUL{@3Y=D2B&R;Yp{kV&Vy zhD~eEcSk9<=kF+493HQPU)cW^n7oSlQh+#04L-`|x%F7^zn6-5%}%bzoFv2`_^PkF zrNl-;hj#pqXhFx@xNkb;0%ju^0kL(6j8pS8y>$Cw^~XB;1&9#fy>Vi`V)gf_N}arq zMX99TO2p@33Py844T8LfkK*%Q_tU)OBhis%kPCe(qV7nz%x+H#nWSy4k^RJua&2o; zkOSJ``B%?GgdTrm&PoYgVx38I+0?QnRv|Sx1QosNNjhhrrLL;lrcHv;ZfqqRbtsb- z>wE9zj>3MA+>1bb;b%2oaaFlA)Zj2(^Y9pho2N9}d^qJit)5g60akQC^6dp%*w{CK z+{e#~aFfcG@b*IelzAf!-2*^m%e-;4M&UkEL%%$N`bye9@A{uH`|1}4OKfuChekmj zseAEK%pjd{#}hV6uvKnq@VVI{Q$b?usP(VWVp{97Lz8IYBbHO9XezF;E7j5kO10Fp zdo;R$OW21E!p-vv|saktTn(G;qjHF_07$thbWB zJBzoMT4My=5(2DEAPC-{=GSIaFeI%H!-vHw$@R@8nM;(9V%q$4EW~d>8KIRLH&eU# zN#T`09F&Hin6m7$JL%4nzVvS9>c$VDiCZkqm5v|5GQvtPW|}=qkSYCFr!_16l_U_q zpRB$Z<~v$%JQqxCDh+$%eX^gKvHat#ueEpKo-L6+I5#}CnzngzK$XqZDlmFAL}KM4 zUsfP>m0-QuQkUpGZbvaV3}O48hKvYdVV?Uv4kXO)I5G?sG!v+ zQOSxpO0DM@m&`E-;k;~}A~_2${DXcFM(P<6$2)ykX^#cC@hGANo2+qi^&YIslg>@q z_~{=@HVvb00e>QRE1LZ$bMm0h9?kR>MZ*B}_rv1Ot1iiKJ4?*|zLlVfQxAt4z^!@u zg|jjDSgw30OwSlAZwj)UGbsLX^0b)Se|IKxfOyERN#`3~QCrvx=@}(1k{;`<6_9WkshQ;L<`WCdI02Eup?iawgg2NpC+tB5 zV{(RI$fsAj}4Xj0%$J#Y>=~T$6YJ-f zT529ANE$ZXBa`K0Yf)LTfH+|04}UYPCdh7(;mbYv(&;JRQbjwBi!HPg-7~Zg8Q{^@ z?!Ek6ZRt5MDbQjG|I3@nBcnRi*4Rp$l>@&{@1(H+3C{zh6|shwnsB9w-S`tcN3Q^cB{wG=5i@R05@h=8^r%t;V^;fAWWf#}ab zdSlGLs+piKNf@q=vUU&1cf}R)Dx`K}NTjOsW$EblC91*J!cS*oR7soQK!vf!TEFi! zhjh!}a7fr7b!C9jRlfyR;1*7s-RN$Z{M&WZ_kKY_wqw=QH*f*JvA+5R{<|uRHhxsX zzbl@Mi~ds~2G;9J!vC!TF3fiLPaAkoqP88we;Nn#U;Wbx2BV3&x4w%x{$Ju{urOJK zNZvnhz-bfzf2hb3@Vy~ZvHhN|gKjW<%^CC-<^<^ShswwK8O+MvJ|*;FBXs(l9=KC+1q7o5cJ(-IXJ0jQ6~Wo z&Nh>;)kdacLN!Uwt!p;)($kdxh7uvk{g~4-ob*&QvOT9*r|Gu!$aK`oG&!ov{C=5%V$TWoFo4js(SXt zPdDaoNNi9Qu6fipPSKW`xTrCE-6J|?(Rs;pOwFj(I5vcs9?r?4Za8W+GQ!MM0jsc4!(BnRJP5WllrIYd-8F*giO_mUg znS@pEjV7?WN_T;CcRE?&fa_AOHnHPsZXa4D9~5JUo&RRg`hLp!%mb{JxANw;IY;X~ z{BeNGm=*Og53lOFa*BTAxa4d0`#D+OPs@r(dLPSzK?|5k392VIHEfVup^TkZU0g{! zS-kycyfP0lu@!@e1e{zO%_{T5F8S&P#b+J$Vu{4&>+(-*X zu1=YYl2V7_VuzZ{0WP20Vtkz?23F+h3DSorQ|@- zi9*?3W7zrBS0ptnIzV zwJ?!2F*1WP>Yc7D6-ivO->hpKPUK{MMSx&|_$Uh}AMGvQHP5nkDp4aCA63rWA5NwF zal@n!O@0Tlmg4m9{hHx)o-(jbBU9}qO2`#)jsDk*-Q!)$1C^r9#t7lLjPd@T7P_!l zMmjb|KD^z=;b_vXxnNyGM}K+VhL(QMO}ILj|MSPHhAe*9>fSh$T4x%5Hp0)Ke(ME) zZE8N?FcYJx_H+1Z1C%C=IX)=+5yLHAm-{!&fm)y~0qJ6wtjqtQ-m~JGbcmYmqp(o+ z`cKCnti&al<(=2=Q;DHkebypVF<&N&?2iwCIamlt2V81}@Kp2&3B+=z)(Y*3_7Mw! zW(K&G$lBt+;=Q@$1YH#AU8_pRttLKf5mF4M_4Q8Qs=?CM>R2u|x!B?~!TPi8itY=v z&OlOvvqBf=8YE~|e)7q4!W(+zSo<-358f%YRkvnApDy5j;5A+ne)1qv7{;-!U8nT@ zPv+5j6t_|+xn`*@Rb0qr-HE`c>8wkPdqh57LJG{>=AqWBR)d&3lL4zWCVZHLuS%ag z>gYxuxTd<9yQ&dir3W&MHndzG^1(`{K-XR)!@*(A<;HXnZzKBsm^)_cw|XZE{UN^3 zc4(I5DMdg+K1Vq*?ea&m{z=66TRERg)x&xHii>kGsZMo%$L+*W2fTPhcRj0NZz;w! zVN_)@C6$k&FWacccA`pZj+cQ9i(k|WP60M=eQECK=b;H$l&20mnNIWGpmJ*2HCWD} z(!u?Rclgc>I3h(%5Mw{)_LjLTIMBfIOrJw&PDNh`=8oTY2~v#VtOS0#0!aX4Q*GxQ4aFV&|bRNvYzK0-c%pTTMeZqWF_9BE$n%Qj!eIw z5Ew)WK8~ORd&wDA(%aU`hlbpcN*RM51-&Jd40d0yw>Xu*YHSeLyJY{7JY^0nU&?Jq z(F|CvE`E>0~YK!&fX zBRao=wV^cT4wGfkvN~IYNwbY-%UDH=Yc=|PYwPMX&GPl-*e@N&4U%sAkd z-XS&$r2(p;i3e^;YVs}ZSZ(frvOAzFA^O`qfQU8i2gNPHw$5{3I$Ho3F~QM zC%u09*W8o#0{AmUqmTEwZ)h3oFNClN-RBkX!=l~Q=AJJ z>ur%{e&b5gmkhe;wspAc=1d^-MZygAqFQ^t zG0})A<~lO%<});fBuo<&O6I*rTu8hpQjKEWh)Vh<5#BixbXMfjQD``m!yw|aj z9GAOvcQt0@M4pD~fD{8wP{?C?1efB@I`Z$_Re6?Dvk#*X43{+EE+0jj5i-)9y&GMk zVNBi#>Guf>s{S1ishOkA-K}I+zLsngYh`7Yl)e^BA9ElmRS`!mTpaTi#tMmC!}dD) z=<#O|+lMteM2MsT#*&J{Bbkz5js@&JOD1$%g_pw{z~3Gj?-9+(8$6J(T&r1EB#1P6 z1?M|(`ly0G39B%*mo(T&M7ou1y)Bgl`PF08zUdSn=m|?9DYGD7{&pvB8U+rx;G(^% z)gRtgc_USZ-)9RZI{M=9A^uz32EAfs&E|P({duckeRNHdc$e9E`uy1u4lHlxqKXbBsPcJ$lNGrXxY*u>P0o8vUM##F_gj!XQV*R3g@}7*nbxv6hw5P zBPi}Kb|#SQ3Vg;ffp@}N+o+=MR>s0?^@JNpSW{wK?eQGj&W{n${9;F5zHgbe%cwwY ztje-Z^&x0vNE|#`s3=UgdwFaY(XL)cx8p@B)nC{*`|<0M`ncO$+g0TsF+o^}_BB); zK9$rl<=o4tzw{lx7O82l9{t^7u6>(PMBWQ|WDUHyVWXDS@;jp0*BIHnf|c#d>#&IU++@@5`hm^@?^gxSzc?**v>h2QEMj9C*a+wbw%0p-iIKRh zD^fIf3(s#JwMg~@RPT^po+?8ys`F8VAi1)+GF zByW%v2GKBR7vqDIIkA6(9H8i|0blgwAqJ1Ke|AKrPAa1*O1WXsv`|*gIX6B&&vQE$ z;R`D3fThbQFaX4EeAJ;tR$#i``Y{h(T=bsDutiU=2Ct&A1@Uv6-H^oVT6^I=6i3>9 z(y;Z(HA-qu-v|TCF_a$BrQ9tV3J?kUXb>!Dv)t?J&m-N))*J0sgy^mN<+CID3bV5p z35K10R<-OIYP=Q^3Ay^SV)sA{jlLfR;txCLy|Irc9d%FIxu`g1RjjWIKguanHMvoG zPWou^f=$08fd^wW0IWMsbgxMyMmh*GB@lPzd#2`9OA_jT7YRO}DOOysxZLrBz-jt+ zpF~wFq#4O1uhFTl?ItcK?3wc;)qgb-di}l1_;S}vdtL)^z%Fo(q4nCZC zPtq)DrN`m4& z&4R2klqrKh5f6F;+AfhRK<&@zDN%(t6ErBQ_8M#=T~mh;i}QR{ncXl( zD8bX4BT%9Q1PVI3YBu0CZ+76;J_47{1KInPeClCZg;}C5!0DrwYguKf?X!qUG&Y!i?ii6^jhh+}c z6NcPolg~X$2f$Ciiv*nPk2oV_G}6oECT~YbN-B`Cn{l3ACUQ7q?gJi=itH9~OQwlQ zGYxu-mD6IL`uoJxE}{WLbi_S5YfolngD9m=@Q0a>ITDo=u+`<1g3E0dhKav5%|GX!vmK(|a`>fOz0Nntj^3*H0fI0ZF z-N^+d{K9Vu$X|%wyAUY+)2iiO{9m7a>Y1$nx=mO46q7KxH>+N+J@ldOO>X07%ib~6 zGLUcqY&fYGTyL}2pY8XnQ>t!1VIbY!gb;lF=mm1EcY(9WY9w9_%@-nBt6`N)0O;QJ zh)Kh-51*gBtnAB#fD3w+D?$_qFOe6bSEBD%%f&|!$$R#9Ft!RfJ#yH(-)X&0*H5Yu zDL_hM36Q(`An#BM)W?qYEOTrx)Z;DsAa_?}XQkK3jr_at1v6bI)s6td0|{3q%<7?U zgl=xq+&?dPf*)_^2n^{Uh=;yL9uMJjbZ9!Aa(|I8TYjE6guKN%BNBiG7N`JfNUdme zPlpx!cKoIr{9a&KBfGxw}r2km49-sdTSwuSZR}pFz%anZC9gBWA{rmfBo-j@6gtyKy24E zzWt94oMmC>w06|D6KX1`xEH}cK1ne}SecmiE_^)zhG8?(hIm55leo)!!#Z$ZqQ#?> ztX&X5Mn=L5CiA#7jGM|`mI;4;t#V`&J03cjFNqdAmC`+?;)jPv?v4&1X!S>qhMOPj zV{S_;(Wb)KsicmPbQwcWw6&kfhrwRDJx@qQqwKBVp7xsg|X%$J(5~nJ9RSCgee}eVXA?Y zI>;ncOxrTWg{M)hb+@9FJQky+8*6?8WaQ`3@az*K5F%VAM;y!I&5f^466RlC z07bVSF>AHyg_FMBDS4dH{Hs>A@|msUn{5P{((&%VQ}F;nyV+H7Z6o*h5Quu)y+{%* zABCw3l|_Q$+0(?i0+rkeR347vS=?8~ls507{hOOC(@)!nFIms}j$0Yv_q&9Yo$CP7 zVs*34!0-`PG0^elk(jK}owvgLII6QC-@Aq+j5ESj!sB->b>!ea3i`NHk62GegGLHI zN+P07<|At(xF0Xm0o)bMBk{2N3N`2Nwd7ZND)ndLdGthE>?4B{(l468fbla|>-dG=ZjO3(|28K-DIQ?CV%q(yB0%_Q< z5$~i7?K8=K3Mnx2@Sv#5@*f+}<)H)%1y9n4CCZWP?<&T6B22Ecu!2+7I&-ggJT1uJ zaEnk^`ovpeqCixXj(HJ{e-sxa*hP|CxOo>N`^R|C*`OVvx(&wEpg=&%zY#IatPg6}k> zN#DNep)U{k^NHmbOlo{g1>Lnu7OY5gX}s+VLTzV||Hu z58v=^7ZN(d?gT+sfBGYi>xQWeeA&VM@i3A%R;wm>Kz=OHEnPBX(M;vRL?hqecu0Ba-_dj_Y$2X00=ff_Kgg<`o87Qtv*UHQDypk|s z7W>;ga&!e!t4@;;z;W-r>U|#nF?hm0$SOgy+Yg0%?Q<3AHl~G|JT96Pv>f003Q1$F zgc7Na|H4L0wOs_avV#|=eeI8Y{-|qk>}2voU;Y_=A`^fiu>1*om;MbmYj1620D;n4 zEm|Q7R-74(-*_Z7l+JnW9K>U!s^T)h7QQ`0QL6;GITA&B*{I#5{Jg^#ta)7u+hbzeD9-;nxLx4;c?)Lk&ak5dT7GB^&EB`LM?e}Nm(ND zoZ^d^-Fs`MgiAbTP0PBqH9vt#?Nm!%liDqSPe0QUF_J(&BO}eKAO1L6B0+#G zkmj^LI$(<>%(&`icMU#5>}@of1EtiEpZX0b@~k(2_kRW6iDRY*#$vLgB8G5HKlyqo z4X~DkuJD^ZMDoi-Xv9^>QaJwf6O(4>kK0^)Z4Z<$y-GK3BV89OM)l=U$6og!i=Gw~r8Gy$>_KlM3aQ2>3xJo4MUS(u(Gd%|oKHIO)mM#cLuai-C zrO_LXP?fXQaZAVvyzgm(Knc}quuwj~=i>W|-<|nJ1F8>R&s5bI)ewIMhRI8*OOb4f z8+okP&=SiZ5)LBL1fUiw-*aG>riVB_*}kVg>zs~<)tU0)Y-lug*2n^N_4CwRGpq|Y z$~oCmsfFSlAE2tP{e@`gI6J&dZzg5HOM(21#NT~X^(UiE;Qa9?%v!5u_OY3mKi;-> zz*_FmfHi;$!=_+Vfp5Eht}5OBi<1QfF-*KknGwlkXf;M=HJ@CPJbWM;`=5)7nXy_l6R$=**t>#+jYbO zlU`9G^~*v9|56^dL7yi99V6#88*6swj?pA{hHok=)%M4$iY^)9a^x<-)!6x>!{X^W z^w9O3?oGWoi#9!TWQTve_G;f;X-mR@-JH&N>-MHjndkXHPx=QNMl)Bt&{{h^>cY_G z)A!wHwlDV0|!=@{hhIr^8ag7PLi?$dg+M$H0}R=cNw@6JZ)*I`wtC?|1L z2P#~kryg?1~y*TM?B$MkxSM1eZ1q{pi&i@sMsw6G+Zyi-L#xQw59uvXV zzArHB(9Lqfr)}aNNiYNZ<{I)1CD@1#+ks}!FC&Np6zyy+#!fD z;@B6)fS&Y+!}s``-xqY2w>uEd+jM@d-pF*zt~&FLCf%e@7qUVkCJG25t;A3Gk@kaN zXcqA;Rl~a@fPVkQT>Cz~(JN9>ad6`kqE8k+@0M_AAjS?AfM(V|Hep6?KyHHT39+s` z@EJS6aQ^GU`%d}~Zd#)L|Fs$7-m*Yv{9XrNz@&c~lcLYeCt4Z?*ukp)KZvVZu9>in zTHk7#PyY+JnB;w04=pZJ0@3)Vwf{fFv;WzS$Qgir4p%O4Y;YPFKF%ht)Mzy%?{MIZ zFF5->ZfRd6*YtN=T>LDAdrTi(4EO-?5)*K4-QM!5Tq8jeKnOw=%VHj-!c=DTIQ;4_ z8)ho9{x5=42S38`IO&WP4H7YB^@Or{rRR^V{wisSVu=Q{aH_?HYycC=dMh#soHi`| z8p3jvZJh*+W4WV~ya=nkV3}jso@7~zsa%kKi1+~l zNh1A6y`w_i-vuD-9Arup|MV|O9dpbje1Xue;l>8lOM)(I*?!nlynbHjnm)53R=kt6 zraD{h3Nl!UF!xv?sXIL{C=FMe2a=#-rN`f{dp-+by9Fu%ElR2P?9;AUD;;HXPeGBv ziDj=&!nV$Oc@^;|?{eW!IpM`>qdvdS)HlS&v+pi{7}mp!kI}BpgwrVLcxRKpxG^Eh zz-_S+?_FdXRAgJZRXA2@f~NG%W3U8b*;<=?IKOSIY${6P_2EzG2m!+kVwjOu=r;8| zu`OTU)#yB)Qm?vK1bHWQm!Bib2b3V{WA05=q9u+le$#(2=x z@ha^=Jpz)_|60lZ7J_;jnyv_uhr8J4Xp_W>9Qzjar&;2Hob*7?49uhAjVvl$rcQwsi$k?nn{VOiF-z;5la#}8^jN)bGCAxkKYhT#6)^Q+9xLw3nUvxIjsw(C zn-hN<#*lj#qTzAZ<@AlD214Mrdqkt@#~5cpOz~TQm^6YC74~h@_nJ*UQ9P#B1Xv+6 z!%F>aLQENu`zM+j6)Qn!uBEC}Wl8ompPkAc?(llI%m)um>g9#HCx5WQU8ivpR+Nlg zD1`7i9~+1cW*pw1T|!+Yla^VO3vz%o(m#zMqq}JaOpYJE#%q3o2Y2N>G z9LdEfHYPocT^A9n!pL6pOl00*uivg!tGaj0)@o8{$=s!tX<3dl71pub5P0=6X;a5{ zLUh3S5<9nTF8!h0b;S;j%(kR;^8IE9E;@KwzSb*Uw=Z~>-(#&}+g7HPc~)?-vmAIx zH~_#Zb75lE!-u@_Wu$&tmTyC!f{h#R>2R{I+XFaNto|wkfL3}(o1D}2J4xzB(&PeUnjCt=-F$}C(7#&vi%uF^4?E|c=6}ZXQ(YH zdcMkA^Ks8us%N+(@*=?-I_o%$85&zevb4_uo{?(XUa{(w4b1(Hw(|+Ug07$MhS-w4+Ngn)5Zh5Ojoj4o;=QlV5Q z=@v}ov)&rGF5LAl-EyH-ZH?YAjb{Ze^V!DwI7oNsyxXeC<=x#RM+oDQNquB8W$VV& zvqxTnNmlT3L&ZOAdom_afz}10@+%0=94qUEQ$4QP(vh9!IqeCD z`0xj<_L0Ups)wJRHw0VNV?1NXB4Mri_`0|uI<_75p^;~xc2{?=#9G@BrP;bDMdR^M z>=)Zi-u$&^RX4yd!Lxw|a~+q@WYko|cIl@HmYpy>Kn;qRESa@8?#!aTJ`_0D5MCTlXA!r> zA|yUZ@3ivGkzagxF$5>xSDl>Lb*lD-8bn!dJLy!MgM8OBamvxWoO)$7-Huv^*79#yD)UZrPk%`K}9+_>qNt2ZDdu0sN79bo0 zd*pop=V&s-OLm+G%-jjNw`k>o;o#5_iiiwlf9**KGdT{SSKxNyWg=BexN#(6^wi6c z*EI@bXPX%kiPxDa`{iU@Wf48_K0`i=UzIYVe&6^rLTytniAf0kqc*9Y+Tj4cQ5D58 z%7S60niJz2?kraHhuLI?xVCWS@@&cYHQz~coomh9D{TO?v~8|ngGQyk@$NUfV}_(30#AK*@>cb?2OWliB30vSIgG)$jF4#QH&h#Xo+M@y50G;}W`5j_5_p#3gHf{2}T=^Y+ob*oiY#!gk= z_4G~`A^Tzz4jDuYHkR?{s@2;rAbHhY96S2UiBgtJPS{V`FsqK}{W9ROA~o0))Pirqm_KMH*r z85c&&c$LCaXG<#08NK!7jtz3$dFBBRnE$<$S+jvu@6Zs#Bc#BK9LxnbcloaXww)=T zyecXBij|m=EKZy%*xl*62IMkxJB|ISykuoJAC#9&vp?utFJs+lj}oW?s_ZE_vK?0I zP<#ePZ8bmQ(I^YMwL9u>OjFTUCNPzM6Ej@v?Ui#NSC!BJ-tZa&bMTjl0$Kd zMm%F-m7Nhqj>dM5X1ZOPg$1VWc;wZVn2}!{zv`#k1cIoDgPoST!+!XudPVQeT<%F+ z@*Z;ySGwExGZs~BiAP2PP)*P?dfoJGW)sJi@bJey0+zY;s)&MZVBTip`tIp4?`I#s z>oA?hBNzDsRj&QBX;H`bCHV9zoYgW8Cf{lnkQvV_7AT=f$uah2IbM$~6`l1UM%?vM zq*P7IhOpejj~^7?+JWO;)_5QOJaPsjuC&&h{ch}rwBh_0i#J78$3bZ@pDve=8F_cT z@O4W-5uI5oKJ)IemmVnm^5CsGi}XX)d5407IO<0+=shjo*0wf)>)1>IKwI_P*tYJr z561j8twwM;J>I28$a1Lup=GO1n3$StQ4>Vkcp(9ZQ$uQjRtuj@^%dr@HL|%W?KN(j zhTOZ4j$NwSDk%oEuFp$>@0 zyRN6&{$ugBF$1*v*IyuaZIY5m*?Fc%gWE}-Q#yyT7si1q)x$IWB<{`s|k10tW`{q@=>)Mee%PCOMv2X2DVv& zPf7^ZP+~qs5-4!Fv-~mNp>@BXM}VfU{l#8H)w-`J(4fBd+rYkAhzrqoYBHguf|dNT zHi2=t+;j7&fk)-7lY#7_sE3-1FkmAfPZ&1)vBY?W(h9j1naF$x=Ee>?R6|_384#i_^Zfnt;-wwuw}g&c+)oKT{Scb03{2JkHZ=Lx z$6KMmX!&o8<^6oNB2Fs+&?WyiPZFm8GGP+w|L1`uU*Z0cZyk(&9j81wzt~*+zJW%i In#0Tg0Y#?lB>(^b literal 0 HcmV?d00001 diff --git a/img/efficient_memory.png b/img/efficient_memory.png new file mode 100644 index 0000000000000000000000000000000000000000..b36943858f22f40005d4632d0403a1cbe9667a88 GIT binary patch literal 40017 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 Q`sbYTGYy53r)EL_0dhXES^xk5 literal 0 HcmV?d00001 diff --git a/img/naive_compute_throughput.png b/img/naive_compute_throughput.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d8b45145f55668fb017f02506d7a355444bf43 GIT binary patch literal 44985 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

XO4r5Nzm(lMs;f2d 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�rtie6 zYo#5iB6D;W_oMjroY1!Y+$QYlcp54!rK%*(-7_{ws8=Pir9P zpvldFle6SgY4)i>2f0HRpM@8zbjG8!<9h>q>=^7cA5`Qvta(WLAo&M_X~o_7G_p&d zi0K-knAxNx>OL$qcM&jk$^u#Lo#x$+q{;=$L<4l4S)TP|^vBk7{X}pu5O5U`F0b2XuF literal 0 HcmV?d00001 diff --git a/img/naive_memory.png b/img/naive_memory.png new file mode 100644 index 0000000000000000000000000000000000000000..4720123189afaba2a610936f146a258ea0ea1c9f GIT binary patch literal 40609 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 vNalhjSz_8 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 literal 0 HcmV?d00001 diff --git a/img/naive_occuppancy.png b/img/naive_occuppancy.png new file mode 100644 index 0000000000000000000000000000000000000000..b0e8780d2109b02afcab6df2cc0c51a871457051 GIT binary patch literal 45982 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 JibeE&{|AzIlCA&% literal 0 HcmV?d00001 diff --git a/img/thrust_kernels.png b/img/thrust_kernels.png new file mode 100644 index 0000000000000000000000000000000000000000..c1de82311633a01ded66ce73ca39e6615444c18d GIT binary patch literal 31304 zcmaI72Ut^0{stOEL8PfDRY0UkmtI5fy$A?M?_HXd5I{i?0clbNLhrqIM0)Rp8l)L| z3n36nF8+7F{dVu}z4JWDnK{q2^PAt9GxNUhglnoR5I&%M00008l@w*Q0RY^}+j!)C zoZEjSp8)>t1oO!nIXD|Kh;;G(Yt8=7ZY&ogik*rUXBChCJn`a7`CpYP*-XQe8(EDb8t zm!UVDGj5HT`P3aGc1J6-Id`RKNApXQEEOb1d6>hgB=RaI;!6{Y=?*EB=q>OaQJ6=( z;+|)-QArD1#pVciU@1TRtw$L@6y|tXgA!iRmg^`7%lXWLEg~(bsj2gZxH{ej-~c>vV@v_XUG7~xU6L+;6#@VxbzgDe|LC?D z`el7W^7rk(Vy`-X1pQkh|Gb?^AB08qSC)TWB^3bJ0{=?=6$$zZz;XI3@%NP)i(u~W z)IVaXI5uVZ9sWpN^w3PrDHfoan7k6}|COoVI;OrI&Dxf#WYi-_Egwic@(?q!wXGkB zJ^tyxyDCZHx}Ux1(!!zE@>!r�@rDqlaN^L+_Zzd0f&PP1iUJXA=X)!T+PA?%bQ! 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