From 026b1007ce5c76bac962778c7b8e49a826f4d8fb Mon Sep 17 00:00:00 2001 From: rcj9719 Date: Thu, 15 Sep 2022 17:42:52 -0400 Subject: [PATCH 01/27] Naive parallel scan with failure at index 129 --- stream_compaction/cpu.cu | 43 ++++++++++++++++++++--- stream_compaction/naive.cu | 71 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 4 deletions(-) diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 719fa11..ba35218 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -18,9 +18,16 @@ namespace StreamCompaction { * (Optional) For better understanding before starting moving to GPU, you can simulate your GPU scan in this function first. */ void scan(int n, int *odata, const int *idata) { - timer().startCpuTimer(); + //timer().startCpuTimer(); // TODO - timer().endCpuTimer(); + int identity = 0; + + odata[0] = identity; + for (int i = 1; i < n; i++) { + odata[i] = odata[i - 1] + idata[i - 1]; // exclusive scan + } + + //timer().endCpuTimer(); } /** @@ -31,8 +38,22 @@ namespace StreamCompaction { int compactWithoutScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + int nonZeroIdx = 0; + for (int i = 0; i < n; i++) { + if (idata[i] != 0) { + odata[nonZeroIdx] = idata[i]; + nonZeroIdx++; + } + } + timer().endCpuTimer(); - return -1; + return nonZeroIdx; + } + + void map(int n, int* odata, const int* idata) { + for (int i = 0; i < n; i++) { + odata[i] = (idata[i] == 0) ? 0 : 1; + } } /** @@ -43,8 +64,22 @@ namespace StreamCompaction { int compactWithScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + + int* mapped = new int[n]; + int* scanned = new int[n]; + map(n, mapped, idata); + scan(n, scanned, mapped); + int count = 0; + for (int i = 0; i < n; i++) { + if (mapped[i] == 1) { + int index = scanned[i]; + odata[index] = idata[i]; + count++; + } + } + timer().endCpuTimer(); - return -1; + return count; } } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 4308876..bb32522 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -2,6 +2,7 @@ #include #include "common.h" #include "naive.h" +#include namespace StreamCompaction { namespace Naive { @@ -11,15 +12,85 @@ namespace StreamCompaction { static PerformanceTimer timer; return timer; } + + //// DEBUGGER TEST + //__global__ void kernTestDebugger(int param) { + // int index = threadIdx.x + (blockIdx.x * blockDim.x); + // index = 1; + // index = threadIdx.x + (blockIdx.x * blockDim.x); + // param = index; + //} + // TODO: __global__ + __global__ void kernNaiveScan(int n, int d, int *odata, const int *idata) { + int k = threadIdx.x + blockIdx.x * blockDim.x; + int offset = pow(2, d - 1); + if (k >= n) { + return; + } + + if (k >= offset) { + odata[k] = idata[k - offset] + idata[k]; + } + else { + odata[k] = idata[k]; + } + + } + __global__ void kernInclusiveToExclusive(int n, int* odata, const int* idata) { + int k = threadIdx.x + blockIdx.x * blockDim.x; + if (k >= n) { + return; + } + if (k == 0) { + odata[k] = 0; + } + else { + odata[k] = idata[k - 1]; + } + } + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { timer().startGpuTimer(); + + //// DEBUGGER TEST + // int noOfBlocks = 1; + // dim3 blockSize(32, 32); + // kernTestDebugger << < noOfBlocks, blockSize >> > (2); + // + // TODO + int* dev_buffer1; + int* dev_buffer2; + + dim3 gridSize(32, 32); + dim3 blockSize(32, 32); + + // Memory allocation + cudaMalloc((void**)&dev_buffer1, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_idata failed!"); + cudaMalloc((void**)&dev_buffer2, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_odata failed!"); + cudaMemcpy(dev_buffer1, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + + for (int d = 1; d < ilog2ceil(n); d++) { // where d is depth of iteration + kernNaiveScan << > > (n, d, dev_buffer2, dev_buffer1); + cudaMemcpy(dev_buffer1, dev_buffer2, sizeof(int) * n, cudaMemcpyDeviceToDevice); + } + + // converting from inclusive to exclusive scan using same buffers + kernInclusiveToExclusive << > > (n, dev_buffer1, dev_buffer2); + cudaMemcpy(odata, dev_buffer1, sizeof(int) * (n - 1), cudaMemcpyDeviceToHost); + + cudaFree(dev_buffer1); + cudaFree(dev_buffer2); + timer().endGpuTimer(); + } } } From 724b088eb9c52ad73249dc4867e605b519b8295a Mon Sep 17 00:00:00 2001 From: rcj9719 Date: Thu, 15 Sep 2022 22:27:23 -0400 Subject: [PATCH 02/27] Naive scan done, bug resolved --- src/main.cpp | 2 +- stream_compaction/efficient.cu | 27 +++++++++++++++++++++++++++ stream_compaction/naive.cu | 7 ++++--- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 896ac2b..04c4def 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -51,7 +51,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 diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 2db346e..fc7d39d 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -12,12 +12,39 @@ namespace StreamCompaction { return timer; } + __global__ void kernUpStreamReduction(int n, int *odata, const int *idata) { + + } + /** * 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* dev_buffer1; + int* dev_buffer2; + int* dev_backup; + + dim3 gridSize(32, 32); + dim3 blockSize(32, 32); + + // Memory allocation + cudaMalloc((void**)&dev_buffer1, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_idata failed!"); + cudaMalloc((void**)&dev_buffer2, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_odata failed!"); + cudaMalloc((void**)&dev_backup, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_odata failed!"); + + cudaMemcpy(dev_buffer1, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + cudaMemcpy(dev_backup, dev_buffer1, sizeof(int) * n, cudaMemcpyDeviceToDevice); + + kernUpStreamReduction << > > (n, dev_buffer2, dev_buffer1); + + cudaFree(dev_buffer1); + cudaFree(dev_buffer2); + cudaFree(dev_backup); timer().endGpuTimer(); } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index bb32522..fee7b2a 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -76,15 +76,16 @@ namespace StreamCompaction { cudaMalloc((void**)&dev_buffer2, sizeof(int) * n); checkCUDAError("cudaMalloc dev_odata failed!"); cudaMemcpy(dev_buffer1, idata, sizeof(int) * n, cudaMemcpyHostToDevice); - - for (int d = 1; d < ilog2ceil(n); d++) { // where d is depth of iteration + + int maxDepth = ilog2ceil(n); + for (int d = 1; d <= maxDepth; d++) { // where d is depth of iteration kernNaiveScan << > > (n, d, dev_buffer2, dev_buffer1); cudaMemcpy(dev_buffer1, dev_buffer2, sizeof(int) * n, cudaMemcpyDeviceToDevice); } // converting from inclusive to exclusive scan using same buffers kernInclusiveToExclusive << > > (n, dev_buffer1, dev_buffer2); - cudaMemcpy(odata, dev_buffer1, sizeof(int) * (n - 1), cudaMemcpyDeviceToHost); + cudaMemcpy(odata, dev_buffer1, sizeof(int) * (n), cudaMemcpyDeviceToHost); cudaFree(dev_buffer1); cudaFree(dev_buffer2); From 3a6edbaaaeb0ecd5dd35a5656b7c3802c46a190c Mon Sep 17 00:00:00 2001 From: rcj9719 Date: Fri, 16 Sep 2022 00:05:25 -0400 Subject: [PATCH 03/27] Work efficient incomplete and buggy --- src/main.cpp | 4 +-- stream_compaction/efficient.cu | 46 +++++++++++++++++++++++++++++++--- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 04c4def..a79a458 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -71,14 +71,14 @@ int main(int argc, char* argv[]) { 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); diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index fc7d39d..2d4f807 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -2,6 +2,7 @@ #include #include "common.h" #include "efficient.h" +#include namespace StreamCompaction { namespace Efficient { @@ -12,8 +13,32 @@ namespace StreamCompaction { return timer; } - __global__ void kernUpStreamReduction(int n, int *odata, const int *idata) { - + __global__ void kernUpStreamReduction(int n, int d, int *data) { + int k = threadIdx.x + blockIdx.x * blockDim.x; + int offsetd1 = pow(2, d + 1); + int offsetd = pow(2, d); + if (k >= n) { + return; + } + if (k % offsetd1 != 0) { + return; + } + data[k - 1 + offsetd1] += data[k - 1 + offsetd1] + data[k - 1 + offsetd]; + } + + __global__ void kernDownStream(int n, int d, int* data) { + int k = threadIdx.x + blockIdx.x * blockDim.x; + int offsetd1 = pow(2, d + 1); + int offsetd = pow(2, d); + if (k >= n) { + return; + } + if (k % offsetd1 != 0) { + return; + } + int t = data[k - 1 + offsetd]; // Save left child + data[k - 1 + offsetd] = data[k - 1 + offsetd1]; // Set left child to this node’s value + data[k - 1 + offsetd1] += t; } /** @@ -40,7 +65,22 @@ namespace StreamCompaction { cudaMemcpy(dev_buffer1, idata, sizeof(int) * n, cudaMemcpyHostToDevice); cudaMemcpy(dev_backup, dev_buffer1, sizeof(int) * n, cudaMemcpyDeviceToDevice); - kernUpStreamReduction << > > (n, dev_buffer2, dev_buffer1); + int maxDepth = ilog2ceil(n); + for (int d = 0; d < maxDepth; d++) { // where d is depth of iteration + kernUpStreamReduction << > > (n, d, dev_buffer1); + checkCUDAError("kernUpStreamReduction invocation failed!"); + } + + int* lastVal = new int(); + cudaMemcpy(lastVal, dev_buffer1 + n - 1, sizeof(int), cudaMemcpyDeviceToHost); + + cudaMemset(dev_buffer1 + n - 1, 0, sizeof(int)); + for (int d = maxDepth - 1; d >= 0; d--) { // where d is depth of iteration + kernDownStream << > > (n, d, dev_buffer1); + checkCUDAError("kernDownStream invocation failed!"); + } + + cudaMemcpy(odata, dev_buffer1, sizeof(int) * (n), cudaMemcpyDeviceToHost); cudaFree(dev_buffer1); cudaFree(dev_buffer2); From e090c058986236833a4e3bb49fa4e479c429d2f5 Mon Sep 17 00:00:00 2001 From: rcj9719 Date: Sat, 17 Sep 2022 19:14:16 -0400 Subject: [PATCH 04/27] Work-efficient working for powers of two --- src/main.cpp | 2 +- stream_compaction/efficient.cu | 32 +++++++++++++++++++++++--------- stream_compaction/naive.cu | 1 + 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index a79a458..0f2e66a 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 = 8;// 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]; diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 2d4f807..cc0d7ef 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -4,6 +4,8 @@ #include "efficient.h" #include +#define blockSize 128 + namespace StreamCompaction { namespace Efficient { using StreamCompaction::Common::PerformanceTimer; @@ -14,20 +16,23 @@ namespace StreamCompaction { } __global__ void kernUpStreamReduction(int n, int d, int *data) { - int k = threadIdx.x + blockIdx.x * blockDim.x; + int k = threadIdx.x + (blockIdx.x * blockDim.x); int offsetd1 = pow(2, d + 1); int offsetd = pow(2, d); if (k >= n) { return; } - if (k % offsetd1 != 0) { + /*if (k % offsetd1 != 0) { + return; + }*/ + if (k % offsetd1 == 0) { + data[k + offsetd1 - 1] = data[k + offsetd1 - 1] + data[k + offsetd - 1]; return; } - data[k - 1 + offsetd1] += data[k - 1 + offsetd1] + data[k - 1 + offsetd]; } __global__ void kernDownStream(int n, int d, int* data) { - int k = threadIdx.x + blockIdx.x * blockDim.x; + int k = threadIdx.x + (blockIdx.x * blockDim.x); int offsetd1 = pow(2, d + 1); int offsetd = pow(2, d); if (k >= n) { @@ -41,6 +46,7 @@ namespace StreamCompaction { data[k - 1 + offsetd1] += t; } + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ @@ -51,8 +57,10 @@ namespace StreamCompaction { int* dev_buffer2; int* dev_backup; - dim3 gridSize(32, 32); - dim3 blockSize(32, 32); + //dim3 gridSize(32, 32); + //dim3 blockSize(32, 32); + + dim3 blocksPerGrid((n + blockSize - 1) / blockSize); // Memory allocation cudaMalloc((void**)&dev_buffer1, sizeof(int) * n); @@ -62,12 +70,18 @@ namespace StreamCompaction { cudaMalloc((void**)&dev_backup, sizeof(int) * n); checkCUDAError("cudaMalloc dev_odata failed!"); + for (int i = 0; i < n; i++) { + printf("%d, ", idata[i]); + } + cudaMemcpy(dev_buffer1, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + checkCUDAError("memcpy into dev_buffer1 failed!"); cudaMemcpy(dev_backup, dev_buffer1, sizeof(int) * n, cudaMemcpyDeviceToDevice); - + checkCUDAError("memcpy into dev_backup failed!"); + int maxDepth = ilog2ceil(n); for (int d = 0; d < maxDepth; d++) { // where d is depth of iteration - kernUpStreamReduction << > > (n, d, dev_buffer1); + kernUpStreamReduction << > > (n, d, dev_buffer1); checkCUDAError("kernUpStreamReduction invocation failed!"); } @@ -76,7 +90,7 @@ namespace StreamCompaction { cudaMemset(dev_buffer1 + n - 1, 0, sizeof(int)); for (int d = maxDepth - 1; d >= 0; d--) { // where d is depth of iteration - kernDownStream << > > (n, d, dev_buffer1); + kernDownStream << > > (n, d, dev_buffer1); checkCUDAError("kernDownStream invocation failed!"); } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index fee7b2a..7381c7f 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -39,6 +39,7 @@ namespace StreamCompaction { } __global__ void kernInclusiveToExclusive(int n, int* odata, const int* idata) { + // shift all elements right and keep 1st element as identity 0 int k = threadIdx.x + blockIdx.x * blockDim.x; if (k >= n) { return; From 81b76280f62ffbd60494051e6c86f454e2d38864 Mon Sep 17 00:00:00 2001 From: rcj9719 Date: Sat, 17 Sep 2022 19:29:40 -0400 Subject: [PATCH 05/27] work-efficient scan implemented --- src/main.cpp | 2 +- stream_compaction/efficient.cu | 56 +++++++++++++++------------------- 2 files changed, 25 insertions(+), 33 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 0f2e66a..a79a458 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 8;// 1 << 8; // feel free to change the size of array +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]; diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index cc0d7ef..39062f4 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -3,9 +3,7 @@ #include "common.h" #include "efficient.h" #include - #define blockSize 128 - namespace StreamCompaction { namespace Efficient { using StreamCompaction::Common::PerformanceTimer; @@ -15,7 +13,7 @@ namespace StreamCompaction { return timer; } - __global__ void kernUpStreamReduction(int n, int d, int *data) { + __global__ void kernUpStreamReduction(int n, int d, int* data) { int k = threadIdx.x + (blockIdx.x * blockDim.x); int offsetd1 = pow(2, d + 1); int offsetd = pow(2, d); @@ -50,55 +48,49 @@ namespace StreamCompaction { /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ - void scan(int n, int *odata, const int *idata) { + void scan(int n, int* odata, const int* idata) { timer().startGpuTimer(); // TODO - int* dev_buffer1; - int* dev_buffer2; - int* dev_backup; + int* dev_data; //dim3 gridSize(32, 32); //dim3 blockSize(32, 32); dim3 blocksPerGrid((n + blockSize - 1) / blockSize); - // Memory allocation - cudaMalloc((void**)&dev_buffer1, sizeof(int) * n); - checkCUDAError("cudaMalloc dev_idata failed!"); - cudaMalloc((void**)&dev_buffer2, sizeof(int) * n); - checkCUDAError("cudaMalloc dev_odata failed!"); - cudaMalloc((void**)&dev_backup, sizeof(int) * n); - checkCUDAError("cudaMalloc dev_odata failed!"); + int maxDepth = ilog2ceil(n); + int extended_n = pow(2, maxDepth); + int* extended_idata = new int[extended_n]; - for (int i = 0; i < n; i++) { - printf("%d, ", idata[i]); + for (int i = 0; i < extended_n; i++) { + extended_idata[i] = (i < n) ? idata[i] : 0; } + // Memory allocation + cudaMalloc((void**)&dev_data, sizeof(int) * extended_n); + checkCUDAError("cudaMalloc dev_data failed!"); + + cudaMemcpy(dev_data, extended_idata, sizeof(int) * extended_n, cudaMemcpyHostToDevice); + checkCUDAError("memcpy into dev_data failed!"); - cudaMemcpy(dev_buffer1, idata, sizeof(int) * n, cudaMemcpyHostToDevice); - checkCUDAError("memcpy into dev_buffer1 failed!"); - cudaMemcpy(dev_backup, dev_buffer1, sizeof(int) * n, cudaMemcpyDeviceToDevice); - checkCUDAError("memcpy into dev_backup failed!"); - - int maxDepth = ilog2ceil(n); for (int d = 0; d < maxDepth; d++) { // where d is depth of iteration - kernUpStreamReduction << > > (n, d, dev_buffer1); + kernUpStreamReduction << > > (extended_n, d, dev_data); checkCUDAError("kernUpStreamReduction invocation failed!"); } int* lastVal = new int(); - cudaMemcpy(lastVal, dev_buffer1 + n - 1, sizeof(int), cudaMemcpyDeviceToHost); + cudaMemcpy(lastVal, dev_data + extended_n - 1, sizeof(int), cudaMemcpyDeviceToHost); + checkCUDAError("lastVal memcpy failed!"); - cudaMemset(dev_buffer1 + n - 1, 0, sizeof(int)); + cudaMemset(dev_data + extended_n - 1, 0, sizeof(int)); for (int d = maxDepth - 1; d >= 0; d--) { // where d is depth of iteration - kernDownStream << > > (n, d, dev_buffer1); + kernDownStream << > > (extended_n, d, dev_data); checkCUDAError("kernDownStream invocation failed!"); } - - cudaMemcpy(odata, dev_buffer1, sizeof(int) * (n), cudaMemcpyDeviceToHost); - cudaFree(dev_buffer1); - cudaFree(dev_buffer2); - cudaFree(dev_backup); + cudaMemcpy(odata, dev_data, sizeof(int) * (extended_n), cudaMemcpyDeviceToHost); + checkCUDAError("odata memcpy failed!"); + + cudaFree(dev_data); timer().endGpuTimer(); } @@ -111,7 +103,7 @@ namespace StreamCompaction { * @param idata The array of elements to compact. * @returns The number of elements remaining after compaction. */ - int compact(int n, int *odata, const int *idata) { + int compact(int n, int* odata, const int* idata) { timer().startGpuTimer(); // TODO timer().endGpuTimer(); From d8834c83c7cd035391ccc98267e4a08d6c23dd42 Mon Sep 17 00:00:00 2001 From: rcj9719 Date: Sat, 17 Sep 2022 20:16:45 -0400 Subject: [PATCH 06/27] Thrust scan completed --- src/main.cpp | 2 +- stream_compaction/efficient.cu | 10 +++++++++- stream_compaction/naive.cu | 10 ++++++---- stream_compaction/thrust.cu | 19 ++++++++++++++++++- 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index a79a458..0f2e66a 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 = 8;// 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]; diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 39062f4..c8bfba3 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -58,6 +58,7 @@ namespace StreamCompaction { dim3 blocksPerGrid((n + blockSize - 1) / blockSize); + // Extend buffers to handle arrays with lengths which are not a power of two int maxDepth = ilog2ceil(n); int extended_n = pow(2, maxDepth); int* extended_idata = new int[extended_n]; @@ -65,28 +66,35 @@ namespace StreamCompaction { for (int i = 0; i < extended_n; i++) { extended_idata[i] = (i < n) ? idata[i] : 0; } + // Memory allocation cudaMalloc((void**)&dev_data, sizeof(int) * extended_n); checkCUDAError("cudaMalloc dev_data failed!"); - cudaMemcpy(dev_data, extended_idata, sizeof(int) * extended_n, cudaMemcpyHostToDevice); checkCUDAError("memcpy into dev_data failed!"); + // Upstream - parallel reduction for (int d = 0; d < maxDepth; d++) { // where d is depth of iteration kernUpStreamReduction << > > (extended_n, d, dev_data); checkCUDAError("kernUpStreamReduction invocation failed!"); } + // Getting parallel reduction sum which can be used to convert to inclusive scan int* lastVal = new int(); cudaMemcpy(lastVal, dev_data + extended_n - 1, sizeof(int), cudaMemcpyDeviceToHost); checkCUDAError("lastVal memcpy failed!"); + // Set last element to identity value which is zero cudaMemset(dev_data + extended_n - 1, 0, sizeof(int)); + checkCUDAError("cudaMemset last value to identity failed!"); + + // Downstream for (int d = maxDepth - 1; d >= 0; d--) { // where d is depth of iteration kernDownStream << > > (extended_n, d, dev_data); checkCUDAError("kernDownStream invocation failed!"); } + // Copy calculated buffer to output cudaMemcpy(odata, dev_data, sizeof(int) * (extended_n), cudaMemcpyDeviceToHost); checkCUDAError("odata memcpy failed!"); diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 7381c7f..3ae2cc0 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -73,11 +73,12 @@ namespace StreamCompaction { // Memory allocation cudaMalloc((void**)&dev_buffer1, sizeof(int) * n); - checkCUDAError("cudaMalloc dev_idata failed!"); + checkCUDAError("cudaMalloc dev_buffer1 failed!"); cudaMalloc((void**)&dev_buffer2, sizeof(int) * n); - checkCUDAError("cudaMalloc dev_odata failed!"); + checkCUDAError("cudaMalloc dev_buffer2 failed!"); cudaMemcpy(dev_buffer1, idata, sizeof(int) * n, cudaMemcpyHostToDevice); - + checkCUDAError("memcpy into dev_buffer1 failed!"); + int maxDepth = ilog2ceil(n); for (int d = 1; d <= maxDepth; d++) { // where d is depth of iteration kernNaiveScan << > > (n, d, dev_buffer2, dev_buffer1); @@ -87,7 +88,8 @@ namespace StreamCompaction { // converting from inclusive to exclusive scan using same buffers kernInclusiveToExclusive << > > (n, dev_buffer1, dev_buffer2); cudaMemcpy(odata, dev_buffer1, sizeof(int) * (n), cudaMemcpyDeviceToHost); - + checkCUDAError("memcpy into odata failed!"); + cudaFree(dev_buffer1); cudaFree(dev_buffer2); diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 1def45e..7d60261 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -21,7 +21,24 @@ namespace StreamCompaction { 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::host_vector host_in(n); + thrust::host_vector host_out(n); + + // Copy input into host vectors + for (int i = 0; i < n; ++i) { + host_in[i] = idata[i]; + } + + // Create device_vectors from host_vectors + thrust::device_vector dev_in(host_in); + thrust::device_vector dev_out(host_out); + + thrust::exclusive_scan(dev_in.begin(), dev_in.end(), dev_out.begin()); + + // Write final results + for (int i = 0; i < n; i++) { + odata[i] = dev_out[i]; + } timer().endGpuTimer(); } } From c61e90afe4d90cab5ab8852a21f93e10f827c946 Mon Sep 17 00:00:00 2001 From: rcj9719 Date: Sun, 18 Sep 2022 01:30:01 -0400 Subject: [PATCH 07/27] Efficient stream compaction done --- src/main.cpp | 10 ++-- stream_compaction/efficient.cu | 93 ++++++++++++++++++++++++++++++++-- 2 files changed, 95 insertions(+), 8 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 0f2e66a..eb6ae6b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 8;// 1 << 8; // feel free to change the size of array +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]; @@ -71,14 +71,14 @@ int main(int argc, char* argv[]) { 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); @@ -137,14 +137,14 @@ int main(int argc, char* argv[]) { 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); + printArray(count, c, true); printCmpLenResult(count, expectedCount, b, c); 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); + printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); system("pause"); // stop Win32 console from closing on exit diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index c8bfba3..23782c3 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -13,6 +13,9 @@ namespace StreamCompaction { return timer; } + /* + * Kernel for parallel reduction with upstream scan + */ __global__ void kernUpStreamReduction(int n, int d, int* data) { int k = threadIdx.x + (blockIdx.x * blockDim.x); int offsetd1 = pow(2, d + 1); @@ -29,6 +32,9 @@ namespace StreamCompaction { } } + /* + * Kernel for collecting results with downstream scan + */ __global__ void kernDownStream(int n, int d, int* data) { int k = threadIdx.x + (blockIdx.x * blockDim.x); int offsetd1 = pow(2, d + 1); @@ -44,12 +50,36 @@ namespace StreamCompaction { data[k - 1 + offsetd1] += t; } + /* + * Kernel to parallelly map input data to 0 and 1 based on whether + * it meets criteria for stream compaction + */ + __global__ void kernMap(int n, int* odata, const int* idata) { + int k = threadIdx.x + (blockIdx.x * blockDim.x); + if (k >= n) { + return; + } + odata[k] = (idata[k] == 0) ? 0 : 1; + } + + /* + * Kernel to scatter + */ + __global__ void kernScatter(int n, int* odata, const int* scandata, const int* criteria, const int* idata) { + int k = threadIdx.x + (blockIdx.x * blockDim.x); + if (k >= n) { + return; + } + if (criteria[k] == 1) { + odata[scandata[k]] = idata[k]; + } + } /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int* odata, const int* idata) { - timer().startGpuTimer(); + //timer().startGpuTimer(); // TODO int* dev_data; @@ -99,9 +129,10 @@ namespace StreamCompaction { checkCUDAError("odata memcpy failed!"); cudaFree(dev_data); - timer().endGpuTimer(); + //timer().endGpuTimer(); } + /** * Performs stream compaction on idata, storing the result into odata. * All zeroes are discarded. @@ -114,8 +145,64 @@ namespace StreamCompaction { int compact(int n, int* odata, const int* idata) { timer().startGpuTimer(); // TODO + + int* dev_idata; + int* dev_odata; + int* dev_criteria_buffer; + int* dev_scanned_buffer; + + int* criteria_buffer = new int[n]; + int* scanned_buffer = new int[n]; + + dim3 blocksPerGrid((n + blockSize - 1) / blockSize); + + // Memory allocation + cudaMalloc((void**)&dev_idata, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_idata failed!"); + cudaMalloc((void**)&dev_criteria_buffer, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_criteria_buffer failed!"); + cudaMalloc((void**)&dev_scanned_buffer, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_scanned_buffer failed!"); + + cudaMemcpy(dev_idata, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + checkCUDAError("cudaMemcpy into dev_idata failed!"); + + // Mapping as per criteria + kernMap << > > (n, dev_criteria_buffer, dev_idata); + checkCUDAError("kernMap invocation failed!"); + + cudaMemcpy(criteria_buffer, dev_criteria_buffer, sizeof(int) * n, cudaMemcpyDeviceToHost); + checkCUDAError("memcpy into criteria_buffer failed!"); + + // Scann criteria buffer to generate scanned buffer + scan(n, scanned_buffer, criteria_buffer); + cudaMemcpy(dev_scanned_buffer, scanned_buffer, sizeof(int) * n, cudaMemcpyHostToDevice); + checkCUDAError("memcpy into dev_scanned_buffer failed!"); + + // Malloc for compressed output data, compressed buffer + // size given by last element of scanned criteria + cudaMalloc((void**)&dev_odata, sizeof(int) * scanned_buffer[n-1]); + checkCUDAError("cudaMalloc dev_odata failed!"); + + // Initialize odata to 0 + cudaMemset(dev_odata, 0, sizeof(int) * scanned_buffer[n-1]); + checkCUDAError("cudaMemset dev_odata initialization failed!"); + + // Scatter data - insert input data at index obtained + // from scanned buffer if criteria is set to true + kernScatter << > > (n, dev_odata, dev_scanned_buffer, dev_criteria_buffer, dev_idata); + checkCUDAError("kernMap invocation failed!"); + + // Copy calculated buffer to output + cudaMemcpy(odata, dev_odata, sizeof(int) * scanned_buffer[n-1], cudaMemcpyDeviceToHost); + checkCUDAError("odata memcpy failed!"); + + cudaFree(dev_scanned_buffer); + cudaFree(dev_criteria_buffer); + cudaFree(dev_idata); + cudaFree(dev_odata); timer().endGpuTimer(); - return -1; + return scanned_buffer[n-1]; } } } From 34af50eac962ffd3a4f1b1ea1ef85fdddfe5749f Mon Sep 17 00:00:00 2001 From: rcj9719 Date: Sun, 18 Sep 2022 17:10:27 -0400 Subject: [PATCH 08/27] Updating README --- README.md | 63 ++++++++++++++++++++++++++++++++++---- img/downsweep.jpg | Bin 0 -> 52050 bytes img/stream-compaction.jpg | Bin 0 -> 39377 bytes img/upsweep.jpg | Bin 0 -> 32504 bytes 4 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 img/downsweep.jpg create mode 100644 img/stream-compaction.jpg create mode 100644 img/upsweep.jpg diff --git a/README.md b/README.md index 0e38ddb..ae203a5 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,63 @@ 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) +* RHUTA JOSHI + * [LinkedIn](https://www.linkedin.com/in/rcj9719/) + * [Website](https://sites.google.com/view/rhuta-joshi) -### (TODO: Your README) +* Tested on: Windows 10 Home, i5-7200U CPU @ 2.50GHz, NVIDIA GTX 940MX 4096 MB (Personal Laptop), RTX not supported +* GPU Compatibility: 5.0 -Include analysis, etc. (Remember, this is public, so don't put -anything here that you don't want to share with the world.) +### Introduction + +Stream compaction is an important parallel computing primitive that generates a compact output buffer with selected elements of an input buffer based on some condition. Basically, given an array of elements, we want to create a new array with elements that meet a certain criteria while preserving order. +The important steps in a stream compaction algorithm are as follows: + +[](img/stream-compaction.jpg) + +1. Step 1: Mapping - Compute a temporary array containing + - 1 if corresponding element meets criteria + - 0 if element does not meet criteria +2. Step 2: Scanning - We can use one of the scanning techniques expanded below to run an exclusive scan on the mapped temporary array + - Naive scan + - Work-efficient scan +3. Step 3: Scattering - Insert input data at index obtained from scanned buffer if criteria is set to true + - Result of scan is index into final array + - Only write an element if temporary array has a 1 + + +In this project, I implemented stream compaction on CPU and GPU using parallel all-prefix-sum (commonly known as scan) with CUDA and analyzed the performance of each of them. The scan can be performed in two ways: + +1. Naive scan +2. Work-efficient scan + - Step 1: Upsweep scan (Parallel Reduction) + + [](img/upsweep.jpg) + + - Step 2: Downsweep scan (Collecting scanned results) - At each level + - Left child: Copy the parent value + - Right child: Add the parent value and left child value copying root value. + + [](img/upsweep.jpg) + + + + + + + + + + + + + + + + + + + + +### References diff --git a/img/downsweep.jpg b/img/downsweep.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ff44c339c62c4707a17b0a3ef9dec2130db42f8e GIT binary patch literal 52050 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 A=l}o! literal 0 HcmV?d00001 diff --git a/img/upsweep.jpg b/img/upsweep.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d8fc8b8f6789c72da519222960324fbc712a3500 GIT binary patch literal 32504 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 Date: Sun, 18 Sep 2022 17:19:13 -0400 Subject: [PATCH 09/27] Updating README --- README.md | 8 ++++---- img/downsweep.jpg | Bin 52050 -> 52050 bytes img/upsweep.jpg | Bin 32504 -> 55606 bytes 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ae203a5..5de76a9 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ CUDA Stream Compaction Stream compaction is an important parallel computing primitive that generates a compact output buffer with selected elements of an input buffer based on some condition. Basically, given an array of elements, we want to create a new array with elements that meet a certain criteria while preserving order. The important steps in a stream compaction algorithm are as follows: -[](img/stream-compaction.jpg) +![](img/stream-compaction.jpg) 1. Step 1: Mapping - Compute a temporary array containing - 1 if corresponding element meets criteria @@ -33,14 +33,14 @@ In this project, I implemented stream compaction on CPU and GPU using parallel a 1. Naive scan 2. Work-efficient scan - Step 1: Upsweep scan (Parallel Reduction) - - [](img/upsweep.jpg) + + ![](img/upsweep.jpg) - Step 2: Downsweep scan (Collecting scanned results) - At each level - Left child: Copy the parent value - Right child: Add the parent value and left child value copying root value. - [](img/upsweep.jpg) + [](img/downsweep.jpg) diff --git a/img/downsweep.jpg b/img/downsweep.jpg index ff44c339c62c4707a17b0a3ef9dec2130db42f8e..220cbb915e9c58f55228a4d3916bf83d41037814 100644 GIT binary patch literal 52050 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

^ELWKd`>iajg4qz8my;4 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 literal 0 HcmV?d00001 From ffc7df333719971d1a046e26a01f6968a8d398b4 Mon Sep 17 00:00:00 2001 From: Rhuta Joshi <35020308+rcj9719@users.noreply.github.com> Date: Sun, 18 Sep 2022 23:58:08 -0400 Subject: [PATCH 26/27] Update README.md --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index ea98b47..3c8cfcb 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,19 @@ Based on this image, it appears as if CPU takes lesser time than the GPU paralle 1. In the current implementation, number of threads hosted in each iteration of upsweep and downsweep is the same. We know that in each iteration, many threads are idle and are simply returning without performing any meaningful operation. 2. Even if some threads in a warp are done with execution with an early exit, they have to wait for other threads in the warp. When this happens due to conditional stalls, it is called warp divergence. This can be avoided by warp partitioning, such that threads which are likely to terminate together are grouped together in a single warp. +I tried to improve the upsweep by tring to make better thread divisions to optimize parallel reduction process. +![](img/upsweep_optimization.jpg) + +I tried to take strides in the reverse order, such as ... 4, 2, 1, instead of 1, 2, 4 ... by setting the offset as follows: +```int offsetd = pow(2, maxDepth - d - 1);``` +And then inside upsweep, instead of using expensive modulo operator, using: +``` +if (k < offsetd) { + data[k] += data[k + offsetd]; +} +``` +However the implementation is still buggy, did not get time to implement it correctly and test the results. + ### Stream compaction Stream compaction shows a similar trend when compared to scanning. The following graph does not cover stream compaction tests using naive scan method. The behavior with respect to block size is also similar as observed in scanning, described above. From d9e4f03ee1ca6cbc7439aa791a6ac4a5bfef2ec5 Mon Sep 17 00:00:00 2001 From: Rhuta Joshi <35020308+rcj9719@users.noreply.github.com> Date: Mon, 19 Sep 2022 00:02:12 -0400 Subject: [PATCH 27/27] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3c8cfcb..1d9c16d 100644 --- a/README.md +++ b/README.md @@ -126,6 +126,7 @@ However the implementation is still buggy, did not get time to implement it corr ### Stream compaction Stream compaction shows a similar trend when compared to scanning. The following graph does not cover stream compaction tests using naive scan method. The behavior with respect to block size is also similar as observed in scanning, described above. + ![](img/stream_compaction_analysis.png) References

s}I${GMu}3D98$`s+S@I_=;daStKQ{Qq zl3Be|E%`U&b=!2!nzU1K!VqV}`Eo-1doua>K1pR*)gRxx6{Ne|Z?Y zQ8rT+SX|U}x$$&T+FqT6@_3DrXPPzK%t}(VN?h)palF?~hyl_1VDt@6Jv7yGI^>uA zuDzpBeNyYMdY1L6wF5iL-)Amxaw=TE z2f$os#PSzUP9~(Er_pIAo=aoPB^>! zg-_RCvGq`rWWZVF?CkZ$>cggfb=uJFZ9OxO7^c9`r|j{mH?Fb_fy*>gGP&^JSdyfx z+Rr-0aFR#S@{x(6ab>TEGkeiO3s01=xo1bP`?8gU_;|jNYT8sUrpRyV=a-=cKXrP7 zbbB=Tl`p1Jv?bP0dw5gTeJsJgHzKI`4E_)`uRqrN3 zu-51kLBMECI11C-G*GE>LD_G*-uvy;=citnWYsYn4QI3R0`|ljcpc_)&RO$70GK|^ z%dr*b^F|Q329jyzdM(WdCLE`jgvG>co6J zS2KiH$~!uqb0yV$j916t!pG`>lIiG<3htkU`VD0%O!kr3ir6>Yi;brcgBjX`i5Ut* zHfG^IS6Yf6iVF=b?`gdO_zM;i08u}Q0AMxj8GyUGyqAH_AtaRbN2#2eOR^GQgJn?y z@r}PuKK0OGcQA!pv}F`R*ix-Su*{-IeJT^s8=nIr4XL1zwbcM|PFW5PM=N*AOzPoB zyKyDwiR{$8=*=m-svp*`wWt48of;(x+fQf3tiFxM{FbkYdIl9ubKv*n6d~x+mWvHb zzc*)`tY;&fw>CIrfa$gcz&3kaQs1mmVukW|`>TBA%=v#Wi7IJVAFukgGAbJy=9+%4 zHj72mA#t8_xUEn@N8QF}7lfx?rj@HjI}fpmdu@!?sVQ0w?M0G$7}wkZl{9)>{{fNF zf9S~cne{E~(wJgFkSso>L^RzGTO#7Rlb}=)qmw^;gD+y%O$~>hoGY1=PKuxN57E-q z@GQck?o~09GXhIil$54iiyy9o?@dq8&sKuzi7EXQ)gZ6HOY3R5VO8J3F|KT^drAk{ z+pBM;%;P(CfXd$$sD~fsJ8F1h2zC>Sq@I8u;5|bA5*4I1x0e-Uhtrj(e}LDRi^qA0 zAI)I3nuJ{5$7d&PXkA}@v*u}a|GEK5l5$0!m=VhXV9b`m!4l%|Q~5^W`t-)j^BrhQ zL*8ptP_SvQBF;Q?&%YrZa(+ej_Y>M@H3?BBnJ=?cUa8~aU!c9qIVr{J30R70=~j3rsh?Ev?93LGK-SC%~8Qnku9$c{^OG*LXOZ{S8C3ZsJZq z(Y?B5E;)28dcU@To^q1?DgE$ABX~=2;f%wvN;B_9OJ?FUU*KKR-NXn0lZ&f;4v@`R zt!f(fSj%5>sL1}-F{~OK#CwCB)eX|bc%xRheRVrlzRSw95nmb6x9)47+uv(EpHa|b#APq%w} zyoH!y9&(b=#|2B4YMq+l`g|c5(c#CC) zKEsyYPIp!X+h}+j6KSV@r3kd!OPw?f;QO24{-a@zBcoeh1zknqA} z&a+c~ZP@HZ=i? z>7(rb8&@`OtN}dsL@Ge~HN^thDjG~WWq{A2um#8o(+2htKx)Yyd{(OCd>!*zI=o1vEY`o)==9dzRdI6itAvwIrI%io^>eM|_J zYXH5>>Ht)(T@;Q24gR99f&c$lplSKwdL=M)^Q7|iScszkHSuSidb3``6mQeQD<5?3 z-{1DL*I<8e&rpLM^lu#xna4Vzv=+pUxmI)a%jMPR>R0)h+DrFlBg0L%f5zP0IlI2W zbHn(fX*;n7+k-r$?}8U!?9>~QdS(LXa_~C3#Cb#D_Zm#^wssxV#@880ulb$I?PH`j zB$g7r{Lf>FR#T!lUOO2$hCLY7IW{qoM}%t|59BqbZA8?X#sN7q-gwCdA`ol~cg@|g zOWyP~G3Nn{-yb85o;&DBn4}$cnbdoZ?DI`OG(xpX1ip&ZYP%>nq88L^ru#f38`DF- zf_ON%{AR)^zTGe=iR^Kh;W#qSDN{Kn3$W08iRNc=2=YH|gRJl#A7fbwQt7H|qm0_^ zZ8;R0i;HBjDx&V}lw})0U&p$RDPEd?XnRvixWDvJQ31}ovhj4bEKS0gm5WQ`f)$>=jPUU|Oy~@*SCXu7@5khsGztn(zQTfnAfl zMUiwcivtgGq}B6^Eu@-V984s-qSE2HXu(*{O!cPz4+StlB_tV3ec!p|ULn9MFBDqk zx75e8X)LT!t_=HdN48qGy1O!2?1F1u>B$E+WcEP00}<2T$+f2F7PP5Xj|cFMjzNUN z==SY8_WCD%BsZ=r^=dFn5Gl+cCy4e}gJ^#^P~IyCz_UvlCU(0rudu8kgT`_PbSI3h z@6LK(sh_YSSCWc7TQvxc@d^~tA$d9~C^H}>@eY#6Z!88rXzs5P-LHvzdh1v#LM~QY zOKWJ)T$_(F(RCWY9&lz~6Vn&_PGHjo$^~ud3@T{1)FBoc>F4WqKX-PE)zYEp4xKq7 zxHCbpW|3w;7l26hSg~}jw3_`}TjVki`Ed2701*i9x=Z%pa_a=n;j>%*8Xvm3J>*nK zDvnwDq0!{CT<0%hJiWy$Kz8ZWE;+O01Bp=Q7`0G42;WUF(3(!s73)ELd-?>N1yBV< zQ)S6-;E4m?j<+WBjLf!+H#*7XJ4|rm#>In2i|tx44Jv4=H-sOxqarR552Py$-Dx(HE~1YY7>oM`;ZBUFAAijH_8` z5!`>@+TwEJbWAaw$mk@4%nL8&k1?}8hLu>u0?G5F0htc_HIsdlyjyg=Q$6@884OE)4{5ghF_=CD*DdOWi1 ziNxoIT!jCM0Gfns0I5S@hqojX{i&eaV4$IA0F(o5=67%>N5KXYS&cD@KUbT4KgA0f zii9|ghv|Oww&@z%V)E(;VkC&5aBzlIV|S}JZhpRXy?cn?+U%YcTI@fg5_k)jXiFvL za?JUzs+Nh@S6bb_6^*8j|pvg_Az^MFFKjcoh|tTc;nW zsu{VyHFxdxaDYBzl`;X3%WC4Ob5Kg)L3U7{GeXI47be)C#Y6FNP#QItf$rQKN zd#97PDHa_01fLRy-MD^1*LdU+;#6{`@uhnQ_u~++9Gpb$A3vwzRw6-}tuG*wV%)VY zZECLg>E_Oqd@inW?vcn)$ikyqtcshrR3Y|$;6V3C&U<{n-j8$qSif0_`HNXOGVofR zR;e*0NI`SSRpjKP!l$F43VrCltCYj(#5*djK-)fJE`d>$&-(e~x9__;F&Yn_ohkmh zUAT2|(0AK?gm1LXyiHqq=!L7bd9b>3PDoptR0ejM1?P**wXj-AIY(^pH>-YLd`-kV z_FCNV15lUH$FrZ)j&3&vlH=iXW4L^B>>9wDc}O*dqNeaKUbH-TmoXIz*?kwRz(>5c z3$(TB`riI0IYv8+j{uU^j7xRvADCgyB(v*%i8 z?Orj8XoO~gEZ+eJQyBh3!y7>W@)RDz0bnj-1G3wbXY5XBIN*uOe?Jl<-X-jjz8?R! zO>rZCwNLi1=8FI8vvw?j#!w10EN!f90OwPoz{Pc5I((AP(M1~_9$88vej ztr8<5!&2{hFtBPBTs5x}YR-DK;M=2(N2mK|-IKV;S#QiUeD^$k-&MZz@ZNexma3Pf z_x4w8-wIWy8wz0~j&Aoi+g_-uuNjbb4978x(U08bEpyK1_nQf^n-*#leA{6&az{%-KA~4Gvu!z<#+L@ZoCncb1050h-0NX@CtJX3+!^AMq*D(n&yW~s$KaLT2D72b-lc=&9gc@ z--=sfLYwG^7ujryDz}=DE_TXm`r+o6yib16hGbX~Bj!#w(9C8yw4HBx7Sc-NUBg`2 zBOu_QxBq*=Tz#*P1Q}&B9~H8s2wM_UEfEUt(=6JF{p-~m->ys|!m*~>jHz$8{nuU{ zZYVhv8p2TSLdhdrQYlSi)oX#0023c8uV|^^r6%nWvUBIJ#;pqBC8^<2Kw06!66%)* z4)+e`-Po)Dkv3=W6~VxBHug(mZo(}=@%)RegEa*+96-FU;NMVM58y|R!)pUS%HF4a zh!yKAPV<{?`nl0svyrtL|COXA(Tv?Nx;LGZAnEAnb3^<#|G7Y3XOdtwa%c1yc#ob7 zOtQHMY_b0{)p^WOx~INy-(*Ef%foIy22IrRfGm|9P?)43#5xG}LM5;t)?kP-z&r(R z%?J@xRQBJXJ8lx*Z@oq0eh4Rc!&_8<3S13}#@l;RLG7ctKw0oVf&Gnq(q0pgQp12E zf=lZkSLDC7AxnT56K(L-{-hgGiZNC7-{hpvHecRk`SP&($9N2XD9ys9*9vVTOHCKZ zMJ(ZPN60xCrt|zA`j{YIDLJ(l(>ae5-Otq|BFu!lKX1$FoqmwzME_FOhP744(-<*5 z-iuombyhs6ST^{V(#_euM%SR5Y0#BHRZIGCXpp0;YiWN8BqFCg zjVC#F`>Ni+lRQw{0F8hO!}F}DAEiS$t~LW^(iJ>VSVfVni>8(XI1tdx?b(lKn@w+C zT{oaH;S_zzP;A2^k`#CBS_`)<0BS600OkIJ=?4C~D7zaZL2?n>9DO@9vc~pwLme?< zwnSEQFn@5jM1(QW9a*U@-{!|Z&3y(rUBvNWY~kT2mGCXwLCO{PvD5*LFC=k7$g9UM zhTO~#tW=txeL8PB%6wb<^c;~jzUm=(BegDN9KPOnE$4)$LCo`OTIXoQF4Z9RGvSX=9kK3 z_2{0|{p;)@CMGHWNM+`HU8`R5n+Ul#oQ)8Vd;VYhO*{H2_)x&lZXXN`^kx>jw-rrL zK~LA#f))4S!%%5a#ONT#`j>DT&X0lLrLH%@$w?Ii5=t84*pVhlp(BvH>M&<2h#ufg zNj4#V?e7Cday16uq_&qs%XTJG3FcXY?g7aiN%@WKrOAH9KR?sBKK@l)k~GZoB=*Ky zPq3^l6o0X^?IPdMo{h8>zB=bKIp3sdIC0ZGT3cY^YWo07vPu(45h69iq9!{CZ&~|; z(C#b&2+b2fXzjy8LAH3|N>6RY*dP^lFXn-Y)vrK@`aCHwh3IpAA{-W61wNV%sY55Hi?_J)@fHwzgpu6;KgHiqxPW zRX~s;H7e3Yq(*8~1f=&~qV$e{fYd06bOO?Aq)V3?IwbU-Py-~nzwLRx^Swv!GtPOR z-`@`h?hHoQd+oL6y5=>nd96%D0?gKd?#=9Vd>OWT&vKRJz~CqUfh0r+#8OU}vEyoiqd&&hniDkVZtRV(_jq2)Z>7iBhf; zlbkk@2FawYn*obohLqyZ8$2g7T68R-d!Hj6i#LG*sKFON4OavKTvnHg0szC?ov+u7 zJf~W#X*0ta3duzX8?Fyr2ggPBTA0yw*l1mNsr0B5rr0XQ27-haHs zG0!M@nQMBZ8B8XBk-4o+2y<0D8aZJ+1n_$-Gy+f`AxJ3|btkk<4#aTrMwvE4P}`P* z8nSX^lN;x`TT--akmYN|{3@g5OJD%yeYuD9`@#Nmfsrw^L9dHOZUUeod&6R7V3ll(ht(ErN zW7CLFFKD`JZJ?2}=bGMk+ATn@Osmk9J+FLzcUMk+}&U%t@vjX zhMGPe^{YiyCJaR@jr%mwuw5kruzFqqWpE--Jo1sv9uMZIednw-l!{BIsM52D}wW(q=ZiBXYu0%Y$)dFo!DFu>0)^U4iRc+zqPN<`?VUb_l_%i z?A+y|oLx$e0GcO|4kr!f%F_3`SxY;vkkx_fqLU!-&rN?J&s)&2IqHMCD^op}B_Z!= zZkC)8@yhF71(6W|&@zwJq{wmZ%i5Tg!g;(yl=un=2fe^f$D3%#^&So}3X&@x`Z%47 z@hz{v1GS_?@(uJ10b9@?qc&0vx*W)4`G#n2GsRl+|Y zJ(?{u6l3=fNWZIJJ-mbY1?jCh%5+~n=;0lxIVkCkqyW(R(1$hE+kV5FeU59VZ@ja& zY3N`-$_sxrOU#{|DOT&pv1)=tD^(Vh;*~2C_2^!g@j8-iTfwn$hOhyF9RlMt3`c)T zzX>3%M|ylhia;-2w3>i0iB>@Kc*zgQ&rV}Ww_@=s#o(31Bhsa9Fh0V!rRErrE?KNZwkOTPgC|*0Dr2THh6_)=OsSz44bx0ax6G- z^IR%-KH5)Pz-WW`bRJ`+7jhVLKkFf=KccOBN>zJeZ$|l08`s$))x@`&dASM4*apAi ztAYg>89y(KhUu))hK9Ldjyfb>^|H}IiuvxhPl@K*iyY_tA_0*leJ)}57p(IGVBIz4 z-|y00ndyEGy^Rn&b|pWudBmO&Ly9_fX`4L{)Z|cYFiKe~fZ`5)hTqc~^ktr98LfbB zZP-buaGO`jTc&ZmcD#HU$tSf?%`*Tx^uY(CO&r?f>6-9zJ~+u1?}0Gx(S^}sf1a7u zDy?=WM;f7tY4-!nz?Z5vJo0}{|Bf?a^ZDDaJ-xK{pk`0AQmchDlyf z*nHChU}TW}`%RXfv>ry}Lf4r6^bx|soTss=q$|E)9K3BO5_;WN9T$pbiwzMIzPe_p z7i7qun{Qx~bR=lQ)o&1R_P#~*+t)WZuBx*7a3`Ni5%_*OWHk+unD9VYj+ED13JJDx zkTp0*8_)If!+hNPhs*UezfCtV`qnR`51GRY|3dn_nK%1pWQ4lv?d&lz3|WTF$YcWf z0_X~X8b9oYhF$Wd7$ZpKv|@)_y+<3TGv!U5^7v_LRMjwEHM;%r%tCq`^S$bB2}$Z^ zhnm9wIL-Mna#e?>8MB+5!G+XWqy_DWp8qmN%O-tt!48Ws7jfPq}Kt#P+uo$^g2 zmo2b4Dc}ERB>nYM|3c%uFbzHxZSTg$KWj94Lw&qCVhKExLg}_DE%|cIXkXh(jwwUU zv5?&`PQz>6DRO=WrZ`0m#Z0B#GEMT{zjY$(O?5`Kd>g2@JpB~dKFc{+RZ@#K$c?=( znR*$seHYv?SgNW#sCT@;Q|#`lyE|p!OoSxh?>QaM`1K!}CP{5w$54beJao0YbD-is zD}NCD!^Q_7t-Ptu{*Y!b96y057);KEx*})|BkhbdDn~w1+>*)De~>%!+R>9WR&6D; zHEF08dlV*aclkHPx8&P2kAK+6m0{ z-;REXQFoMrE5SF*;ioTUY=Pe2(L|@yN1i-S>nLSnq!6lG&`wHwV|_ z^1)h3$3d@G=R3BwXeQ1I_Ze;bfDNsfpRsLzxIC@vfh3M;xd$@DzL)5tqu`MpKr* zUwZwa%=E!&4Z;Z_P5eUUFtLCM7E0f>?c)bQ=Y0+m*jv?MgI{XxJAP8_@VN|Y}Ap47~+Jl;gBxRC8FT}U)GSWI!G@MU2xiRW3hx)N_ z7QgXGD|Dzq4^V%4O2A!W^Y%Dh@JiqUV0ZpGT(Jbgz8_zgXMkZ6bb$4w3@z?8N0YD5 zpSqQFM;I5|_WC2V;n)JOs!z{;GU*AVY(&saUAOjIZOHBfY4fKF8_TNlg(3)Fp06-= zW@$0G^f?>PGk?P)mBh`jX5;0LA+W)3GFKHJ5*(`o+d?L#l{?+Dh;jr4Ws9r;4QIsBhs<{n$FfuA1JhQTRLwf z=H_nm#>zGzC(xH;$f~Og>7Yo(yxBrOOp4dP_{k^1IP?$_UAY9T;4xcYaVplne>S@OsT zHlrN}G&j9dq4-?Vr>pc?_q^T>vdd(AZ-%wIMuw zB7|A+(SmvH;i>GyTb#rtu;GgTC7{9%iD?owG%!-Iw4n*#(!VdbKp6%u6Kf6D`p(3Y zTkKuw721M0=7TbII^b0WX%>i)xv;l{LT@LnsLeY6yp9~}#5-U1w}!XJ_fL4UKK1fu zMUeep|0@vyAj1t=5$wRTp(61vHwonEtxO*y6CTCJktI*G$ej}XF{Xu)Y}EFVhvF?ub_8t{lugzGT;55b+&1 z5L4k0LSm{x9UL!L4c|?E_+l*xC@@rtRmp=?WvS7? zEB3JCpq;VKWJ8uk%$!+SstJ*>;C%P)-ALwL&vlEB%udURz&e;$C-gT6F_Z`uWUE?} zlz)y)a6LD(bk|j6y3IIIPx`~1%!VhD_3YV)g!9F)te_|mtCc_i;gQj8-H~nb?C;X zoE5KjKHzJWyi_B7H#f&%W5R}{zHPf-+resFc!J>YqDVxJF4staQk6XE?+ew!8?4 zp?%cw=6)KBI>qT&>C~;qb9&?#8g@v`KFy%LjRi1)<6w^TDEp7=67!hvh+{txfeMyF z&p(n^`}!Zt1_)zlz11-Tzl-W~m(*)YN$oWvkEx`%rb^#vf@hf=8#VOnIv* zWbE~dgq%nxq0s}m-Ea4QY#0v^#Et^ME2s__{^16a5Uf`zJlTrgj?JBc0y$2Lk=aX| z>zYn(F7tlQ_diEJwD2&q09;YxHOVeIb-Y*{d1)x=_XR1C2_4DrG=zlWU7;SWN7)GQ z^`eSt;V{=e%~nAG`@=-1HV(toJFaPN?!#*?eCjWM-7C>}aC z$w%>I%-5uF3PGsbn7dNhx9EP>(>58TuMCbA$ABs<+iB=YKS9(4Cv+j(^|n+o8;8T_ zTSp4zNZPcp>{~_#!`(5E2uD*n1aqRrqn=LIioGZ2td%Dr5fH;Y0e?#&PLU9{mW(%Q zLiRoC``ab)2ZY$VeFnkLYi;QX4(ytQb9(E?u|PgjhK2*&{RM&`I@)5d^JKfy^37Kg z>9jeMqsB`JwEUjJ=aIXBh#phNDE;cciCwyTmuVB!8VrGb4Dh!Yk8p=57ik$IT6e;m zK={vQc{6x_n~CdB8&1zp8-}E~AKjyDdCLnFiYj8u%~niG@RwdNuN1Nwrs9X}<+oGJOy%UPCNhy(rsxI!W2!0td3_i{LxL&)MRpdt%G#F#-p(2xhGD!2F&xF# zwRt2pK286pkWm|>cV;60L+?7x;7W~0ystgYQl9lV*y6T#m%~e0IPUlJC;xFn#s?xb zhT4w#`g|qPU*ra!XEnq-OuDpaIPiTNYOwTk%`=p7z&|?hlNMh2WtDGf^U~szy>}7IUM1(%6Q%&Y6b8EN zq4j;NSV?d6gPBd$DO_jlLgT^!4c-DRSjnb8%QA7nto+gIngrr_g3#PsaZEJMrG>dl zGt3PUc2ZEsYZ+vODKSlk~oxOikVBDWo0WE{1T9aN0EGj||x<%f1*s>S2^9^)5 zm&Y#oLRVg`6nuYXKo+IP`dEa~^>wPzM6N?Up||#p0wy70chGMKO8Ai1B!)UD&VGbV z9BP{p7GG10dVX;2?VjaCHnf9^qYH~}g#*mPncAAA^RNfE^PA9oZG|op; zv<=;<%S^CwaYj0CSWE!9v9n%l{>e3C&>wI1nN=R8^C^+dwS4 z_RTlisGM767ifs45U?!HJq!YCEEdg$f7oYr>jH=iPu$o%78ib zjPw5Usr9(_yi8d64t;S+BY32n{^S&*tm_s{p@F0RTsi8xVe)k3AY}J^A`RjEJNmuZ zG#nf~GHLfUdw$CS!;oR-LOWnP=6?kxY-<<$AHvo$r=ai4Wp$ug+3ahqfII=mVY{6%YSO^8c5g6cPW%@~j1)4b&s3feK8! z!&M*^FpV~Fb2HQ#0~2{H6SxHLDSesW(qqvj%SMaHO5Tw$I5^UoT?(4EjbBRp=H!cVZ*bVo z@!(2xw0!KuIw~djwQw1USYN5rhi(#oITCh&Pg#I4Jj|W|^s}7)W^IOAmj}S~55PPY zFrc~(6yNw*Q{dR_jT2GS7C`ZHRiQ{7aDXjcJ8UV|gHHO8RP7MNXn6p84{rqaw`JzSyqG3VF^yR={jD4t1z!C+YoA9=bq-5-!2kdEXZ9KBeh6-_9Ey` z>9iC}dB;6dH#D2HFgfX`|GBglf4V9>4DjBVg04kpciJ5q9NaJdyoYJ3sUo9HF>Z$no`W?bb)>dg zW&TA5l_9VIT#+DsLSzZ7zye{rf*W&(lK8a0$TX8jiF^y1galpW1_8W3 zqtnrYoR!zyQ+89N-(%dO2T0A!R&~pfxt@|r)eh0}9AjIRmjq4kbmdKcPslc&)^Ke5 zk(5R6>HBR;qBNS3{0&L5%X!kPO7JC*R&!GU-ybl^?>QSg4e;Q%M_1SO25CI!GRN}(8VKf1TZkJF3*12#c4 zuuXlyAt7;fbju9`r-K1LLF_>3s~9j(5g05yJ&i#wrT}>vsum;=N)nUPs#m1Pz$-h0 z><)I`HAw^2N8wa9nbx|XIIFVh8(Xi_x^9~%(vfp=%j-EmyIya(1AwKRPQnBm8~tu|Gl*(K9z@JP5Y%j^Jb)BdLM>ZyzDceE~8kUOyS13kb|W zGBG6CCTQF|JFt@DbASxCBh7&*Vx>2ZVnc(0B>*hhO{=P3Yar1i8YbWgWRAD>WeDnk zq(-?mkaP}K@>$V0&DRYCvO!*N&?_O_AN1$4@@E;duQ)XlzG}@+J2W=QTV0%3*eqsu z@BQ}n@~!qbNqVi=uLKZAorcL%`7vt$)54Qc+ZRn0d)LjpL_11SOgn9^$Up+qUb}R! z>Etc-`S2Mf4JJe+3ne%=!Y88~EPGr_tkk|0OjaKp!BP;)n?T;n-G_|@yx)MitCE!! zJK;gnNJE1F$694loFa6P{XB30$i0K?zsPE1dBpJfK>MhI@ZmdPq9@F+5To~CYq9#p zYCXhHu*KJSDWGZDckaY&v{1VV(y?<4LL)cYVEaotzU6rB1L9RJ(`%=Xq1Gp;SbtVL zZKsBbnFfkcyKzKp&7m)`5o4rG`P|-I&*D@{lF3!qZ;9SO?cPE*p0UWveb+O$MWTsv zsDZq|(|;FSz2?o(QI38Vgy}vhkR4ox-HF zhd_f8*g5`+q#Vp8Su8*KzeBptJ!z41v1! ztEyz6s2T?u(%W;`TmVLM4~rzV+X(}&`4(bS7T8eY^skeez{K0>QVuxi=hY9t%%v+) zfp#pK*nzMTAq2u6)t*WxQMEUH-NpiG`=F1G^CH`~iMT-d8+k9_g6<%8e_Cr0Eud;7 zx0aZs2_fj2f0~}@^T@(yxkpScs-KCztJpA~_=@EN32;Hybv71Mdu})?B3o9tb={uN zxjS7qUZanvcQSe^LeoS)7r{UDR8`r=A1u5l7f=I@g6|5hf`I@F&>)&g;t5!aHbaKo zPd45XacCCM*;zbHH~HzvzMRM{hBD(|$lUdgux|p{*%$bW`U7o zw-RS+j-HzoXp=uf{2=QmQGF#FLlXv2UJNS_M^gKzXEg2%3JF$H(SN*tNojC^Gv2X~ zZ{-~1$=wo1Z4(pZ{0US+GBTg>mwIabKMQlvbML^FL37mmKpKd5UT6g~$=}?N7xn_nJ^-!Um|2ym2Ks9} zG9@d2&T7(38XsrsDBm92mgv?OZB`3;*)M9n5|GbiptRV@B!K{$PJI5*w}G(#BGqwQ z*!3T0zXoMB!JD#Cv?rsg3# z?*g8siQ3_sXY}@$2=%bdq9QT;<)hT#>6G2#;)Qb#iC9NbigWQ~+@-GEsj)(cSENeq zzP(1-i6J0k_%C8AZan#6(n#e_#2iC|`W@!bAlD3;M}zD%Gz9I&QEJ9{T^&^Yfp7 z_y23?`FLVp^9?0jypZG(Wb}~3AlJ*W{p-1a#f6*7ONy!vzc>D?$y}+o_wY+zjOG0| zpgk0qt%j3BwriflCo5q6b1@s2*chJ=mt+sw+h!$E3GocS4vTYhqU2XBnsbe(WMUnI z5N>Bm0(KuF0Gmhi6M1Y7?aJhFjPc5_oHOjf4&`gc^RG`8&bfPg-cjV&ownHAR$KrF zyEh5o*x?u%K^r}6b@-j)**-VB8{f_2Cw^E2JkI1ZbDgE{&~Z*YR_U?S{4RfXSe_N{ zCKfGH!b5#083IZEc3dr)EGn^PnTYSHr|l%;?Wf~^d;TV7fO*j#FTNmVx^=j9dER^8 z`Z4^wMY$L>LY@pBuu5!1ffEumA#%CIBL6tZI=k zUR@R#=*MONy$JdY+wHD{P8=!XF2H%(d=3rvC8@ zo8j!f{w*KoCP}Pm0`7WCU1+FVkBi$^(}JR~lEJ#f7pv>t5A`8><}ZKn(^#(nTFRKY zRuUh86Ekm)HM}fows1XFpK&VQvm(E1#UNH4!qt)XeVY`nj3GHy{nmOthZV&B7M?xU z_-`(rH>&%tgNrPOL z>d2~R46}y@Oi{@qSFYda;(FDT7U0Pf<~)0|H62>S>tO6mKyBVL1jb1}QtYDU`Tkrt zmrHp`BuS>2*FRosUr`b`g3*im`g^?}Zdn@1P%RitP@Ce_)mTUAH|_N{>qhfW54-Eb zQsqP&{96xQr6r>plrho57~x1)qM2!0Uqi;Lp*3i{?z!6=dYiwae0RX{NvyQYu^BYkH73WFJ0<{UnH2L3uyu~1w;NK zGZ=Jm-S84}qo#gk!2NDPd(oOJ_XRi~Muxh#3xz6-0I^+!J54kx?Qy4zfH+6893 zYUv-$>-OaH5p;hGe5NQ`AdEI%4*l6FXn;?N=r^4 z`X)wrBs+WE&k|X!;y2QYTNPs-V|9-vFxz~LHWXG{OXlByToBD&mh)_z``bHs=^48q zk3ch075NI_g0qk9q@sl?td^dCpdGq_8DTmkyJBR29!7`u1VxsLXNPA8#HX7KAF;ue zEhdq6V&27?IVbHGXE7eg{850Ow4EgfnxGW$p}IIa3A9;tn!dVu{Eb9M@opBFtaZ;J`%mfJhheDQH<_WYU!Ty&P|i8 z`o?8d8>ZKDm+2MR02k!QgZgKFV0Y;a?~NqK95qps^p|v~uI!}^c`J>QVv=od5t7yu zqKHdM;09XjZnYW@bD3L~j}*sa82FvPWCu`D#I*wlS{W?BPB_``0X?3?OMus)?%zJq zBd}<`y&sn&;Wze%HH3K?)iT_3MhyC;%P{$_41wc1crpcL$= zGWk}?W#m?wt$Xp`w;WtLOGoX8Y*|z09A*0M+AkULYei93W_Q(7wBrXi>`5>Gpm_k= z1}Z%{i68C&U2kGBo+e1(C_?u8t{c{jIJi+89;v^Hzn3#N#e2!Y=T20I`o~bJsMql# zP({cAEacc!k_Wx+`NU81VuX&n`$VHe?ZT^dr5sCMne6YfJV4&8z5w`@OU#|T8Y(O+ zxw4Mx$fUt%;JBBk(A8nGs$XrqN1L+E^QTj3URs=+hdhNj)(;cRdw= zwSU{D_6ArSHLorkD@3-V@5X0Hb%~8u4tix)G14n#-009AX~j`|w*woF9-IP(1D-&x z;t`g?HMZ}^?a5g=!bQpH@d{f}CKku9v~?~n{wh1m9X}eip)D~vp@FBR)#~aj_qAtd zXGMZz#GVy=@+KoA2=sP#8Xe-yks%OtXyg}^kZd!3k))y6rwW_8$5xEbM6&t!Dkq*w zlbZ&UoqL&%MVfc918(9M@Y&V zAF&^N%a`tbTHC8LuC8im8atJ&M9q5LKlxeA>nsD5i$C`Q?mECx4Xglf2WXN-)<^So zfz}#9#x~|4IE}a_4c_^vo#rz>8nM0Udc5@t{=-g`H07O^lBEzX^ypa!||8NO_B2#u}vr@0~gmma9aojuw*gZ-(oqkyh-fT0hT{ie#$tu1LXBxF$R z{r9-CM{ZZu;&YkE7D^F=vXCF;caDTwwR_&w#Yb%qRYfM26tmVam*!~I*1vh%5&brb>1BOtW(?n}`u$R&`Lg1=9EyieU^F zJ576lu~V9ydvb4fG2n8RxR|d}R6y+w&Qub>J?qvC zPiVI`Tyo0wphK%puJ_d!JLK&6RAjEPBP&}cMw(8bI>3ohtwbJlN3;+;=Tf-oG8!T5 zfZ)DoJUd(8OU+2$RULbM!7w0Sm)2gH+g%LZn z$)1KC*PB}MJGyU0{nmxIe2^z+p|Cl3pe@B6SzVVY9V^F`U?@2%G}8wtp-)YBNNZ#52Ok zoq8BaM)_YaOq@FOBD6H0&dBd{j&z}gc5;Z2W4N?u>%3-rG=(44wd)oCJ(l?$KPQ7o3aeyazyorS*&k!_$K^s)KE3%d)%?!rKT4*I^N1FrI=U$z zC%U1X+W!&*W0>Bk3K>jE5nQaUj@H)bu5tWX`+fRuYvxk{|3T12@tyEVnotK>&O!q# z_Pf}U@+*yBR0|#t8EA?*buk6Z3-{iNyKR04E{cVu?t_1O>#@IGl^zbQ9A@}kI;pP~ zMEw$D0g2}XKzup0`(4MNVr0E=+6&EyJex_k5coNH8lQ4n!TKl88;+j>dQH{QYt$UvDJ&9`x-(=m)(7=r1wDy?2964C{5Ut=kxAn5eNq zRb)QixkowVyvOOIzRPDe`Ym z_xrPcT{sloZaN@Y^~@9=HnrrKIYVLwJpoy(epwz&1s8; z6}C5@ZRtreUVtUm$S+H*5?I?T)i6OrOwxAP>ZGx5t7_ENSlNZL-#w)H@|OeU%b|6t ztGr)^yzfbWKpV;?K$Ne@8WiG%MetR0wZn|t_=pzKTL9&$d3UiwnOHdkayFZX00&Id zFEzL{^J|`qVB?Agy8W5XT^rF&T$1NK1;0IbM-#B@gqXH)$5vMO+ZBK3N{SoiFrw8w z`Pu#Dz<`E6%{~)hmPv=Bn-dgUR|Z%%sC?nrKwoA-FQ<0zqk^dTr)2aU8VivF*Nnw; z12-2&w4P456~-$D@ieta)x2B{wf7Xt1#F2^xN*y+t~+7p_X}G#4@q?WQwD=7tts!? z=g!gAUc9%bM0ug{)eW=i;9C*m5nN~Vu96i{JRn=;)flj21ZY#TeJj1zn!Sg>K}GTd zmM}qiOGyC3o|&?eoSUo*?w#Cj_#T)yJO8nH{r#uomzw5G;I`*`#>nsfwgl&ysrHi+ z7*!cjV0fcf{*3P=C^GGIR(K45V%m)ys(bOls(V(+jbH7{aDtqC1aDE>KRf%KAnfF| zSYliCEOmXXYWyQplUrzYE7WB#o)^oE;JMhS^lx&eKYiUUe9q%eC@}2$w6Ua4Ex+|{ zPuI=!HRw*^{_)$>?%asA4H*+GDFb6CJ7JyVG&{urq2gFFd8#)OqxWv{E=Np9cG4VG z^MRMvQEC6&42-7d*x%62s$8kSI<+`6{H6HeXE*A^bb&h6700~n>C|1HSQgLNRu71w zM=&QWoI$_V;B~x4xz#2(c!k`qU+S37D;p&8>S0MjbDdBkCM65Uwp}EvmEW?YTX*AA z>3hd6wz6d&3XbI7j7YPHV4XCT9ircg8&eCRCb9+EedM1ZxPo`(W=4g{x<-iIU&fBT z@7uGkK3v$+;gx&wuCtqRbvG7&X2XCakIhU$gM#Gc<2%lxTvn42PCkyyMv);5JAqu$ zdlE92=UvGz?x&(j(p^iyA%H>n{<$mb6rjVc+YV~-1f$UmdI3oaN&)5S<0fSC>*(0f zJWec4$a_~4(Q%s7{mP&Enn7l}1fHy~E>+#v;HMUq#ZQgOGi-s^qtXJnd0(vinrvCT zwl}`cP&zyDwElK=&4bm2pMlLK3a5;1^5d{0%~i~zV|`gG$*2X-#fb%0(`q%0-4z5ZNndB$ZAhJmQ9c!?#= zRqp`cJZxiB6mY7x^)obKSFE z1DjFd3{}~YZ7XifsIV}KOd@SMA@0B)j=YyD65fPg#ZPLSRP5qi6wDV?%imwBZ3cQj z_VS5sHv2>{$Lr*-RXL6uDA*L;n6G{ifvgWKJ(yNK5Z`cHW*0q1 zzM%<;T+7*TIQ9!O0~}v}t*NixO6>4LDWN4k$wuJ46ovd+KlITU2gd25C~pc~Y7O_11@;I;nZb?$&kwC9lpHy9zj! zHFbfNVdQEPchl{p?*8je#Ju@4r#*TcUEj%mhnL%kri@0!jxFtm&ns z()z|itQ6Brp(|3pZ$_lK;gYL zb?~TA+l|>7wg}jr?`tVqJowjEnE(2JD2G344*QIonCQ=K)pQMdhK7ze+ld(c+?-NX}l}Fiv{))m_nC=|mfYLIZDw_U*4w_6aoP|s zVF0W)uW<3>9-y|Jl0XVu2gcwTpzm(N5K~EFph*Cmh5B=_v5>Cq6{f`zGY%0I$EF&+ zrLdy$wDKkU(`=Tqeo@EbWX#<%JprW|VYd@1v(L~Y*NkNIlOs~GStH69oa>pUX~U-7 zFEFLuO)}2j{+3?Iw_ZeZGlX)>xL!Ei_fmB?BfHQ~NWndtEt!|=H{MrYl)Ew^w=dmc8P+cI#zm^$=2;bRX8NIJH1O8U%3(s@|qH8k@g@P<3X+WU`O zlhbwDzK&UlmA`KK2IU@ zPHy6Y6c5#q$IxV)nZZV+CJA(phjt}CZLr9Mu(g)GK_75o}0t__n=n@oFRBGote%OVooaO(E|BqS9EKDv*(Xasgf@9 z`>XAhPyZqlC%wv!Xc@`B(Vxrj0I|%S_s{T*{3RvltTy2C*_Z;3pv@f@&Tw&-(>in7 zROFalOCKXEh437DC>$J_-i3wB zd4`9@Q2W+(_*4f~PLva~yj}YHz$MmsvJ3aScG5_fB-V3cn@7I`32t0AaJ<=uc*4RW zLfU<|4uJY!zk(?q+28ltgLw~N^@sQN!K(X2>0#Bfkp7NI78woBwHvvy6NONm@ zXxpv*y#l|;O(3Z6g4d$bs=Y|#Q**M8L!a+F9_6>*N*@n?>S*6o2!s0{?HOiv(!?NS zC8Z5LyNBfN-wVTx6_c~cJFAe1a8=gR`ftL89LdWtwKS8h7)XdO4VJMpycm$tyH-!K zEkzf(s0QBIo9yR^@@5pNF+P~|6IkFw&VLKR@I*iZwYpgH^_6k*3gpc|Q*Ino7{77& zEfPbIh}?9ep}buchcIfmww81fx?O~w+G=QM-#yko$3Z4aE_^21+jY0dO}f$F2j z!J6L*91I0PsCgg7AC@JQ``jW-|OFUAkSBkUgnvX$KaN zF=4hE`P*{Q>*4KikvH`AM(oKYMt!z3KZfV*Lqhxkmc0T^ER<(n&%7hg43xj0kFW1q zLCqKeKa9C=l(+XJkF^%${Ux?YtSjj>Pk;kPpm=@cWr7K2rwm~KfW~?&##F>OVNPIR z_okO`dYwEEFBLk(|p8;?cESsmZP)GzrSYOQMRy}HS%R} zUqBLfr7G06)TrjUpr)CVZ(3Hik{_?*FXjDY|UFdmIi5Ip3+zJa4D{+j8EE4h-mk#emrDv+j z9?02%Hq%?QoeuR)wt*f(|MKLaoQs*LRQsdo)M}f0o7JYh{YRbOMb}Y$FwAKi%04kD z?m53*X{B7%W0&Q-;N77one)PGn;U4v1d?u;L$5jdw}XrVqknt|M9Z3N|u4;QCqdw+d zRA%MMtRyg8H8f0kpcbH-FuzrxD*IZ&$q56JHR_3t*MokeNzvp8pyY5diRA65?4x`` zKpkh&t9`&8B{A#UZ0`HRy9r|%hL$Lj1pXMi+jE$Y6$%AMR{S_Hk^}1xTUPEluX)JU z!Q!aM{8lEoDGIKQHAN#@X+mL@`jPWnb*>GveJGEOZeHv!{wJ**?{C62ODb{+l-uuUh# zo|tiO&BCfAjs`%0IK6fGH6V15M&flrq({YhOXEe4>D3(T{A~!mE8#g$jlU(PoIrI; z4vOVlSZeJZii1t>b00C2ie#+WS0WD~T3VIm{4bDuAs@@ln(& z{d$GY6K{&99I7S(Y!yhN)$r)NIEc4k7_6w8-8p-BpW7vKf9vc;3C*d>Rrh?;b@8Z4q5T|1D2fZ9fFCuG+PE(lrHWi7Dc$#(FsXV zJH3HCwIIHKD4c@qj%C`zRXbo;WarI{1l!QrTQ9rFMh^(}oRgJ; z62s5SGP_A*EK^db*HuT?!a3vom^9BpZW03#o;L&W{>msZ^NlR1#wkAZ2E%aKDuv3@ z{Y^Fs`fQwX2NGNC&xEgUpEDy3lD-cKi$lwfn;`JTN4vnO!BsO;BJ~tZ{WNL>U{FJQ z0bcj98w{HVCIss!kV6^L^EwXqp!q8py-WETyFJA*Ww11IgzCsC=%I<_zI6z7hATr`4Z#_#m>UPkZ)c_7ddIkWuH? ziATFJ@~epkGOc&AR4t#HiowBmDrfx&XlruFh}_hEM*~1Dxu|4$LS4GQ?+;QA1itcb>qUH ziu1`;ctlqlt$Vrd@gofn#b4FZBBdvqrt1+syWlsgh&~#;Z!dgb83K4R1_Ekzy)|e# zj6gRCM0Vk5Qx?4c95v(tb8{_dlGF55GhxX{9ejc;=iWRv^2c^;?nUYAbmKl?R(Ri3 z&cISOI~kQU6xAW?em#ncZfso>!b?(RCt9k{RK#{9 z>l=W}e>X<}=K60g4k;eO|1cW3_g~!$V$7%im*xfkKmX2LvqGbFQFT^%=dP>zuTv?) z-cB^P=KVO<)Kuf!22M$$NmA=2!~rqC0oK)v_aL=j0**g!LWJ3D?cfDE3F!l&u+3+H zYISI89Up?!>;X@&oq#x_NU||2-(lw(Ug9_v8^&Bsq(@zC)IVN;?O#9 zR4Gi9GJzz+|01hbCP1@gMCUNb2f)B3z`BwM3V)ILXaF+t#A1IA$QDqep-Uq@sm6d# zCml%X#WuLJQGvusD28~|0@`jGf(n#nD)D`cQ%XY*P_LD*pUh?pC)ioqi}sHLXR%-W zbhh{ZsqH(%n)<$UQBb4^2ug>DASk^Ef|RI869MT+i%2K*j+7`U2!tjG3P?miL`p=O z)F8e0-a_b|gc1S?@g8U9xp#if-1*-x_d`A$o`jREv-a9+ulHT+1S}F*Lj=ieF&E+-U5Nd$&D%NJZQm_?rWh064BZ2?jj=PyArRw>=x|1IKmmAr^1+& zz;gMg$-%`0Hk08kciT6;ce>^b6(XpxHaDi7XQJ5IYIr z2e0yRZgHsBx}S^1v%gxlvV@l4omF=5@GC8W0H9ziBudVE^k~syGB0m@@zg(9CjM5A za7gbFi820v1*jui_y7V=cAw4moV#mvTYMjBEe z0%=S-A`hYWyg{t6EsrtqL8S}%mB{h#X&wp?`Vs~DD$qr+b=T2-OEBrlNmzd2hmcE$ zN^|vRH|H5!c)%Dqf(fZ46<~v*3N&(IgD2jKl~XEU7P8@QAvQd@@{n7OYuPpEG&Bf< zU~pb*Br3U`*~`jETth02Fl_bNOt ztxvg@w49aG@KJJIOzH}kY4fp+^CeS`D)HrRFzYM;6%Lm<{>pQlTy7Fi5_CDJMFkux z-~UK@xwpli6$;isNXIRr4p&ez%Q?^ueOy|EA1Z3@#z>vQg0fsFzs2wuNvkI_;=FR) zr@&+?c4l^_dsidOMh`&S=r1!<4XLMJQA?8z;=rsrpy087x#DYXVareiXn#Q1;n*}Cx!4^(EZ+rQfzPi=WvEzZ2Cd}G>?MFg zcyPCy*tmDUV9ssNqJ&6@6rh4H|C$)lDI8n^)IkFS6+DmPGG z&;^;@BjDn7nCl6BEkR<091QgGc>vN(u>i$?6LexBYZD?1Fa*(XUOp?9UsG4cs=sc} zZ8D6;U+KH8&CirnqRI8~MJJ`gRg>LqF`y5R50JlZJGK2yq3uuzDzmOHcoO1D2+ae= zz&&$xey3;xB0}q zzQ_zfW;P79JfMZncRrTnIqZGvR(GgKePBxYvFP4aW@>7XDT!;i*bkUIo{WbNfQ-oP zBNc@(R_7_V1-`d|CA{m=PWqaTi4V#oje+15F7k0y=^ke7H-!!Ajob-13UL=}kB%;% z)}!w(V9n4Ul~`mLPxFzJvJ{=|%o>(AP-g+EL!)jpfVA_5d9P2>?EPHJ^LvQ&6kq*K>K^&r~VY6efkFUer z%%^%oeXi8kNn2VzT9C&?Yb%z@(^4$G4QxaL_3Zx~1mw#@9Uo(N3ZMn+rsH=U@|>@x z&+YXh@UM`{?*CT%c4$2)fq*)96_9T^l)F(ec}lJE{I(GHxMR$LMEtOp7x5~&SGsFkpkz+SAwWS?H-|$YYo$gnJWOB^ z?9$KfltmAWDg7wU16IXGIJdXe824^h^u^lSxSEU9#tqk(-Ziyli@xWameiD$P-JXW zpYyP@>%`y93AyCBHNV2`dn(D3i!mrbsd^J{|*^4cArpmhc%rFi&y0Ry=C8wlYXb(}7j+pwWaP#KH{+644 zN%MO2XtBOzw@fQSgu$zwn7L7J>4Iy8N>R&P5AojVupdG##UAb8%Ba`k;z)6^gKgW^ z+t0UZlw?p7LmOsa1l8alYr{()PxQ^nSoc0s)BIM#>LOBQ<%@3fLr)hX@{Id=3E9On<|n z;pjaxC16F_Oz)oFc#fC&XY?^%K+7@Yz<{O=zQ-oWD=T3Wgny`Dnm}T}OHY6xzS-w- zN->rfW;#N2{y!3Kf23=#HZ)WYZIwt!h+iu&tBU*bZzEMTKcza@Hd36`Qlhw7Q4?p}<_d_N6Wu18dJlhIPPrLfEj~Ev$E%1J4f~ ztevEO6St8jggtnxc7rzebKvJEpDp3knz1~^)~_UeK3+GhJ+^?NN1BXN?7KpDF)%KI zPdn?855WgAM7nn_ui1R2J8w?I`+LtP*0?Sy+WAZGl;APb$bQHx&a`$g)h6gX>D+uh zKL!@Ly;~Yq5nemz~}t6O@jr>aVu_uc!sJJ&M58?2ObLdQ>L9{#AR z3oTR&8OI>tXbz=d9Chn+SY(|H#vGR)9B&mvqfv7$xIL zZ5i))-{m2v)iK#2bE7va!DB&8c-NwC@YBfF%9!XvJoKZA;w$JI{*YsLTtu~TWhD)} zqV64&xDZ1ura`Ex9RzP~O=`;mLm1ZhGBEJeEi08_Z=*(8d!~Xtg4a!V$`r+zmz%tl zz=jqLP&mWVPKyEdb}&(~_w)#VMB+m~n~oq?ZNb*LV4G>Znf|>%&qWvc`Y`g{fuO9! zz+tb@!tK|xyDToiNL?kp92b>q!zmRzNzPx@#Ad%!owa*yRzvYbqla2l8TuI+$1?Bu zf+R(}A94-r(d>49uD?~~!fXiv(K7b^9AeABqMNok$WtLTxB%p-as3sPpW^a9-pbKD z)5cw+X7ki<=BrlM5#Za^y=MV*o4yuy%z^x~1OR@FYE}%emo7P=fW2H1cFOSlCjWCZ z^8w^7SP(Xk1nv2#@BqQ;{y4D9dK4~jo_;t*qUI6BzyRt;!y%Rp%Dk*Z-Xzv{c$u8g zvartlv>r764Gsb3@(kPY>7$MUs!1Pmfof6mchISKdFAcQVY}8rlL*@5gX; z=8A_uQcU2a6RbxIijAZYT!lr%RG{dUC-gn1MMAh}ZzrHR7y48aDUK}gpDP)87`3@|t(lVgEQ z3?mLZma7FUhk3K+Vzj4$s6I2_9>zl!4GP2!n$KZ_kX{Bp* zi7Gw2zic)JGg8J?dw@ITqJcXx0lJFAK>sNe^5)9vIr0$VT>my5*0cq}*j5H~4<3*9 zmXZgF5>p{a!Ihi8DMoj7Cif~&F>#Zt>|h`@|A$#~ZnR^t<=1J4%G`-69a2A^SA5Ak zH$a*j_7mx4)2|r0MJy=t*uJi{y;Gbk)lDCxDw1>aoEg&v{zNs`z;*yHAYZebo*^Jx zPTHeO#0J{wr&>u>9?Z#azu7&zE0jrlN&}RfWVC)$s71rDX<$-@21y}Z??e=c-f70J&0Cl)H{fPjQQ7kFLAkT5k$)^M@^Y zL^YY@n@GPM1VP64(L`-nXGaL|TuM=9z|J~Zc*2D2*NaABwE_syIFZ%{QP7n%T~0hQ z=-Vlr;M2RObUX)Sa)QG~T z5NbW#6V-5rZG(+5mu&SeS)Vheq&TzUDK*sq>`?!sZBBw5szb;(A%L%R?3pmK@T4t- zK@9;)tDz7v|JZch@h_XG17|vE#hZq>Xis(U5|AbAbfLE4Z2M$J(yQ;XyIAs#Q^~&% zWZIi69@C0=DUYf3I_~bpOBfjp=DETUc^aQk9t1j=Qmze22-(?=591dvrdJWZBCL2F z)|rJDWG;B9AHPMqTT%;D_1FQG%Okzi=B7D099v|OLrVYkl7vD%XO@n;2FtddbT&qI z`!AG5c2NYMTZjWQAfurHGM~zKqU3|M}Py4@1J7gn=5dY&p{YIW>1UjYX0TV*>TVN6k34rT`-vjPm zMaTy$MAqcL>W_wDZr+}%OGi$hivqkW{6bxQmg^s~ z!89rsAR7#;+#raMSxuY4Y=Iivh)MMHiQ39Le7^|bDgE6+@vqF6$BjO7#i_3wSe}VyYJ;|1%TTMS;pZJ-$!GO3q^u2lrH`%tH_I^ti0}REAqvn+Aif`> z=ql#*y?x!(p{jB-+vw#VJAcG-+*K-03~{%~G~&Rq8EDU{YK>UVxR($u<&iH2JL6fcKO>JjHSE=tH8hjBixL2&=7A zU(yOTvt)1#6$Q=)K{cT(+28t=#yqMme06soIeHg#C3Qti6$W-MXvBtH>vg*wL((q} z%z_%*h3hyzPT&4)aF353?jL@)Pg&#u^gljLmoaEsp}9p6cu!~}Fs+89*Q@aF6&K@E zvGJ8)*e?#AlmbG_Pkzvz$Zv`x`>^+>eXH_a>?p@A`(Q}U-p=zt&MP+xdUde*5HA8b4cWZldxeRj}&;nZ4O#sYPWlH%#hBEn`%O~dO~kgeKn>jkJK-#O}(K2zGe z?c7hFH4y%~@8A2$?vpQ;m2ZJYB*-y0z=?0c1NL({_5H7F9@wV;5qu%mfAHZlzS9&k zfDf~%0Bh}4F4|?!1?9>LvYl+WaBUAC^uv)?J;0qTY70lm-0G2>$OM<=iPV-PkmBoj zIg2^#hRt~-{+=y@TpdH@fMQf=frRfJw!d}m644PKfF~yf<%O1Y?S~|&u*LRFRtLDD zKUQ=H#rgR{=tgxdPHj@PVPFdR$y@?(0;AMW^@3$LvgAyS;|wj#@yVa`xyH2ZXM+ z!hLf7XnU&Bh-I+@@vzE{$O()|$E%@F&+npkV_{@jjsJY1OTLfyBKrXkAnD(_2<)tY zE&_KVnNS6E5g5V#c?s!I&V+po126g1I5xTQ>k0Krlb63s>&(;T;ZJfE- zoQfOob_pa#h4xI^TRx>XRmQ2}-2s2mW3k*kN}DQ4_&P`M1~!12h;`|faB|Z+ZOVHs zuBDciP7bS|w)^go)OtqZwOw*V0Q%^Uz6EE_Kdy?eIJfSL;e{rKU1m0Mzz*Bdz!%nO z&5Jush~STCZIHo+Y!|deb$VSQ;LG<1Q5UY7?1({Q!dT+U?Na6d@LX zrvhWq|9L(54661-PH%J_T#f?mNriz(GDBo;tH8=dovgh8oLrS0Dp33*yM~v5{)2Ab zQA@!I7K){%tmkJ87a4!eQZ5F(GQ2lFg`cpPRr_k@Vs7=Ts(u)Gt^b{m$Bn*DLm_G^ zZ|{q~s7W^10awFsiU#1YLKp@8^U{7>Ft2|EX-jAE=lKLhH3B^Y2@eTe3wlhO*ueHS zYnd_G4zcYL4<(y#*GYxk*Lz&z`AsN~;(iG{e^&o`@{$Pu$uf6%Rtq}2CU zn+l#$TqvCFz07Cg+&vpG7)Hak_BqCZ?_bPIJELYxXl_X)C^pqJ)Otpm`EF{7r_0Jq zlxn+CQ**S*>_WhR!dHJx7&y><0A)typQ8g{^U$>BjwV}+Apo3mO)211nke=U6MDqqh+i&|2;DKsX zNiHS>Uw{65p_%xi%j_(=F7AhgQstAHao86!Ko}V5ZnPJl9Wt2OVAU)LUx|0lvnD!Z4LkeM!w)s9m)7$cM zXV$W=4ajQK(a5rvjk!`WcQfB~n7EzgDL?xn6bjNiMJn-pwOCJ!(!%jnriFTo_T{T& zohxEt_TuW`4xd)v5?m}ly^HkFJB9i#1xY!GR(R(Yj-M}C0y4#4Baoi~Q=H5?29=ilzztS55CcMlgJ;d&9aw zKfh1P<=WBf7bjLed04XDTOQIq`{G*_s3PF?mhY*FMK4QBDraP>eo1+7_vOevd59B> zt24!9+P(3B9tNpi-Z{knMf<=>H{if)@|)sTu<@1EoW-hF8SSaOm$loV-LpzAQdXow zx8)S+8{%e6t>?+_e{tiBB_hErK#CGW1|^#hx%$yr$?FcNiIJSL!sh6%n%Y(=*)1l9 z3Xf`PO)Bd;V?>6d$}>65JywH5@i4CmeTeJ^ga_pmYjuBvOK%dkU0K@Id9j})dhrfe z_6#4y`B8~F1LLFd>OhYc^N;N>MGyN~)}op@^CuccVYy;M)?Bw~pDgY_K9|f+?EY0! zFqp#Zjuu2L^|5zqdvt!ha^;vvRAGFBsydhxAVe)N##oCG{N|xz>Y*|Zu;`Z_>KW3B zi7LnWXW%~#q`Bp+CbHwyn-6Z?u7PYBV^J;U;|UEygoM@x)|h3GURq18^@dmNr}L8z zk2$^f&f9l9jtSy3s_-zpxV5}>j8p;YuU?l5da8@_eb6_MS!6EqbQT@3&;w*@5AMUHs0-w^Mfj)d^VqptSTlD?5y08w;((!2NyFX>f4%htJll?;JMf;VMwZ8Pacc{X59O@P_=0HD!_Mdw3|F4&b zi@9HAX}*=2^#h^un&|m-!9E`LEB5k-RO7D*5R3$1!BTS#5)=8Jjf!z^iX zPS+^086K}@V<0(X;J-hC+I9)D7usHBZ!#flLyN06*MLlsB*X9-#Tequ(^hf5bg}=6 zs9QjRWyHmrOTwBR*+w6$sXyk(TMEC7+3}NzvKEM%*F|6$88#)IRQM`}i;Hy*tNq{| zF`soxK1oONHF(xm_en#)VL>f=j3JK(S4Nd&zrvi&niVaS8XhG*yZf!x>srCuh7a7w z>iQ$6;flpkv+Z~SBr2h? zcawJEl2>JzFLb!mJ(U8>P#&mMV0W9c1R9{T7R{V;1%KF?)Jz68140-E*>V#;c3T*d;dLbBp`gXU4^ zfsr#RXU49EPdAP63f2W(uZmDBlY8!0`+k%~{{G(60`H#c>y=mv*%bsM*!Boe%usHq zTGV5j+z40(P6&M1oxEl9N4ek6M6`aOG3>Mwq2me(Ts|vTR0;96I_Scbpt0pX|thwgNqiy}hLnqtQK1-Vk zlcw#LNZ=8rE9Z+pTdozB2o~gb`zRG&Yh!(2@5hvsdXb}1;4Ig;>;}3V^y^e(0To38 ze{tH)pB6-Xz1~wgm#W$G5MFB}eEaMC3n}X=H9AHewe}oE$INHnj9)v9-?D(}77L)~ zg96$aU)4ml*ke};KW#{^&k10+SEofeaoQG|TKBuJQY3ZpQB!BLAOBE5T_jPBh1^?= z3vNYSDk;yXoqhPLymh$zLGo5N-L-7*p}6VqjNJ2?tDkr`)r`J28LT*5-WOHlRB2=A z>b0KAot@IFI8@PrOjJFFL{*Kon^nL#xR!$5wDOX>SY5Inzl@*lPI;zD0skhU3tdN? zCz$mA;=M9-z;z~8N9Ej0nvDtW(jy^(Q>a7C&4JfKfuCAe%!+)Cpk3>VWJHvnNyvBs z0I35YV5r4oAip96ugqFK9PSmu&wZ}_80{d>#?B#dfCL8chWqNBA%JzTl~K$T-h+T^OC4s-1}}6k*TiozHsSt20Xr1DaG^WZP<8h=Y+YOT>`)1Lotr18S3-RTRUQ1QAjbS3alC zuqAFAR9{yg_!Mw0KljZdG3Z0=t-j4-hPacU4{NhY}bRts1RaN3eZ)0`GI-MKiL zm5>)GE`kumEJgagg+^tbH=v53{Xl=0n4y`x3Z8_`YqX-LRPky9As1Q8=1=J`7gvx1 zM*;U03uK4*e>(aZ^LJeBIIm#%Li%~cN&YRVSycfU^&hR*QUYi1nHWgkqyBoW4m~ds z*T5c#YC4IlYDyU{KDfxHpP^e_K2%;gJRiPhv!u@vFR9l@V^76>C|mCJ?uy)qe?|GA z`EQCszQF|Paa6zUB7h2?A<5!m$+S0f0zH~>k9>hiPI8=xIA#SYw_EteSj~@jn>CF; z876;xjSDYE45l{%l&EF^t0L%`j2`MRHa}O7E7)W{K6$r;u(`})-C3Ox(ig+2KC|Q9 zl3B*P@-ra{RdKrs9fM->^Pmc}XieN`xH0sqZKKiLQmv{hQA2Q2AkN^C6v!)sKPjo# z#yl5C@u!po9A3PWNkI8 z_3?W%CtHC0))g(%&E3zG_ha@E5#Vx-=Kd)by%A&>h!78Ey7#3kadu%UIN~*sRBp0uXJ)0LKG}(!g(}p zmTyf$U*)FPJm)+xp?*Q~%O>eyBhwZVE<#|=PUe}`p?TxU0@ly$;9E(?QCAPo{s=jP zO9P7Imt~Px)_K{-z~zUGbdbulB2~QeXQEhFS;3=@7|{C}dpd?YdpDL+Yur$YK4P+p z=79Ez&A&V|{fFS>|L{I)WgOE+bEC?&I~Qz=VUGQHDc*qN1`D_8goS>+5Yw0Bjw63_ z$6q?;N6qQR4b_YC?%Z<|$GGX4huUH5=IS6}H!3)(nlau7qC1`$Scdl__$<0T(=jx~ z*4I_-IrgN_J#njRGAnhwbSLte+439Fz|MJ7<%ixrh6#F`J;z1O5-rAUhHaR1Z@4{| z*3`_{(dT1(XA!?x9j8FOXt47~Q$vClYyp5|v4Jv%KuQwNWq}lE_I8hL-0ErlOzAZd z;ZM^P?_~vQMe>q#2-N-vD2l3d7b58k+oO|uuSzSaDYXDnQ@CqnH_c`4QQ#8i6$P3_d6IIuD#yR9Oo zt(y`)(47>1NBaBKLWUqJUZ{kvaek0X(523O=b^8g&rpGjSJ+q=c|C$Z{LD=)$W6B( zj@4+q(#FXwBs8Hf29|8LniLjkKyC58()$LHeRG(leVgc{PZd8yTE0APjl9rDcd?5K z#7OeOS*gD)b_vM0#*QJ+3#H?EqzA=5Cf^v_zSyjkD|gT2uBL%pco@VA>j9J^&JxZm ztKHILFrO~Tp{c6bpWF$VNSK2k7oqufaw1+PdWwLXQDsrh3A9kUZ|hm?k#tM+%v$1t zDT0`AW2>%$gR6G_t-M{uqut3oF!Qi=q7v5{xoaK=v>LYDZTd?^#K|9RjTl?r(O{C5D4K@7A-*nwqV!8 zmS*Bosmb*&%f876?H<6J$yXSQ6>1zL@R6?8@G9Lo0zskRivFIukm;k{EkIV`Hw9dU zCD63J#`?pT&8a7-@57pMl`AVwqZb~3N{qk#ls;r~BUI;7zKN8}k^jz-Y?FOZCEG<4 zUUa(mD+BM8bi?s<^L%@UVz;SLKNb4H5IqbkDqZhIoiXOrb(S#Jb)r=f3=*`HU_sQb zNWbQPdc(6_#gT^wnX9A&0B`_GvzQ$S{grh!y#2x0!L9lj=VF@=PiKBeWl*_0(B{z8 zx^Fqc$5DY%&37O%bzr~GE~&A8c~%hIS8P6BsJ7LtT=aV z*X^q_ejDm0GdH8X{Gc`ZF7JJ*H1{0%hz6qpr`mdc+M!Qhv*(=6OPANQ>jv%&mURPR zJ8vs88*c0zr`EHs#sVchW1IsRK89k5f^TOnAE54p>Xc8=s<)H{b+g}n5{|iVN1vHF zzhWiR2D+^D1V?9r6DK(vRh7*1NVfPsDB5wVLWOR^5aQKIHB43=7uznjo#^2=iC<@!UF7SV=W<`eQq0Em41t}IZ_F#xz)|1F z$db78*-*iko@1qMk$n!z>a%%9H_p6giDpmU3s=dlAy{Cv`>6o)@Cin_HgHcB;@Mxu z0lg6J23-E?+KvKCZ@pbS2&Q2`o&QyY`Z)Nv{qCid3T&dF5aDiF7{EsE=aP+k7E0`09(=#$()Xh0TTc(z~Z!!82kwM0;qoSz+{yj zVvn(1VUN^*h;FT_gdXU|;GM?tk5d#3Q6$Da72I%bTvmG*2x}y9ECT_Ga^rIVeLBy} zv;)Q>h|7NgR4bDgAZ=nI&E~t|zVf0r1FlM3!Cr1(xA&f=-xPl}_&q7f#=t=OQx#W= zoZdPhkIeWwjE&GgKaHXd?A9hv42aJu2$mBce0R6=TnlLFYNr2$4K{sC&?eImiC_YM zOL|y+E=jRc=V6n+Z0+m@Tbfs4Jp5U@qdNcBnS83V3KZl1Y-|tXuG8cPS5^7B?G)J? zq~wd_G$|=AQqIGs_VGV)oX|S~Q96-PUuMJ$ic|$s@hujrQGv;;-ZCxFeHoj(ovn5x z=F=h-p>c@G zQ}Olb07)TxtFw4LiKZ){m#}i7SQXy2=g4Lx6;+FnKJ2MfnfZEgV6LVNNEj8z=wfSwF!xwG9?g+}PsMeuu22<9Z!%63g8g#(4!8e1<*Nc7@vJmPYQ57BB3!l=Sd=^Lid*q|{q#Y#?)0r?2SV<9lro9`Zmh(LfFRkTH5pdIkt9*Q%Zge@@4fWD9@iJ~Mag6)DEe~St?cB|67FZoMlg1w(y zL6EminRx%wOVOSS^xN?8yNy&76l;rw+w+7lk#5}0TkyasD=<;)P_MkVxANW|shA8g z=HBk-aZxE#zoX7+K9v`IWQ+HCUNv4jam=Vgh{G)|IJWBqGj@nr9oOzzJbj79+ z7~`~+C3M_C!@XZ3>4s4Zm2@Jfq$G#-`F)CnH-rG9e~31OmZU-`TNJ4WxJu8)#Os6> zy4}EfZ(4>$MXpz7(_H#+*F%PZa!ZVcwy^FD-n30(QUW8<-utZI1P2UjKP)yFZ?dla^a9BLRYqs-J)=pyL7{HfNEx#sNC3}IC-6F{$b_DqCNqbgZ$0R}{n(&u zY^?8s)N5*IcF{9e6FI)CFJ`q>7e2e$rT7s0?>>GDI7K~L<$3%S5Tw_VEmb100?Ugi_@M5y_5?B6t0Pa#f#e6Zu~p^U8Qdd z``Vp^&cQYBau=d3pPrUkhay9$uo5vU!cK@whgO%6b+(^dm)4K=(3Y;1mhw%%R)U_K zE^?>zX)534*If9tsa~wP&YKlV5aW0kZIJER2^>rBON{ zn>l4^F3K7Hl2*6-mh;CUVFj!Sv?_$olwTe{* z>iV&w4cwK*7-!i+6!WZeDWqF`QapTGmA=^)G_xarbx*R{+2jC85S&94ID;>Noh^7A zjmfiPVs&=dxeb(q1*}rH%!)>EFKsy?`0O;>>)Dq>z%posl=lDX=L%$L4r3UrWAO<6 z6zD1K{5YdKC4JOFF;Vvi&BM3e#+l*w-%983u>C?$Zeora+5O(sQDT;{By#{%S#tJM z>gNCYG?&Jz@=WzlONQqrex<&Sx?bUBX>WIf(V;b0Xbs`X9v*wjtT8u`+?)TZjtl-h Q`RNaR^8e+<_OV literal 52050 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 AGynhq literal 32504 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 Date: Sun, 18 Sep 2022 17:22:11 -0400 Subject: [PATCH 10/27] Updating README --- README.md | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 5de76a9..a55b89d 100644 --- a/README.md +++ b/README.md @@ -32,34 +32,21 @@ In this project, I implemented stream compaction on CPU and GPU using parallel a 1. Naive scan 2. Work-efficient scan - - Step 1: Upsweep scan (Parallel Reduction) + - Step 1: **Upsweep scan** (Parallel Reduction) ![](img/upsweep.jpg) - - Step 2: Downsweep scan (Collecting scanned results) - At each level + - Step 2: **Downsweep scan** (Collecting scanned results) - At each level, - Left child: Copy the parent value - Right child: Add the parent value and left child value copying root value. [](img/downsweep.jpg) - - - - - - - - - - - - - - - - +### Performance Analysis ### References +1. GPU Parallel Algorithms Course Presentation - CIS 5650 - Fall 2022 +2. GPU Gems 3, Chapter 39 - [Parallel Prefix Sum (Scan) with CUDA](https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch39.html) \ No newline at end of file From aed7737d3a69626b0e55388d3d7d45b8e7c8f9aa Mon Sep 17 00:00:00 2001 From: rcj9719 Date: Sun, 18 Sep 2022 17:22:46 -0400 Subject: [PATCH 11/27] Updating README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a55b89d..b1c2b89 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ In this project, I implemented stream compaction on CPU and GPU using parallel a - Left child: Copy the parent value - Right child: Add the parent value and left child value copying root value. - [](img/downsweep.jpg) + ![](img/downsweep.jpg) ### Performance Analysis From 0339925e9abe91cf19501127483cc037461b65a3 Mon Sep 17 00:00:00 2001 From: rcj9719 Date: Sun, 18 Sep 2022 22:27:43 -0400 Subject: [PATCH 12/27] adding performance analysis --- README.md | 17 ++++++++++------- img/Parallel scan performance analysis.png | Bin 0 -> 23643 bytes 2 files changed, 10 insertions(+), 7 deletions(-) create mode 100644 img/Parallel scan performance analysis.png diff --git a/README.md b/README.md index b1c2b89..31dde7e 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,10 @@ CUDA Stream Compaction ### Introduction +Stream Compaction +--- Stream compaction is an important parallel computing primitive that generates a compact output buffer with selected elements of an input buffer based on some condition. Basically, given an array of elements, we want to create a new array with elements that meet a certain criteria while preserving order. -The important steps in a stream compaction algorithm are as follows: +The important steps in a parallel stream compaction algorithm are as follows: ![](img/stream-compaction.jpg) @@ -27,16 +29,17 @@ The important steps in a stream compaction algorithm are as follows: - Result of scan is index into final array - Only write an element if temporary array has a 1 +Parallel Scanning +--- +In this project, I implemented stream compaction on CPU and GPU using parallel all-prefix-sum (commonly known as scan) with CUDA and analyzed the performance of each of them. The sequential scan algorithm is poorly suited to GPUs because it does not take advantage of the GPU's data parallelism. The parallel version of scan that utilizes the parallel processors of a GPU to speed up its computation. The parallel scan can be performed in two ways: -In this project, I implemented stream compaction on CPU and GPU using parallel all-prefix-sum (commonly known as scan) with CUDA and analyzed the performance of each of them. The scan can be performed in two ways: - -1. Naive scan -2. Work-efficient scan - - Step 1: **Upsweep scan** (Parallel Reduction) +1. Naive scan - This is an O(nlogn) algorithm which iteratively adds elements with an offset. +2. Work-efficient scan - This is an O(n) algorithm + - Step 1: **Upsweep scan** (Parallel Reduction phase) - In this, we traverse the tree from leaves to root computing partial sums at internal nodes of the tree. At the end of this phase, the root node (the last node in the array) holds the sum of all nodes in the array. ![](img/upsweep.jpg) - - Step 2: **Downsweep scan** (Collecting scanned results) - At each level, + - Step 2: **Downsweep scan** (Collecting scanned results) - In the down-sweep phase, we traverse back down the tree from the root, using the partial sums from the reduce phase to build the scan in place on the array. At each level, - Left child: Copy the parent value - Right child: Add the parent value and left child value copying root value. diff --git a/img/Parallel scan performance analysis.png b/img/Parallel scan performance analysis.png new file mode 100644 index 0000000000000000000000000000000000000000..a4f54d7351455411f891f1958299e5870ade2c85 GIT binary patch literal 23643 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 O81G}go;4n!*Z&QVZJG-J literal 0 HcmV?d00001 From c6d1b63f6be69a48b8fb05783146dcafa16c9607 Mon Sep 17 00:00:00 2001 From: rcj9719 Date: Sun, 18 Sep 2022 22:31:36 -0400 Subject: [PATCH 13/27] adding performance analysis --- img/Parallel scan performance analysis.png | Bin 23643 -> 25054 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/Parallel scan performance analysis.png b/img/Parallel scan performance analysis.png index a4f54d7351455411f891f1958299e5870ade2c85..8b1b23665db3686cadfeb5715b916acb07f0771e 100644 GIT binary patch literal 25054 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 MMp_sbUc`p|3-~=6cmMzZ literal 23643 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 O81G}go;4n!*Z&QVZJG-J From 99166e591295730465deb615e10e8596e032927f Mon Sep 17 00:00:00 2001 From: rcj9719 Date: Sun, 18 Sep 2022 22:33:20 -0400 Subject: [PATCH 14/27] adding performance analysis --- ...s.png => parallel_scan_performance_analysis.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename img/{Parallel scan performance analysis.png => parallel_scan_performance_analysis.png} (100%) diff --git a/img/Parallel scan performance analysis.png b/img/parallel_scan_performance_analysis.png similarity index 100% rename from img/Parallel scan performance analysis.png rename to img/parallel_scan_performance_analysis.png From 660bb80bd9b58053013c8b4f8b5d233de725ed3b Mon Sep 17 00:00:00 2001 From: Rhuta Joshi <35020308+rcj9719@users.noreply.github.com> Date: Sun, 18 Sep 2022 22:34:22 -0400 Subject: [PATCH 15/27] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 31dde7e..25e4cae 100644 --- a/README.md +++ b/README.md @@ -48,8 +48,11 @@ In this project, I implemented stream compaction on CPU and GPU using parallel a ### Performance Analysis +For different block sizes ranging from 32 to 1024, the most optimized performance was observed with a block size of 128 or 256. The following chart shows test results with block size of 256. + +![](img/parallel_scan_performance_analysis.png) ### References 1. GPU Parallel Algorithms Course Presentation - CIS 5650 - Fall 2022 -2. GPU Gems 3, Chapter 39 - [Parallel Prefix Sum (Scan) with CUDA](https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch39.html) \ No newline at end of file +2. GPU Gems 3, Chapter 39 - [Parallel Prefix Sum (Scan) with CUDA](https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch39.html) From 93ea1c2314503c6367d41d395b363d24f32eae38 Mon Sep 17 00:00:00 2001 From: Rhuta Joshi <35020308+rcj9719@users.noreply.github.com> Date: Sun, 18 Sep 2022 22:57:04 -0400 Subject: [PATCH 16/27] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 25e4cae..9245635 100644 --- a/README.md +++ b/README.md @@ -48,10 +48,14 @@ In this project, I implemented stream compaction on CPU and GPU using parallel a ### Performance Analysis -For different block sizes ranging from 32 to 1024, the most optimized performance was observed with a block size of 128 or 256. The following chart shows test results with block size of 256. +For different block sizes ranging from 4 to 1024, the most optimized performance was observed with a block size of 128 or 256. The performance below block size of 32 is really poor because warp size is 32 and block sizes lower than that can force it to perform operations serially. As the block size increases more than 256, the number of idle threads per iteration also increases hence decreasing performance. The following chart shows test results with block size of 256. ![](img/parallel_scan_performance_analysis.png) +Based on this image, we can clearly see that the CPU is taking lesser time than the GPU parallel algorithms. This can be because of the following reasons: +1. In the current implementation, number of threads hosted in each iteration of upsweep and downsweep is the same. We know that in each iteration, many threads are idle and are simply returning without performing any meaningful operation. +2. Even if some threads in a warp are done with execution with an early exit, they have to wait for other threads in the warp. When this happens due to conditional stalls, it is called warp divergence. This can be avoided by warp partitioning, such that threads which are likely to terminate together are grouped together in a single warp. + ### References 1. GPU Parallel Algorithms Course Presentation - CIS 5650 - Fall 2022 From 24c5290143dbaca048aed13419bf38ac318ec9fb Mon Sep 17 00:00:00 2001 From: rcj9719 Date: Sun, 18 Sep 2022 23:13:12 -0400 Subject: [PATCH 17/27] adding stream compaction analysis --- img/stream_compaction_analysis.png | Bin 0 -> 21273 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/stream_compaction_analysis.png diff --git a/img/stream_compaction_analysis.png b/img/stream_compaction_analysis.png new file mode 100644 index 0000000000000000000000000000000000000000..cf19f588f52809f59c5ab51a7b128570de0d0a1e GIT binary patch literal 21273 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 Date: Sun, 18 Sep 2022 23:17:25 -0400 Subject: [PATCH 18/27] Update README.md --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 9245635..8b397bf 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,8 @@ In this project, I implemented stream compaction on CPU and GPU using parallel a ### Performance Analysis +Scan algorithm +--- For different block sizes ranging from 4 to 1024, the most optimized performance was observed with a block size of 128 or 256. The performance below block size of 32 is really poor because warp size is 32 and block sizes lower than that can force it to perform operations serially. As the block size increases more than 256, the number of idle threads per iteration also increases hence decreasing performance. The following chart shows test results with block size of 256. ![](img/parallel_scan_performance_analysis.png) @@ -56,6 +58,11 @@ Based on this image, we can clearly see that the CPU is taking lesser time than 1. In the current implementation, number of threads hosted in each iteration of upsweep and downsweep is the same. We know that in each iteration, many threads are idle and are simply returning without performing any meaningful operation. 2. Even if some threads in a warp are done with execution with an early exit, they have to wait for other threads in the warp. When this happens due to conditional stalls, it is called warp divergence. This can be avoided by warp partitioning, such that threads which are likely to terminate together are grouped together in a single warp. +Stream compaction +--- +Stream compaction shows a similar trend when compared to scanning. The following graph does not cover stream compaction tests using naive scan method. The behavior with respect to block size is also similar as observed in scanning, described above. +![](img/stream_compaction_analysis.png) + ### References 1. GPU Parallel Algorithms Course Presentation - CIS 5650 - Fall 2022 From 3b4f84c478646f2e86b978e5ca7d0cf5ad7ebd0f Mon Sep 17 00:00:00 2001 From: Rhuta Joshi <35020308+rcj9719@users.noreply.github.com> Date: Sun, 18 Sep 2022 23:18:54 -0400 Subject: [PATCH 19/27] Update README.md --- README.md | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 8b397bf..2daac54 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,11 @@ CUDA Stream Compaction * Tested on: Windows 10 Home, i5-7200U CPU @ 2.50GHz, NVIDIA GTX 940MX 4096 MB (Personal Laptop), RTX not supported * GPU Compatibility: 5.0 -### Introduction - -Stream Compaction +Introduction --- + +### Stream Compaction + Stream compaction is an important parallel computing primitive that generates a compact output buffer with selected elements of an input buffer based on some condition. Basically, given an array of elements, we want to create a new array with elements that meet a certain criteria while preserving order. The important steps in a parallel stream compaction algorithm are as follows: @@ -29,8 +30,8 @@ The important steps in a parallel stream compaction algorithm are as follows: - Result of scan is index into final array - Only write an element if temporary array has a 1 -Parallel Scanning ---- +### Parallel Scanning + In this project, I implemented stream compaction on CPU and GPU using parallel all-prefix-sum (commonly known as scan) with CUDA and analyzed the performance of each of them. The sequential scan algorithm is poorly suited to GPUs because it does not take advantage of the GPU's data parallelism. The parallel version of scan that utilizes the parallel processors of a GPU to speed up its computation. The parallel scan can be performed in two ways: 1. Naive scan - This is an O(nlogn) algorithm which iteratively adds elements with an offset. @@ -46,10 +47,10 @@ In this project, I implemented stream compaction on CPU and GPU using parallel a ![](img/downsweep.jpg) -### Performance Analysis - -Scan algorithm +Performance Analysis --- +### Scan algorithm + For different block sizes ranging from 4 to 1024, the most optimized performance was observed with a block size of 128 or 256. The performance below block size of 32 is really poor because warp size is 32 and block sizes lower than that can force it to perform operations serially. As the block size increases more than 256, the number of idle threads per iteration also increases hence decreasing performance. The following chart shows test results with block size of 256. ![](img/parallel_scan_performance_analysis.png) @@ -58,12 +59,12 @@ Based on this image, we can clearly see that the CPU is taking lesser time than 1. In the current implementation, number of threads hosted in each iteration of upsweep and downsweep is the same. We know that in each iteration, many threads are idle and are simply returning without performing any meaningful operation. 2. Even if some threads in a warp are done with execution with an early exit, they have to wait for other threads in the warp. When this happens due to conditional stalls, it is called warp divergence. This can be avoided by warp partitioning, such that threads which are likely to terminate together are grouped together in a single warp. -Stream compaction ---- +### Stream compaction + Stream compaction shows a similar trend when compared to scanning. The following graph does not cover stream compaction tests using naive scan method. The behavior with respect to block size is also similar as observed in scanning, described above. ![](img/stream_compaction_analysis.png) -### References - +References +--- 1. GPU Parallel Algorithms Course Presentation - CIS 5650 - Fall 2022 2. GPU Gems 3, Chapter 39 - [Parallel Prefix Sum (Scan) with CUDA](https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch39.html) From 0660ebb0ff16f0a4593a8ff3276dd0fd51501f7c Mon Sep 17 00:00:00 2001 From: Rhuta Joshi <35020308+rcj9719@users.noreply.github.com> Date: Sun, 18 Sep 2022 23:20:07 -0400 Subject: [PATCH 20/27] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2daac54..d5609d5 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ In this project, I implemented stream compaction on CPU and GPU using parallel a ![](img/upsweep.jpg) - - Step 2: **Downsweep scan** (Collecting scanned results) - In the down-sweep phase, we traverse back down the tree from the root, using the partial sums from the reduce phase to build the scan in place on the array. At each level, + - Step 2: **Downsweep scan** (Collecting scanned results) - In the down-sweep phase, we traverse back down the tree from the root, using the partial sums from the reduce phase to build the scan in place on the array. We start with adding the identity value at the end of upsweep output array. At each level, - Left child: Copy the parent value - Right child: Add the parent value and left child value copying root value. From 346aff89e4bedabe68a2e777ba2badb291e7aa17 Mon Sep 17 00:00:00 2001 From: Rhuta Joshi <35020308+rcj9719@users.noreply.github.com> Date: Sun, 18 Sep 2022 23:21:53 -0400 Subject: [PATCH 21/27] Adding tests --- README.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/README.md b/README.md index d5609d5..18a5488 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,54 @@ In this project, I implemented stream compaction on CPU and GPU using parallel a ![](img/downsweep.jpg) +Tests performed +--- +``` +**************** +** SCAN TESTS ** +**************** + [ 3 16 30 16 9 8 8 11 41 20 38 34 7 ... 4 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 0ms (std::chrono Measured) + [ 0 3 19 49 65 74 82 90 101 142 162 200 234 ... 205461733 205461737 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 0ms (std::chrono Measured) + passed +==== naive scan, power-of-two ==== + elapsed time: 327.662ms (CUDA Measured) + passed +==== naive scan, non-power-of-two ==== + elapsed time: 328.087ms (CUDA Measured) + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 0ms (CUDA Measured) + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 0ms (CUDA Measured) + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 3 3 1 0 3 3 3 3 3 0 0 1 0 ... 3 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 45.6113ms (std::chrono Measured) + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 46.366ms (std::chrono Measured) + passed +==== cpu compact with scan ==== + elapsed time: 142.93ms (std::chrono Measured) + passed +==== work-efficient compact, power-of-two ==== + elapsed time: 743.851ms (CUDA Measured) + passed +==== work-efficient compact, non-power-of-two ==== + elapsed time: 739.94ms (CUDA Measured) + passed +Press any key to continue . . . +``` + Performance Analysis --- ### Scan algorithm From 319c0825f5d0baaadb7167a66b1526e2f1894cba Mon Sep 17 00:00:00 2001 From: Rhuta Joshi <35020308+rcj9719@users.noreply.github.com> Date: Sun, 18 Sep 2022 23:25:33 -0400 Subject: [PATCH 22/27] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 18a5488..31ef2d8 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,8 @@ The important steps in a parallel stream compaction algorithm are as follows: - Result of scan is index into final array - Only write an element if temporary array has a 1 +For this project the criteria into consideration is the number should not be equal to 0. + ### Parallel Scanning In this project, I implemented stream compaction on CPU and GPU using parallel all-prefix-sum (commonly known as scan) with CUDA and analyzed the performance of each of them. The sequential scan algorithm is poorly suited to GPUs because it does not take advantage of the GPU's data parallelism. The parallel version of scan that utilizes the parallel processors of a GPU to speed up its computation. The parallel scan can be performed in two ways: @@ -49,6 +51,7 @@ In this project, I implemented stream compaction on CPU and GPU using parallel a Tests performed --- +The following tests are run with blocksize of 256 for an array size of 223 which is around 8 million array elements. ``` **************** ** SCAN TESTS ** From a7e8e42b86fbc277215156820136e65423a626f7 Mon Sep 17 00:00:00 2001 From: Rhuta Joshi <35020308+rcj9719@users.noreply.github.com> Date: Sun, 18 Sep 2022 23:27:21 -0400 Subject: [PATCH 23/27] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 31ef2d8..ea98b47 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ For different block sizes ranging from 4 to 1024, the most optimized performance ![](img/parallel_scan_performance_analysis.png) -Based on this image, we can clearly see that the CPU is taking lesser time than the GPU parallel algorithms. This can be because of the following reasons: +Based on this image, it appears as if CPU takes lesser time than the GPU parallel algorithms. This is because of further optimizations that can be performed on GPU based parallel algorithms. Some of the things that can be considered when doing so include: 1. In the current implementation, number of threads hosted in each iteration of upsweep and downsweep is the same. We know that in each iteration, many threads are idle and are simply returning without performing any meaningful operation. 2. Even if some threads in a warp are done with execution with an early exit, they have to wait for other threads in the warp. When this happens due to conditional stalls, it is called warp divergence. This can be avoided by warp partitioning, such that threads which are likely to terminate together are grouped together in a single warp. From 4877ca1cb3f8d01ab770421002c61254010b2987 Mon Sep 17 00:00:00 2001 From: rcj9719 Date: Sun, 18 Sep 2022 23:51:54 -0400 Subject: [PATCH 24/27] minor changes during testing --- src/main.cpp | 38 ++++++------ stream_compaction/cpu.cu | 3 +- stream_compaction/efficient.cu | 110 ++++++++++++++++++--------------- stream_compaction/naive.cu | 26 +++++--- stream_compaction/thrust.cu | 7 ++- 5 files changed, 102 insertions(+), 82 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index eb6ae6b..210f212 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -44,14 +44,14 @@ int main(int argc, char* argv[]) { 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, b, true); printCmpResult(NPOT, b, c); 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); + //printArray(SIZE, c, true); printCmpResult(SIZE, b, c); /* For bug-finding only: Array of 1s to help find bugs in stream compaction or scan @@ -81,19 +81,19 @@ int main(int argc, char* argv[]) { //printArray(NPOT, c, true); printCmpResult(NPOT, b, c); - 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); + //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); - 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); + //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"); @@ -115,7 +115,7 @@ 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); + //printArray(count, b, true); printCmpLenResult(count, expectedCount, b, b); zeroArray(SIZE, c); @@ -123,28 +123,28 @@ int main(int argc, char* argv[]) { count = StreamCompaction::CPU::compactWithoutScan(NPOT, c, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); expectedNPOT = count; - printArray(count, c, true); + //printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); 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); + //printArray(count, c, true); printCmpLenResult(count, expectedCount, b, c); 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); + //printArray(count, c, true); printCmpLenResult(count, expectedCount, b, c); 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); + //printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); system("pause"); // stop Win32 console from closing on exit diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index ba35218..a422137 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -77,7 +77,8 @@ namespace StreamCompaction { count++; } } - + delete[] mapped; + delete[] scanned; timer().endCpuTimer(); return count; } diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 23782c3..983e6b2 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -3,7 +3,7 @@ #include "common.h" #include "efficient.h" #include -#define blockSize 128 +#define blockSize 256 namespace StreamCompaction { namespace Efficient { using StreamCompaction::Common::PerformanceTimer; @@ -16,29 +16,27 @@ namespace StreamCompaction { /* * Kernel for parallel reduction with upstream scan */ - __global__ void kernUpStreamReduction(int n, int d, int* data) { + __global__ void kernUpSweepReduction(int n, int d, int offsetd, int offsetd1, int* data) { int k = threadIdx.x + (blockIdx.x * blockDim.x); - int offsetd1 = pow(2, d + 1); - int offsetd = pow(2, d); if (k >= n) { return; } - /*if (k % offsetd1 != 0) { - return; - }*/ if (k % offsetd1 == 0) { data[k + offsetd1 - 1] = data[k + offsetd1 - 1] + data[k + offsetd - 1]; return; } + + //// Tried implementing optimized upsweep + //if (k < offsetd) { + // data[k] += data[k + offsetd]; + //} } /* - * Kernel for collecting results with downstream scan + * Kernel for collecting results with downsweep scan */ - __global__ void kernDownStream(int n, int d, int* data) { + __global__ void kernDownSweep(int n, int d, int offsetd, int offsetd1, int* data) { int k = threadIdx.x + (blockIdx.x * blockDim.x); - int offsetd1 = pow(2, d + 1); - int offsetd = pow(2, d); if (k >= n) { return; } @@ -79,57 +77,61 @@ 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(); + // TODO int* dev_data; - //dim3 gridSize(32, 32); - //dim3 blockSize(32, 32); - - dim3 blocksPerGrid((n + blockSize - 1) / blockSize); - // Extend buffers to handle arrays with lengths which are not a power of two int maxDepth = ilog2ceil(n); int extended_n = pow(2, maxDepth); - int* extended_idata = new int[extended_n]; - for (int i = 0; i < extended_n; i++) { - extended_idata[i] = (i < n) ? idata[i] : 0; - } + //dim3 gridSize(32, 32); + //dim3 blockSize(32, 32); + + dim3 blocksPerGrid((extended_n + blockSize - 1) / blockSize); // Memory allocation cudaMalloc((void**)&dev_data, sizeof(int) * extended_n); checkCUDAError("cudaMalloc dev_data failed!"); - cudaMemcpy(dev_data, extended_idata, sizeof(int) * extended_n, cudaMemcpyHostToDevice); - checkCUDAError("memcpy into dev_data failed!"); + cudaMemset(dev_data, 0, sizeof(int) * extended_n); + checkCUDAError("cudaMemset dev_data initialization failed!"); + cudaMemcpy(dev_data, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + checkCUDAError("cudaMemcpy into dev_data failed!"); + + //timer().startGpuTimer(); - // Upstream - parallel reduction + // Upsweep - parallel reduction for (int d = 0; d < maxDepth; d++) { // where d is depth of iteration - kernUpStreamReduction << > > (extended_n, d, dev_data); + int offsetd1 = pow(2, d + 1); + int offsetd = pow(2, d); + //int offsetd = pow(2, maxDepth - d - 1); + kernUpSweepReduction << > > (extended_n, d, offsetd, offsetd1, dev_data); checkCUDAError("kernUpStreamReduction invocation failed!"); } - // Getting parallel reduction sum which can be used to convert to inclusive scan - int* lastVal = new int(); - cudaMemcpy(lastVal, dev_data + extended_n - 1, sizeof(int), cudaMemcpyDeviceToHost); - checkCUDAError("lastVal memcpy failed!"); - // Set last element to identity value which is zero cudaMemset(dev_data + extended_n - 1, 0, sizeof(int)); checkCUDAError("cudaMemset last value to identity failed!"); - // Downstream + // Downsweep for (int d = maxDepth - 1; d >= 0; d--) { // where d is depth of iteration - kernDownStream << > > (extended_n, d, dev_data); + int offsetd1 = pow(2, d + 1); + int offsetd = pow(2, d); + kernDownSweep << > > (extended_n, d, offsetd, offsetd1, dev_data); checkCUDAError("kernDownStream invocation failed!"); } + //timer().endGpuTimer(); + + //// Getting parallel reduction sum which can be used to convert to inclusive scan + //int* lastVal = new int(); + //cudaMemcpy(lastVal, dev_data + extended_n - 1, sizeof(int), cudaMemcpyDeviceToHost); + //checkCUDAError("lastVal memcpy failed!"); // Copy calculated buffer to output cudaMemcpy(odata, dev_data, sizeof(int) * (extended_n), cudaMemcpyDeviceToHost); checkCUDAError("odata memcpy failed!"); cudaFree(dev_data); - //timer().endGpuTimer(); } @@ -143,7 +145,7 @@ namespace StreamCompaction { * @returns The number of elements remaining after compaction. */ int compact(int n, int* odata, const int* idata) { - timer().startGpuTimer(); + // TODO int* dev_idata; @@ -151,41 +153,47 @@ namespace StreamCompaction { int* dev_criteria_buffer; int* dev_scanned_buffer; - int* criteria_buffer = new int[n]; - int* scanned_buffer = new int[n]; + int maxDepth = ilog2ceil(n); + int extended_n = pow(2, maxDepth); - dim3 blocksPerGrid((n + blockSize - 1) / blockSize); + int* criteria_buffer = new int[extended_n]; + int* scanned_buffer = new int[extended_n]; + + dim3 blocksPerGrid((extended_n + blockSize - 1) / blockSize); // Memory allocation - cudaMalloc((void**)&dev_idata, sizeof(int) * n); + cudaMalloc((void**)&dev_idata, sizeof(int) * extended_n); checkCUDAError("cudaMalloc dev_idata failed!"); - cudaMalloc((void**)&dev_criteria_buffer, sizeof(int) * n); + cudaMalloc((void**)&dev_criteria_buffer, sizeof(int) * extended_n); checkCUDAError("cudaMalloc dev_criteria_buffer failed!"); - cudaMalloc((void**)&dev_scanned_buffer, sizeof(int) * n); + cudaMalloc((void**)&dev_scanned_buffer, sizeof(int) * extended_n); checkCUDAError("cudaMalloc dev_scanned_buffer failed!"); + cudaMemset(dev_idata, 0, sizeof(int) * extended_n); + checkCUDAError("cudaMemset dev_idata initialization failed!"); cudaMemcpy(dev_idata, idata, sizeof(int) * n, cudaMemcpyHostToDevice); checkCUDAError("cudaMemcpy into dev_idata failed!"); + timer().startGpuTimer(); // Mapping as per criteria - kernMap << > > (n, dev_criteria_buffer, dev_idata); + kernMap << > > (extended_n, dev_criteria_buffer, dev_idata); checkCUDAError("kernMap invocation failed!"); - cudaMemcpy(criteria_buffer, dev_criteria_buffer, sizeof(int) * n, cudaMemcpyDeviceToHost); + cudaMemcpy(criteria_buffer, dev_criteria_buffer, sizeof(int) * extended_n, cudaMemcpyDeviceToHost); checkCUDAError("memcpy into criteria_buffer failed!"); // Scann criteria buffer to generate scanned buffer - scan(n, scanned_buffer, criteria_buffer); - cudaMemcpy(dev_scanned_buffer, scanned_buffer, sizeof(int) * n, cudaMemcpyHostToDevice); + scan(extended_n, scanned_buffer, criteria_buffer); + cudaMemcpy(dev_scanned_buffer, scanned_buffer, sizeof(int) * extended_n, cudaMemcpyHostToDevice); checkCUDAError("memcpy into dev_scanned_buffer failed!"); // Malloc for compressed output data, compressed buffer // size given by last element of scanned criteria - cudaMalloc((void**)&dev_odata, sizeof(int) * scanned_buffer[n-1]); + cudaMalloc((void**)&dev_odata, sizeof(int) * scanned_buffer[extended_n -1]); checkCUDAError("cudaMalloc dev_odata failed!"); // Initialize odata to 0 - cudaMemset(dev_odata, 0, sizeof(int) * scanned_buffer[n-1]); + cudaMemset(dev_odata, 0, sizeof(int) * scanned_buffer[extended_n -1]); checkCUDAError("cudaMemset dev_odata initialization failed!"); // Scatter data - insert input data at index obtained @@ -193,16 +201,20 @@ namespace StreamCompaction { kernScatter << > > (n, dev_odata, dev_scanned_buffer, dev_criteria_buffer, dev_idata); checkCUDAError("kernMap invocation failed!"); + timer().endGpuTimer(); + // Copy calculated buffer to output - cudaMemcpy(odata, dev_odata, sizeof(int) * scanned_buffer[n-1], cudaMemcpyDeviceToHost); + cudaMemcpy(odata, dev_odata, sizeof(int) * scanned_buffer[extended_n -1], cudaMemcpyDeviceToHost); checkCUDAError("odata memcpy failed!"); cudaFree(dev_scanned_buffer); cudaFree(dev_criteria_buffer); cudaFree(dev_idata); cudaFree(dev_odata); - timer().endGpuTimer(); - return scanned_buffer[n-1]; + /*delete[] criteria_buffer; + delete[] scanned_buffer;*/ + + return scanned_buffer[extended_n-1]; } } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 3ae2cc0..f258566 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -3,6 +3,7 @@ #include "common.h" #include "naive.h" #include +#define blockSize 256 namespace StreamCompaction { namespace Naive { @@ -22,9 +23,8 @@ namespace StreamCompaction { //} // TODO: __global__ - __global__ void kernNaiveScan(int n, int d, int *odata, const int *idata) { + __global__ void kernNaiveScan(int n, int d, int offset, int *odata, const int *idata) { int k = threadIdx.x + blockIdx.x * blockDim.x; - int offset = pow(2, d - 1); if (k >= n) { return; } @@ -56,7 +56,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(); + //// DEBUGGER TEST // int noOfBlocks = 1; @@ -68,8 +68,10 @@ namespace StreamCompaction { int* dev_buffer1; int* dev_buffer2; - dim3 gridSize(32, 32); - dim3 blockSize(32, 32); + /*dim3 gridSize(32, 32); + dim3 blockSize(32, 32);*/ + + dim3 blocksPerGrid((n + blockSize - 1) / blockSize); // Memory allocation cudaMalloc((void**)&dev_buffer1, sizeof(int) * n); @@ -79,22 +81,26 @@ namespace StreamCompaction { cudaMemcpy(dev_buffer1, idata, sizeof(int) * n, cudaMemcpyHostToDevice); checkCUDAError("memcpy into dev_buffer1 failed!"); + + int maxDepth = ilog2ceil(n); + + timer().startGpuTimer(); for (int d = 1; d <= maxDepth; d++) { // where d is depth of iteration - kernNaiveScan << > > (n, d, dev_buffer2, dev_buffer1); + int offset = pow(2, d - 1); + kernNaiveScan << > > (n, d, offset, dev_buffer2, dev_buffer1); cudaMemcpy(dev_buffer1, dev_buffer2, sizeof(int) * n, cudaMemcpyDeviceToDevice); } - // converting from inclusive to exclusive scan using same buffers - kernInclusiveToExclusive << > > (n, dev_buffer1, dev_buffer2); + kernInclusiveToExclusive << > > (n, dev_buffer1, dev_buffer2); + timer().endGpuTimer(); + cudaMemcpy(odata, dev_buffer1, sizeof(int) * (n), cudaMemcpyDeviceToHost); checkCUDAError("memcpy into odata failed!"); cudaFree(dev_buffer1); cudaFree(dev_buffer2); - timer().endGpuTimer(); - } } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 7d60261..8b8fe3d 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -18,7 +18,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(); + // TODO use `thrust::exclusive_scan` // example: for device_vectors dv_in and dv_out: thrust::host_vector host_in(n); @@ -28,18 +28,19 @@ namespace StreamCompaction { for (int i = 0; i < n; ++i) { host_in[i] = idata[i]; } - + // Create device_vectors from host_vectors thrust::device_vector dev_in(host_in); thrust::device_vector dev_out(host_out); + timer().startGpuTimer(); thrust::exclusive_scan(dev_in.begin(), dev_in.end(), dev_out.begin()); + timer().endGpuTimer(); // Write final results for (int i = 0; i < n; i++) { odata[i] = dev_out[i]; } - timer().endGpuTimer(); } } } From 73cbb142110e664cfdfd592112a347b4ff1723c6 Mon Sep 17 00:00:00 2001 From: rcj9719 Date: Sun, 18 Sep 2022 23:54:34 -0400 Subject: [PATCH 25/27] attempt at upsweep optimization --- img/upsweep_optimization.jpg | Bin 0 -> 78570 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/upsweep_optimization.jpg diff --git a/img/upsweep_optimization.jpg b/img/upsweep_optimization.jpg new file mode 100644 index 0000000000000000000000000000000000000000..da9eaf32e71bf9cdbfa0e15b636a12aecce545a5 GIT binary patch literal 78570 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