From 468ef8766164b9d36e4c3bedddad68ec3d0268ea Mon Sep 17 00:00:00 2001 From: Jacky Lu Date: Fri, 18 Sep 2020 16:41:43 -0400 Subject: [PATCH 1/4] Finished part 1 --- src/main.cpp | 2 +- stream_compaction/cpu.cu | 39 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 896ac2b..79809e0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 8; // feel free to change the size of array +const int SIZE = 1 << 3; // feel free to change the size of array (8 originally) const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 719fa11..69e33a5 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -20,6 +20,10 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + odata[0] = 0; + for (int i = 1; i < n; i++) { + odata[i] = odata[i - 1] + idata[i - 1]; + } timer().endCpuTimer(); } @@ -31,8 +35,15 @@ namespace StreamCompaction { int compactWithoutScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + int counter = 0; + for (int i = 0; i < n; i++) { + if (idata[i] != 0) { + odata[counter] = idata[i]; + counter++; + } + } timer().endCpuTimer(); - return -1; + return counter; } /** @@ -43,8 +54,32 @@ namespace StreamCompaction { int compactWithScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + // Construct criteria vector + int* criteriaVec = new int[n]; + for (int i = 0; i < n; i++) { + criteriaVec[i] = idata[i] != 0 ? 1 : 0; + } + + // Construct scan vector from criteria vector + int* scanVec = new int[n]; + scanVec[0] = 0; + for (int i = 1; i < n; i++) { + scanVec[i] = scanVec[i - 1] + criteriaVec[i - 1]; + } + + // Scatter + int counter = 0; + for (int i = 0; i < n; i++) { + if (criteriaVec[i] == 1) { + odata[scanVec[i]] = idata[i]; + counter++; + } + } + + delete[] criteriaVec; + delete[] scanVec; timer().endCpuTimer(); - return -1; + return counter; } } } From 060187ffa31c30e4d70e58a2ff147515ed1e24d0 Mon Sep 17 00:00:00 2001 From: Jacky Lu Date: Sat, 19 Sep 2020 17:30:17 -0400 Subject: [PATCH 2/4] Implemented stream compaction --- src/main.cpp | 14 +-- stream_compaction/efficient.cu | 174 ++++++++++++++++++++++++++++++++- stream_compaction/naive.cu | 50 ++++++++++ 3 files changed, 230 insertions(+), 8 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 79809e0..9769790 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 3; // feel free to change the size of array (8 originally) +const int SIZE = (1 << 4); // feel free to change the size of array (8 originally) const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; @@ -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 @@ -64,21 +64,21 @@ int main(int argc, char* argv[]) { printDesc("naive scan, non-power-of-two"); StreamCompaction::Naive::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); + printArray(NPOT, c, true); printCmpResult(NPOT, b, c); zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); StreamCompaction::Efficient::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); + printArray(SIZE, c, true); printCmpResult(SIZE, b, c); zeroArray(SIZE, c); printDesc("work-efficient scan, non-power-of-two"); StreamCompaction::Efficient::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(NPOT, c, true); + printArray(NPOT, c, true); printCmpResult(NPOT, b, c); zeroArray(SIZE, c); @@ -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 2db346e..213e4eb 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -3,6 +3,9 @@ #include "common.h" #include "efficient.h" +#include +#include + namespace StreamCompaction { namespace Efficient { using StreamCompaction::Common::PerformanceTimer; @@ -15,12 +18,97 @@ namespace StreamCompaction { /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ + __global__ void kernNonPaddedToPadded(int nPadded, int n, int* dev_vec_padded, int* dev_vec_nonPadded) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index < nPadded) { + if (index < n) { + dev_vec_padded[index] = dev_vec_nonPadded[index]; + } else { + dev_vec_padded[index] = 0; + } + + } + } + + __global__ void kernPaddedToNonPadded(int n, int* dev_vec_padded, int* dev_vec_nonPadded) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + // + if (index < n) { + dev_vec_nonPadded[index] = dev_vec_padded[index]; + } + } + + __global__ void kernReduce(int nPadded, int d, int* dev_vec_padded) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index < nPadded) { + if (index % (1 << (d + 1)) == 0) { // (int)fmodf(index, 1 << (d + 1)) + dev_vec_padded[index + (1 << (d + 1)) - 1] += dev_vec_padded[index + (1 << d) - 1]; + } + } + } + + __global__ void kernSetRootToZero(int nPadded, int* dev_vec_padded) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index == nPadded - 1) { + dev_vec_padded[index] = 0; + } + } + + __global__ void downSweep(int nPadded, int d, int* dev_vec_padded) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index < nPadded) { + if (index % (1 << (d + 1)) == 0) { + int t = dev_vec_padded[index + (1 << d) - 1]; + dev_vec_padded[index + (1 << d) - 1] = dev_vec_padded[index + (1 << (d + 1)) - 1]; + dev_vec_padded[index + (1 << (d + 1)) - 1] += t; + } + } + + } + void scan(int n, int *odata, const int *idata) { + int paddedSize = 1 << ilog2ceil(n); + int nPadded = n; + if (paddedSize > n) { + nPadded = paddedSize; + } + + int* dev_vec_nonPadded; + int* dev_vec_padded; + cudaMalloc((void**)&dev_vec_nonPadded, n * sizeof(int)); + cudaMemcpy(dev_vec_nonPadded, idata, n * sizeof(int), cudaMemcpyHostToDevice); + cudaMalloc((void**)&dev_vec_padded, nPadded * sizeof(int)); + timer().startGpuTimer(); // TODO + int blockSize = 128; + dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); + dim3 fullBlocksPerGridPadded((nPadded + blockSize - 1) / blockSize); + // Pad 0s + kernNonPaddedToPadded << > > (nPadded, n, dev_vec_padded, dev_vec_nonPadded); + + // Reduce/Up-Sweep + for (int d = 0; d <= ilog2ceil(nPadded) - 1; d++) { + kernReduce << > > (nPadded, d, dev_vec_padded); + } + // Set Root To Zero And Down-Sweep + kernSetRootToZero << > > (nPadded, dev_vec_padded); + + for (int d = ilog2ceil(nPadded) - 1; d >= 0; d--) { + downSweep << > > (nPadded, d, dev_vec_padded); + } + + // Unpad 0s + kernPaddedToNonPadded << > > (n, dev_vec_padded, dev_vec_nonPadded); timer().endGpuTimer(); + + cudaMemcpy(odata, dev_vec_nonPadded, n * sizeof(int), cudaMemcpyDeviceToHost); + cudaFree(dev_vec_nonPadded); + cudaFree(dev_vec_padded); } + + /** * Performs stream compaction on idata, storing the result into odata. * All zeroes are discarded. @@ -30,11 +118,95 @@ namespace StreamCompaction { * @param idata The array of elements to compact. * @returns The number of elements remaining after compaction. */ + + __global__ void kernMakeBool(int num, int* dev_vec) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index < num && dev_vec[index] != 0) { + dev_vec[index] = 1; + } + } + + __global__ void kernScatter(int n, int* dev_idata, int* dev_vec_nonPadded, int* dev_result) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index < n && dev_idata[index] != 0) { + dev_result[dev_vec_nonPadded[index]] = dev_idata[index]; + } + } + __global__ void kernCheckNonZeroNum(int n, int* dev_result, int* num) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index < n) { + if (dev_result[index] == 0 && dev_result[index - 1] != 0) { + *num = index; + } + } + } + int compact(int n, int *odata, const int *idata) { + int paddedSize = 1 << ilog2ceil(n); + int nPadded = n; + if (paddedSize > n) { + nPadded = paddedSize; + } + + int* dev_vec_nonPadded; + int* dev_vec_padded; + cudaMalloc((void**)&dev_vec_nonPadded, n * sizeof(int)); + cudaMemcpy(dev_vec_nonPadded, idata, n * sizeof(int), cudaMemcpyHostToDevice); + cudaMalloc((void**)&dev_vec_padded, nPadded * sizeof(int)); + + int* dev_idata; + cudaMalloc((void**)&dev_idata, n * sizeof(int)); + cudaMemcpy(dev_idata, idata, n * sizeof(int), cudaMemcpyHostToDevice); + + int* dev_result; + cudaMalloc((void**)&dev_result, n * sizeof(int)); + timer().startGpuTimer(); // TODO + int blockSize = 128; + dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); + dim3 fullBlocksPerGridPadded((nPadded + blockSize - 1) / blockSize); + + // Pad 0s + kernNonPaddedToPadded << > > (nPadded, n, dev_vec_padded, dev_vec_nonPadded); + + // Convert to 0s and 1s + kernMakeBool << > > (nPadded, dev_vec_padded); + + // Reduce/Up-Sweep + for (int d = 0; d <= ilog2ceil(nPadded) - 1; d++) { + kernReduce << > > (nPadded, d, dev_vec_padded); + } + // Set Root To Zero And Down-Sweep + kernSetRootToZero << > > (nPadded, dev_vec_padded); + + for (int d = ilog2ceil(nPadded) - 1; d >= 0; d--) { + downSweep << > > (nPadded, d, dev_vec_padded); + } + + // Unpad 0s + kernPaddedToNonPadded << > > (n, dev_vec_padded, dev_vec_nonPadded); + + // Scatter + kernScatter << > > (n, dev_idata, dev_vec_nonPadded, dev_result); + + int* dev_nonZeroNum; + cudaMalloc((void**)&dev_nonZeroNum, sizeof(int)); + int nonZeroNum; + kernCheckNonZeroNum << > > (n, dev_result, dev_nonZeroNum); + timer().endGpuTimer(); - return -1; + + cudaMemcpy(&nonZeroNum, dev_nonZeroNum, sizeof(int), cudaMemcpyDeviceToHost); + cudaMemcpy(odata, dev_result, n * sizeof(int), cudaMemcpyDeviceToHost); + cudaFree(dev_vec_nonPadded); + cudaFree(dev_vec_padded); + cudaFree(dev_idata); + cudaFree(dev_result); + cudaFree(dev_nonZeroNum); + + std::cout << nonZeroNum; + return nonZeroNum; } } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 4308876..5ee230b 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -3,6 +3,8 @@ #include "common.h" #include "naive.h" +#include + namespace StreamCompaction { namespace Naive { using StreamCompaction::Common::PerformanceTimer; @@ -12,14 +14,62 @@ namespace StreamCompaction { return timer; } // TODO: __global__ + __global__ void kernNaiveScan(int n, int d, int* dev_vec1, int* dev_vec2) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index < n) { + if (index >= (1 << (d - 1))) { + dev_vec2[index] = dev_vec1[index - (1 << (d - 1))] + dev_vec1[index]; + } else { + dev_vec2[index] = dev_vec1[index]; + } + } + } + + __global__ void kernInsertIdentity(int n, int* dev_vec1, int* dev_vec2) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index < n) { + if (index == 0) { + dev_vec2[index] = 0; // Insert identity element + } else { + dev_vec2[index] = dev_vec1[index - 1]; + } + } + } /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + int* dev_vec1; + int* dev_vec2; + int size = n * sizeof(int); + cudaMalloc((void**)&dev_vec1, size); + cudaMalloc((void**)&dev_vec2, size); + cudaMemcpy(dev_vec1, idata, size, cudaMemcpyHostToDevice); + timer().startGpuTimer(); // TODO + int blockSize = 128; + dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); + for (int d = 1; d <= ilog2ceil(n); d++) { + // Launch kernel for inclusive scan + kernNaiveScan << > > (n, d, dev_vec1, dev_vec2); + // Ping-pong buffers + int* temp = dev_vec1; + dev_vec1 = dev_vec2; + dev_vec2 = temp; + } + // Launch kernel for shifting elements right and inserting identity element + kernInsertIdentity << > > (n, dev_vec1, dev_vec2); + // Ping-pong buffers again + int* temp = dev_vec1; + dev_vec1 = dev_vec2; + dev_vec2 = temp; timer().endGpuTimer(); + + cudaMemcpy(odata, dev_vec1, size, cudaMemcpyDeviceToHost); + cudaFree(dev_vec1); + cudaFree(dev_vec2); } } } From dcc6ec0edb467e1cf328f402062c6af3e56361b0 Mon Sep 17 00:00:00 2001 From: Jacky Lu Date: Sun, 20 Sep 2020 16:42:33 -0400 Subject: [PATCH 3/4] Finished all implementations --- src/main.cpp | 10 ++-- stream_compaction/common.cu | 15 +++++ stream_compaction/efficient.cu | 100 ++++++++++----------------------- stream_compaction/thrust.cu | 7 +++ 4 files changed, 58 insertions(+), 74 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 9769790..986a2bf 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = (1 << 4); // feel free to change the size of array (8 originally) +const int SIZE = (1 << 25); // feel free to change the size of array (8 originally) const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; @@ -85,14 +85,14 @@ int main(int argc, char* argv[]) { printDesc("thrust scan, power-of-two"); StreamCompaction::Thrust::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); + 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); + printArray(NPOT, c, true); printCmpResult(NPOT, b, c); printf("\n"); @@ -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/common.cu b/stream_compaction/common.cu index 2ed6d63..672da8c 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -1,5 +1,7 @@ #include "common.h" +#include + void checkCUDAErrorFn(const char *msg, const char *file, int line) { cudaError_t err = cudaGetLastError(); if (cudaSuccess == err) { @@ -24,6 +26,15 @@ namespace StreamCompaction { */ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { // TODO + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index < n) { + if (idata[index] != 0) { + bools[index] = 1; + } else { + bools[index] = 0; + } + + } } /** @@ -33,6 +44,10 @@ namespace StreamCompaction { __global__ void kernScatter(int n, int *odata, const int *idata, const int *bools, const int *indices) { // TODO + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index < n && bools[index] == 1) { + odata[indices[index]] = idata[index]; + } } } diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 213e4eb..a934ecd 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -18,25 +18,7 @@ namespace StreamCompaction { /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ - __global__ void kernNonPaddedToPadded(int nPadded, int n, int* dev_vec_padded, int* dev_vec_nonPadded) { - int index = (blockIdx.x * blockDim.x) + threadIdx.x; - if (index < nPadded) { - if (index < n) { - dev_vec_padded[index] = dev_vec_nonPadded[index]; - } else { - dev_vec_padded[index] = 0; - } - - } - } - - __global__ void kernPaddedToNonPadded(int n, int* dev_vec_padded, int* dev_vec_nonPadded) { - int index = (blockIdx.x * blockDim.x) + threadIdx.x; - // - if (index < n) { - dev_vec_nonPadded[index] = dev_vec_padded[index]; - } - } + __global__ void kernReduce(int nPadded, int d, int* dev_vec_padded) { int index = (blockIdx.x * blockDim.x) + threadIdx.x; @@ -47,13 +29,6 @@ namespace StreamCompaction { } } - __global__ void kernSetRootToZero(int nPadded, int* dev_vec_padded) { - int index = (blockIdx.x * blockDim.x) + threadIdx.x; - if (index == nPadded - 1) { - dev_vec_padded[index] = 0; - } - } - __global__ void downSweep(int nPadded, int d, int* dev_vec_padded) { int index = (blockIdx.x * blockDim.x) + threadIdx.x; if (index < nPadded) { @@ -73,37 +48,32 @@ namespace StreamCompaction { nPadded = paddedSize; } - int* dev_vec_nonPadded; int* dev_vec_padded; - cudaMalloc((void**)&dev_vec_nonPadded, n * sizeof(int)); - cudaMemcpy(dev_vec_nonPadded, idata, n * sizeof(int), cudaMemcpyHostToDevice); cudaMalloc((void**)&dev_vec_padded, nPadded * sizeof(int)); - + cudaMemset(dev_vec_padded, 0, nPadded * sizeof(int)); + cudaMemcpy(dev_vec_padded, idata, n * sizeof(int), cudaMemcpyHostToDevice); + timer().startGpuTimer(); // TODO int blockSize = 128; dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); dim3 fullBlocksPerGridPadded((nPadded + blockSize - 1) / blockSize); - // Pad 0s - kernNonPaddedToPadded << > > (nPadded, n, dev_vec_padded, dev_vec_nonPadded); // Reduce/Up-Sweep for (int d = 0; d <= ilog2ceil(nPadded) - 1; d++) { kernReduce << > > (nPadded, d, dev_vec_padded); } - // Set Root To Zero And Down-Sweep - kernSetRootToZero << > > (nPadded, dev_vec_padded); + // Set Root To Zero + cudaMemset(dev_vec_padded + nPadded - 1, 0, sizeof(int)); + // Down-Sweep for (int d = ilog2ceil(nPadded) - 1; d >= 0; d--) { downSweep << > > (nPadded, d, dev_vec_padded); } - - // Unpad 0s - kernPaddedToNonPadded << > > (n, dev_vec_padded, dev_vec_nonPadded); + timer().endGpuTimer(); - cudaMemcpy(odata, dev_vec_nonPadded, n * sizeof(int), cudaMemcpyDeviceToHost); - cudaFree(dev_vec_nonPadded); + cudaMemcpy(odata, dev_vec_padded, n * sizeof(int), cudaMemcpyDeviceToHost); cudaFree(dev_vec_padded); } @@ -126,10 +96,10 @@ namespace StreamCompaction { } } - __global__ void kernScatter(int n, int* dev_idata, int* dev_vec_nonPadded, int* dev_result) { + __global__ void kernScatter(int n, int* dev_idata, int* dev_indices, int* dev_result) { int index = (blockIdx.x * blockDim.x) + threadIdx.x; if (index < n && dev_idata[index] != 0) { - dev_result[dev_vec_nonPadded[index]] = dev_idata[index]; + dev_result[dev_indices[index]] = dev_idata[index]; } } __global__ void kernCheckNonZeroNum(int n, int* dev_result, int* num) { @@ -148,14 +118,15 @@ namespace StreamCompaction { nPadded = paddedSize; } - int* dev_vec_nonPadded; - int* dev_vec_padded; - cudaMalloc((void**)&dev_vec_nonPadded, n * sizeof(int)); - cudaMemcpy(dev_vec_nonPadded, idata, n * sizeof(int), cudaMemcpyHostToDevice); - cudaMalloc((void**)&dev_vec_padded, nPadded * sizeof(int)); + int* dev_indices; + cudaMalloc((void**)&dev_indices, nPadded * sizeof(int)); + int* dev_bool; + cudaMalloc((void**)&dev_bool, nPadded * sizeof(int)); + int* dev_idata; - cudaMalloc((void**)&dev_idata, n * sizeof(int)); + cudaMalloc((void**)&dev_idata, nPadded * sizeof(int)); + cudaMemset(dev_idata, 0, nPadded * sizeof(int)); cudaMemcpy(dev_idata, idata, n * sizeof(int), cudaMemcpyHostToDevice); int* dev_result; @@ -167,45 +138,36 @@ namespace StreamCompaction { dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); dim3 fullBlocksPerGridPadded((nPadded + blockSize - 1) / blockSize); - // Pad 0s - kernNonPaddedToPadded << > > (nPadded, n, dev_vec_padded, dev_vec_nonPadded); - // Convert to 0s and 1s - kernMakeBool << > > (nPadded, dev_vec_padded); + StreamCompaction::Common::kernMapToBoolean << > > (nPadded, dev_bool, dev_idata); + cudaMemcpy(dev_indices, dev_bool, nPadded * sizeof(int), cudaMemcpyDeviceToDevice); // Reduce/Up-Sweep for (int d = 0; d <= ilog2ceil(nPadded) - 1; d++) { - kernReduce << > > (nPadded, d, dev_vec_padded); + kernReduce << > > (nPadded, d, dev_indices); } - // Set Root To Zero And Down-Sweep - kernSetRootToZero << > > (nPadded, dev_vec_padded); + // Set Root To Zero + cudaMemset(dev_indices + nPadded - 1, 0, sizeof(int)); + // Down-Sweep for (int d = ilog2ceil(nPadded) - 1; d >= 0; d--) { - downSweep << > > (nPadded, d, dev_vec_padded); + downSweep << > > (nPadded, d, dev_indices); } - // Unpad 0s - kernPaddedToNonPadded << > > (n, dev_vec_padded, dev_vec_nonPadded); - // Scatter - kernScatter << > > (n, dev_idata, dev_vec_nonPadded, dev_result); - - int* dev_nonZeroNum; - cudaMalloc((void**)&dev_nonZeroNum, sizeof(int)); - int nonZeroNum; - kernCheckNonZeroNum << > > (n, dev_result, dev_nonZeroNum); + StreamCompaction::Common::kernScatter << > > (n, dev_result, dev_idata, dev_bool, dev_indices); timer().endGpuTimer(); - cudaMemcpy(&nonZeroNum, dev_nonZeroNum, sizeof(int), cudaMemcpyDeviceToHost); cudaMemcpy(odata, dev_result, n * sizeof(int), cudaMemcpyDeviceToHost); - cudaFree(dev_vec_nonPadded); - cudaFree(dev_vec_padded); + int nonZeroNum; + cudaMemcpy(&nonZeroNum, dev_indices + nPadded - 1, sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(dev_indices); + cudaFree(dev_bool); cudaFree(dev_idata); cudaFree(dev_result); - cudaFree(dev_nonZeroNum); - std::cout << nonZeroNum; return nonZeroNum; } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 1def45e..7dcb6e7 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -18,11 +18,18 @@ namespace StreamCompaction { * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + thrust::host_vector h_in(idata, idata + n); + thrust::device_vector dv_in = h_in; + thrust::device_vector dv_out(n); + 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::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); timer().endGpuTimer(); + + thrust::copy(dv_out.begin(), dv_out.end(), odata); } } } From 7179d79b0099f2df6f355d49406420c1493a173f Mon Sep 17 00:00:00 2001 From: Jacky Lu Date: Tue, 22 Sep 2020 23:54:22 -0400 Subject: [PATCH 4/4] Finished project --- README.md | 80 +++++++++++++++++++++++++++++++++++++++++++++++---- img/plot.png | Bin 0 -> 89541 bytes 2 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 img/plot.png diff --git a/README.md b/README.md index 0e38ddb..4ad3002 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,80 @@ 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) +* Jacky Lu + * [LinkedIn](https://www.linkedin.com/in/jacky-lu-506968129/) -### (TODO: Your README) -Include analysis, etc. (Remember, this is public, so don't put -anything here that you don't want to share with the world.) +# README + +## Result: +### The implementations' block sizes seem to be optimized at 128 threads per block. + +### Performance Comparison Between GPU Scan Implementations (Naive, Work-Efficient, and Thrust) And CPU Scan Implementations +#### (Tested With 128 Threads Per Block) +![](img/plot.png) + +### Output Of The Test Program With 33,554,432 Array Elements (Tested With 128 Threads Per Block) +``` +**************** +** SCAN TESTS ** +**************** + [ 12 3 19 17 37 34 6 17 18 22 23 8 49 ... 17 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 102.834ms (std::chrono Measured) + [ 0 12 15 34 51 88 122 128 145 163 185 208 216 ... 821676053 821676070 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 38.8949ms (std::chrono Measured) + [ 0 12 15 34 51 88 122 128 145 163 185 208 216 ... 821675987 821676034 ] + passed +==== naive scan, power-of-two ==== + elapsed time: 19.5621ms (CUDA Measured) + [ 0 12 15 34 51 88 122 128 145 163 185 208 216 ... 821676053 821676070 ] + passed +==== naive scan, non-power-of-two ==== + elapsed time: 19.9352ms (CUDA Measured) + [ 0 12 15 34 51 88 122 128 145 163 185 208 216 ... 821675987 821676034 ] + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 14.7942ms (CUDA Measured) + [ 0 12 15 34 51 88 122 128 145 163 185 208 216 ... 821676053 821676070 ] + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 14.8075ms (CUDA Measured) + [ 0 12 15 34 51 88 122 128 145 163 185 208 216 ... 821675987 821676034 ] + passed +==== thrust scan, power-of-two ==== + elapsed time: 0.8088ms (CUDA Measured) + [ 0 12 15 34 51 88 122 128 145 163 185 208 216 ... 821676053 821676070 ] + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 0.806624ms (CUDA Measured) + [ 0 12 15 34 51 88 122 128 145 163 185 208 216 ... 821675987 821676034 ] + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 0 2 1 2 0 0 3 3 1 2 2 2 2 ... 2 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 60.1642ms (std::chrono Measured) + [ 2 1 2 3 3 1 2 2 2 2 3 1 3 ... 3 2 ] + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 60.4809ms (std::chrono Measured) + [ 2 1 2 3 3 1 2 2 2 2 3 1 3 ... 1 3 ] + passed +==== cpu compact with scan ==== + elapsed time: 205.018ms (std::chrono Measured) + [ 2 1 2 3 3 1 2 2 2 2 3 1 3 ... 3 2 ] + passed +==== work-efficient compact, power-of-two ==== + elapsed time: 17.7603ms (CUDA Measured) + [ 2 1 2 3 3 1 2 2 2 2 3 1 3 ... 3 2 ] + passed +==== work-efficient compact, non-power-of-two ==== + elapsed time: 17.4516ms (CUDA Measured) + [ 2 1 2 3 3 1 2 2 2 2 3 1 3 ... 1 3 ] + passed +``` diff --git a/img/plot.png b/img/plot.png new file mode 100644 index 0000000000000000000000000000000000000000..d25345ccc2e287703c30cd373f1a3fc0b92dffa3 GIT binary patch literal 89541 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

-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

I{;v4Nn~^&Z z?N=H85X9umg_eqGL4{sR*&DK5!eng>4eM%-=(7)7jW%K-#aq8j zj;4PIIFDH{S5JEr(Fbjy3M0qz5*&pNQh6Re7}$5IS?|w4=qS400&fP4YP%*Bm>fHI ziCp>nj|79@>c+Ek=fo%nYQZG@)sL)_l9F8uQJwbu*dBsj?uIklwrph%TaF#WrWXz| zC*Ku4`X0`#gVire!YVp>jLHGP=9I1ZD&Ir9wE}6Psx?@TT@&x`5+ zh>Ct&prCUiMmLop{ktwtj!nD8^(v?ghJ(gch95jIw^A0w=%O3q6YJzW{+?~OoL&K% zp5jB8VP~q~M&zsDa1IV;ue)XxhG*!;nrsc0F9OP@qe`Goq2_9_pg=}93tTvNbP12{ z{BM*G^nuNC*c~xinRMG21TU01U|~i}Ak^4fj+Hy)kheTLJKiD-rMEYEM)?OMJ=3Mh z!NcZg#hs2mUi+!ai~*+^Y0yv~Ho4-sCNYsss8YTNDpmVtl*G=9WPXE7k!IJSaWx zJ#l|det_MRpZ;yzMY(L4Q~=Rd_F;v5vR^g6IGTMO#)?9#=$;%^=L@ z-xp=li&1io2JP#_vE{JB&{heGxg0>3AQZl78_cY{y7;6j+LcKppR(`lYYplkqhHp1 z{&Yu{pd$cKQKIA!ik$Y$#X>lsPa9}B8bXS1j3qq)Ehq-KzYAr8>Mk0ncDl$BrE+S+ zx+#9jUtSQySnrt(b&*Jz{|aQ1DzM0{1OGw5t*S+3N`X|D%Y|Gbfo$Bvz{fZ$%m($Ay8gZ`-%(x5XGuZmpH zIIT(7*63D}IZMgWwuZL^5FwEgtBd^rQ`#U+YLDt^IPR2&-#KuqWV3?j$oF7=v$`l& zQ$i}a{%W2at*hnDaugNC>81Bsqx1-2-k>)LFV4O_Fl+~ZC;q+8lk`6p^cwg^E$s&N zm#wk!Z!#!`F{{^b^bSrQ(D8anz)3VXTN&5-0_(cC_4Kg0DGS$b+KRs-^k;+`#O8n1 zhWz(FT{X`ag6Q)R&t&7CCe@sx7-v;MQaq?xB_9zpmt=9FjHfzuKbW_42%4%VtVb92 zJm4>5)hCR1HEn#?P)AuI1aCn^J&7VFH-iT0y*NutmFR zH8oMhOaQ?>6*MA>MVCH^y!?_l(zsB`aRZtDhOpBfEpK?dFU8ZnqwwnTLj1{H5XA6g zBRQBY$)s$px-tD0Pq&{yg3i?b8wS{6gF~F~feCWyF zY4W&aecEsyLYq6ZkWs*wyp$s~V5Xs)=`sA-ok>S>YWXJ#6(XNc{S@_MGri=KIaSF4 zApue8%gLd*_5-m_C2|a(UnlH9wPm)5l7$^Avy9E%RME|^YH~6B-zrY0GT8qh)LSd} z&2yCi$kE#}>A*iPX|$^8;>wt8nM6(Oq_ohl>jQMrm3cNR@ z^z}%@4c^U8lLaU$lg4U?(YTtLx7rP3*O2Je#&R?L#%ze7B~^I-bIF%*bd|2s_HSR- z>o0(~^tbr|gq!rJGV3@dl=*W_z?RP<>+$WUAS9YkSXu zH6(vu-#)KCB|b?YBL;0iYO`r$docM2NR0<)UA!?v-hr(8=z_T}!HHchkP=m*6sU+b z%`Zzk=M-q4jpl}fym*)N=+co8fM$5sYX_1d&7dE}sG`dOim|)mAnckn>I;=E)x2iDC581yJYs~2`YEok{0o;riWy*lxLz8wUu$c3%vKIB@koCPbPK$NUfMrRqkw$) z8)#s!fO^(=J9aOsXor&th3@eU+8^fExFL^|6VZ`po0jpLs|3+P8h-m;L+cN+P{6@$ zmNPO8+Ok=)c=xURbE8<~CcU%^7Q%Y`RE110>M53)720V+(IngproH_?OU2lwmWj}9 z^8Q^6+TL2wQ7#7We%*`#%{SXfSZj$(YTb(p=M4(aNYjebA+< zXYeC{;1MJhr07*MNUhopz4xCcy!swE$+n|ly-9Y*&U*)|+HN=zsRUp!@TxBciN%{n zS{lOT;J}fxyT8rPb(TIG=2K2u)A;Ieg_ost@e$=8rsujgqW!8-nM2>}fL46nxjxr^ ziN8c%l0}MIQ}F5J=fRZ!5uM<1-(`Z$G!GG5&vxG{xA^K@tnBN=A!Z~h$}Je(4@I^H znaXMh@=e}AZd`y{H@qxGDX0gm+dD7^3+NcTdJYq}l6viy743&NnN zZoqnY2FEL=%GQfR8*uy&5P~>NXVT=Qnr|-$vC`FySJDSjW%vx2=Y>HVREpl-JGuz? z*3#uyM#vzLt47$2ADDlsQchQbU@ob9!3q?rnH!mv+oozUVR7L6woeQ_^;xJ zibeD3t<_MQ7E6hj`Lq8ICpWkwuQWkS0elk{S!txf28UMj&~c^9XVj z+>^LyMBg6y*pdR20?K}@N$#^MRcgx8T#&k9yY2P0Np@cl{BipIcOKq2w#N7kj;(Pg z0U3E{cn$&NsQ145sQuP6gI=Ee+z78N6hDQ^wN_-hJTiybC%Q{}K01pgwezNqSQZ1* zCntXFT2((j*-Ek;Mx=mv^CU+Luj2g=<|N=79?AvT6ggTht{5i3tUohH-)O4)A~YpG zTStQ#CcFc`H#OP?TBnuLp0~)V_mLV(t`h7_IVo+OQR#BghkMa%Ra~wuedupo_L-51 zY%bDXl$)EW4`se~TM?EJZ8`t{R!;)|Yi{v`&Q}fGG!mA6qOruss$D}(eK zPJeaMVAOCuPEQwbpf}n|w=*``j%6R2Kdzcsmmo%8e)vqkY&Nh>9Lbavspb5GMC~j3 zUDNd(e-K60OEEyTap^yxc?tjPbXCmvmV82=kwvlMvK~-Yf-rM9c8tKC8X31N(-{)j z>LsF5WpjEYP^$nG0WISLukNm`0*32-L682rhRJj-=qo9s#;rdH8qJ4EqzbNEk9{Dp zl9LQLt;B_H{N=$bh-GgAlUr%rzXW!U+n!=3S{jjwIDBj$WnV)l8zNoHC*SjLD zI%&bPN#0RWLyrsCQ&1LaIvZ|)o2nx;l-0r}2i-Rm~n__F3NbKW4u_-OsR4dt!btSi`JwSS2y`5L`ks?Zo4Xsc`m_ zaKI6q4kp~&dJ1A#n`)-oK4Pzs`HSl~^Cu5)0NMVF^B;Q% zf|u`C1Kb64v&-ChIO&2*f%?eJ<4QnO%V??8NiLAU-ta>kctpqmqO~Cg<4VU*_;QtD z4#dlkiDg)yp$i(ARoYau)Np$Kb&DY_mIS+yBZs(|n=-N?f(tmoAC49OoB1xM5K}k4 zJXXDO+{KE--)T>7F7WQfpKblnzS6@vJq=>37Q~~^TP8k$^hgs4W8XPS=~j$wty!{Z zjcaFr?V+IAg78!RKJHZmo=TX{tvlUj>M~%MV*0;5qP`CHXgFveksnz(nFG4r40TZe zpi7M`4oWKq*$@4H?R|GV)&2W_OC_l!DhdtBZrFP^kQIlMkR)V=V;!7^Q6$Q0*b$DE zV~;}_(UEh=IAkT`*y9`=$63GE>At(~KA+z|-{0@=@B0sra~=ohHLvl!p4WA?Z3DO{ zWPNOl$ZL5(a_C4v;GHOm44Fd(60Tw(vPXO$BrVh6@I{xn6cqO%d!)c+=Kaf5DbC|! zkm?J;fw_7h1WELD;gNHG8K2Oi==PPmV{Z3vDGL%#9_{qwY9R18aA#Sj zgBqcKBML5rPsT^vK~@g;*9YM14+7WJtN=t6%5JqZ&~?c!zv9L_7n*-s`?GExs2$xB zJNbwMWCmQ>T=W}`5w|b3_F~6_4FpvW(taIEJ|!^WCsF<`>=g>#b7i|ZitkZ+0c|Sf z$BCQZ^rv{;c=8v|Ox9BL3k$OgVgLEsJll*1l?*TPVNky1Ng@P>jF7{r35O`x6c)GNL1OXX5%NYHR+qxm0jQ@{&g}~@scekeKb|k zPi#wubAX*#<8bBd&6#tj57qe`ODqOqWoNpSph%4To%1|xgF+xgjeVAgLME08Vrpr7 z0uIZFQg8g&?V&Pm3Omv6SAQxcq-J$C-@VN=wc{QT8vy~y`v0MMG^QT~dUGMFgwmTQ zg=>}y8&RGuT7V)DB0oaEK|as+rmmp*HGUfqzy=@Z%J!5d+KovzOE|4a((hYl>t6@? zEugHq5vb5pVxR3koW(0C7B1nKd?Lk5ucdgRh57(x_xwb&a4<@ zFd#rU`dIt7?tlj%=@s4$oFAemTHs0H!9TTIgRkXP!j$la;p0Guq>Y^5sA0)&mIWKTUz|zGwmOb-9^~Y?&$> zB15*0?E%;7l#1oRN)63+{e?$wwBdt;CLIS|PgDQ_yu`Qg)$2S6165{5gT$FDA^SPt zsD6orr`*}_rDy?^jN9zabG*%#Lfk+DaPplN7U}+H_kP{$^V(pV#NMq9m$0IyIb#_V z2_W;4p4If|Z6dK-J=*R~9C@7ZM9yv|DSm`}hJyDs5h7gYm9p8P&6^Ja*gvqdDDT{? zut)zx)*jJ1ob1zLBMLHJ=x0Er5C9veS67&v?cE?;Zg_V4NUW|x>MaKf$YxoPV7?iR zXHfZp{kBA6Cio=|rZ3gWT|9s{Y79TtZKO0*c8m4R_ak`{hESL&-+gDp+v!NGfu*%sc??8F{FLN+;#Dc7- za2UicI)IgN^IKOR69O)(L#ZXNW8m8A9U~ockZ>{N*@CnIDOs~1ZIFd+=?2*cYV$sh zcx!KB#7G%&40CfnroStb?p^^Z77whB1}B@(1YyL5n)OujoJXxDylJm)nThS zKJuqxA?&vH)HfwEg|x>8alVBDg_-Yh^s{cz_ObTv&o~f$wfr)Dnprc7 zNm?UJ^N7#Eb%N_Ira5#R-xE~&L{?$I%R76fdwAWp(8}UCDmf6@^FA65>`iltXcqVC zpUDO5PCrsA|0{LMN54NP@wxUeVu_;v@H(Xtd>MCCWI{ArU(h1ZwaT_$wz8c}k)FKf z4Dq#P7Im34z<^ChxhM#8uSD`X^6GzV2cXTT*vXRCtSBkukpdYvF;IIAi05HgQcqqS zwWJ)FB?^e>L;pR3SIU1`|7*vrEP2a@R1|D0_p+N;`y4e-_v7Ww|DXUYvET{v+1Sbq z$R|A;j8QU@8@T!6g_bLbHNDkVY4;POn7L$6w)+^Q$rLt0An@$w54bYOC3Ef+5|!*o z`Lc~gkos-m%7D_CPmaF*bQ{Fc_i^OkW2g2%|4R=Q-VfsdHnzz*OT}|dM>RZnP6MhZ zuV;4LWCGZ&m-!Lr)O%n*jJz^L~gMk6SYQo zNVy!0d32&3q|mqx>gA;HsydYvGie0VhLCTVgk>z$V z-$_%|{zQ9Eo+-ZQ8!iL_%DCYWMDDz++%ubV*`S-B_zfqXo$EnB2>xwlTmppd^4ly2 zHYMD`^=M+SLeB*W9Cz-0j`LDK=dMVIK?-g-v};i0)S;Uz?-qv=CXoX06qmW=@$jjcMUw#R!pi1%{>>M3SmHV&AyfOU zh?pN;Xfn9#I@`>GS=sb15MR=DRyY4dIIb^9O83GuOm$ z7^@ZjzKjf-l!L>}kDffG&51ZMRyPFD=Oz*$;)=TUypm@9)upIP_sP2Zp8q~(Uj3s1 zTegHsY3#_qdGwd;0g^66woC(@O*UyV+B{dA@=yuRNlUsOd94LA#UQ%DH5qQwn94P0 z05hHfz-`LbHNzGRD3Zt=8M*2B0PWGVo#@Ev`#qdRj0_4Wa0pI{J4IhB2HYUiT3>go z4^AXY(1xXk8RCpRb|WkUTVnLDU)Ey*PAz8Vu=K!ucXymBSSY5v#A->HlyuNUSL6cl z$?S#Ce8O-O9nie6&yj$1sCHTJBFOU+b{Xh&`+gd|{0ImEV79DgkS%VWSX+|5mL^qb z-LBZg-m3QLAJf*@ma9hSk$HYy(v8fbciLb(A|_q>zn(rUYF?hD1QzJ zQC>8blt-(*)DG-j$^|7wZxiHR2t!smTf%Zc(UdWa@Jl=8^5LR<3((YcQE!yVH%*oL9D5^pzE+s(DO6-bx?1~0edJd5YW?~VfOs8JIM=~x zj47w1d~FldaG6u?ROyk}6K55nHIyj~p#-4Csj7hXD<0*&^H19(8I*X6*7@5uaSXE4 zsXEA2M|1IQe~)HV!RfF-F2Vd;Edtave+rrQZgu=TPikwbI$yroie$r0KrUw`Th4eJ z7z_D5HGA2_kNW(TpBD?&ZSOB}FUKen%=SXDsur_7S2tVLcSHZf3X219)2@%huzqqiy2d4`{b-`*V8DoLWgcbNj`!U00E#&27j;kiT>vaF~imC%eVDVaUQVQi=<9N6a72Q?*N zLnQzX@~_%f)t)xRQE1;@cBrYU4se_Fesiv(E=g(=VQ1Bi8$xo=e!|E{F?0F~KhhMv zhY)`CGiK?Q!ja}#{lS?b)L?c)-6->lU&46@O5OO!l^K3^52*&9x)b@SY{KKMwN3L@ zm5CK@aqkUYY_7x9r3C@U3UI5Q@d-QJS=I-u%kX3|nEobX7y;DpI&T&$N9>oxsN9RS zh{(vmc_7|>%nN$j-Z{C$te_vCAC%gAd_(sqC)717JM2ana6w@C=alEwLM1fDzyIkr zv4K{@pYML?m*CC6#U3v1R}Vd4GD&O;)#|V!VBHl5K$az-1sO4hJrv!lS!w>#^n<|L z$WuB1^)k`|s}aboAWT>dLhFIuyIiEhm3r=a z%iVDx6%Js&vR;NSkWYYRfrS7^sPt|%x&1e+Q&jaRmd(lFPlFo?+TOOx0jvSYVG(1{ z&8yGw>-Wg8%Dtu4QoLV#vR~~Kzg+JbL%)jc3}hw+Pgud;0e4S_IW=;VTn#D@cuc~G zZvGkoW5LcReC(3V77>cEO^lNiY2_51A9X^N4lie}_S4n}zk$5p=BF7=jnPg8YkldO zixP)8R55~msp5Qa2Bc6-ASY!i{N#GS(|oy^c?r>$$)kG5`J2u?JT|y6RN~|P@%{3D zU>=P?BWD66e$iShN!?nfbR+VjO)R+20Te4{@3mz5%sQ$TC|Ngoy4A1TV z0M=WylKe>^L%=~(Kf;c}Rccj$ne-owXi>2&At;w=FjU7+rWT`?n`^7WNa%SrVD={F zB)5L|&UNyem;PDEX|^G_^7yisSBIFyqX_zndR^mf+QxLuTV*`mJ_vA0#U*#{d&a1G z6MC>KRS;YR0Ldh}t}D7V-^=X#glUzWd<%O_`$GQGuxhj?Xyy4f2GCg4-bL{-?muqFgkbdSN&nwN?E@MJdxqIQOv-(dXX+tS(P((8IL9?B6|Y3q@x?AGd0)AZrW zN%*)Kkz$LdZ%G@DUxGEwIm zpJN(#D=(rei5iVa7cq|01(FsH4?{b2^CV(FR10@~&lo6y%X_qK`90ddAeN_KwDBs$ zBV*d}O^D4I_gnUtDd!q**qQTOG2^||zmlVFE^y`9ajO6!yHZo|Um-;WDzP6P66;Qk zBc@sA^}iULQ zO%}XYCMG<&aQqioz!Tte{goA)Te;i%r@@c>{S$9}knqzLu}g7sL>#k_#&3K57UJc$ z%lIqxktAW)Dl{O6CScu42H%CKh}iq1rD;15>{;D7m{@^yi<6@-&^}rWN?sw zHGm@8fU5&oC!T80Kc~qm971K4zx06Z0?r@{v}5y9ONgBFvl5s38KAwBATeezf?_70019Y*E7)VnB zsbAYDZ}}zz25SAJ8;*hC$$zMO5Euox)vxEl5x@%l{pJZM#{B#B|KA6iDR2gb0D92} z=g%turVPeiUthmFJIQ7?sPJ-(00xJP**s=GTwGC^ad)4fS^=c+MxJ)WzVlG-KAu}K zj%iOu(R7_ucpqWZb;74NLE-cHtmMAP0hb^`fuMKfm)=mEUwIRuT)p2wRz*dZ(H;Ba7=Tm!Y>zq4i_5p2Wrv{k1KjL zSD$n5D|qeQg=pciIIF5UTEw8NIgb;L;T7p}np*T{>*DL8L$?^CJokgO>kdrSNu&f`bu z=A12a_T~|*v@sShZ@R$@Im=q?R&ux`FChiS#7(o2yI-jeQs?QP;;?vWKb!-!eg|k6sx3fq(;diRjtk8l@Ir5hwsfJ z{ypfz3f7?e#|K1y`gs)3{n|Xle{UWZy*ZnIZvd5zRT$rE?Kcd=eElj>+p)P~^9K#g zaoK)Dmoit}U^7X7PLS(ia9X+Hz=nNjEj4Oh8nM9>z#h#qN3d#Lp2cHOD^^9Z6F!n8NTnz5?c)Iw zhwmde!dpT0Blf;T*6v4d%>b3~|9Uj`9;o^KdP_5Ck@Wk`|9E) zS6M%KEb6fI^S5}|L>m{KL2j@BM-{d?lQS2gPRj^fpU)ev^^1_g=-HA22q_kh#bZkd zX6+j}x7j*g((qCUo{|a(%ulLD$qmfll)%|M*t(LJmsj!cmbDy%=gTQ{#vYslL3o2|&N!kLw80K-wcMbQ zaIkjC$~FS2cbakiy}|tuTi=E6EoVS&xGh_He@Sr8&nbQ*(Dlp9i^H|89dk7c6@!_K z42B~pfT$v1l!8ET+^8p`m-0MD>m6)4!le#d`@D#ZjKtKB#A+q=f`(hlqZGp)Zx4d~ za1G3X?1nE&A+3Q9!{XA?(z7Jl_|8c%2tS(~{9IudU0+YHCsUULHrE$@Z6|9CNYI^g z%ND-SVCwozS-0W!w{mVhNOSR&`=5_u1vef)Ld-Xeh4UvjY3-tF2T+Qkx^43VrE8;1 z`lu4=>&2AW*tZ__P^(IJSZb?UMQadPcL&^Xv8_761vIJ8U#_XAOz{)ssM_Qt+mIRB z)-GN<+GVhT8T}Bb#t$ z!&?f9%9?li)Y)WEDKm8;Xn_G1aYHuEHGigLbDn%X8A z!Stg~Usm@Li-r_fj_uH2M+<~(*yW&3R_#+~ti-I%m*SMhBIrXnb!JdA&bSwM#7)v| zxN#tO0X|5VF#gikW~{0Cko0EWuem;?*W5ypjGlO@e-c}Y?sIySq3@7kK!Fu35)}Hp zErvh|~STMwLFpFqQ z{qcBz^2hfyya##>LI@ZMARH%nQ%?oNhN-OYnput&Y186`tJMa7e6Ur|$SCG}4f1_P z6n#bY$eB<Wk^;8=$3kHz_#8Vo;qUPJl31&S{MiRNwftKUp1g zOI~Q&ul}rN-=|YYZkUrVUV`uAz%)Xg>}&xVPznPBeKI)j$SR~k1sMvn5OhDtBkUM7io;I@?pbH?1oofL z%!j$xpbg_AX!vB8GDLjaNuC`R#Ws?IgpRispG~V@vQzh~ZKS&zMIl{{*bLNn?H4#E z`#R++r9j+^zPW}_i(hlrF9#P9B^kGz=cRyP1O?QG&^NK&IY#Z4T4`qAWWp2&9A|s- zQe<8Fp79xVzQpS*7cTm`dhpjwe8;;exbziVSO*H;FI6Sr+dzFVJRs!9$A>25u|bap z$*rG(j&3IboIcThpHl04_(1R|r~qB+K*c18^DkX(e82eNE`>NbNhx>1Z;rICfI5vI z3#n@RlwzLR)M~cQ?Xy1EoMk#0C0&0ON1h+J=p}$&Xt}rXD)Lom=(Sl{+e-HoTRCvx z##!erZUhjWFrmwlJmQx=e-jh6Z=ezN18hX1uMeBZMz@d%IOS0UGZ?x(8^Rm3F&1%Z zkhS#}64}0VzY%Au!Df4^md+>adELKMbha(<6m%LLbk+sn2_+;3V{@+fg6~Azi+XM* zI;!b%z0_bmjo5B7F6;BuU>Uz||5z(&sh(PN-sj6&(Y*&NKno`l%9YM;HAPS5P35BA z8x-jmwVosNFV(~H$BY{~g%+KpqEi8!>D4k>i)ZD z*G~H!tw8txJL@~w5@#a>LyqL#&I{B|@?W2aIxi)rC7I#wP%jGx%ghdW*$j`e%m*2o z^)v`_$3f3TaT~0@eP$^B!Jr1r-Auvkn!PQ84m+xEl~d-3*|rd%24A0l5o}ZEZ-TsV zp|7VV->Oiitw!v1Cr*dl6tVyEceRBPG_@lFRrF<(XGLWvJS_J%rt?=w|h|01DB8P&pbhCjmxekh?6Um83~H-{m4d?Jw(d zHP=)&Op3kkLZa{8YlN57WUFkd>=%j;|cQHzIN>%(tJC$G%p zq$NUbI>Y*EB@-^P^S!ZAFD?biVX+8(l?yEut^*gQ{<)$2az1(Hkbq>h;J~cFJn{=n&PZB9G{5|2 zHV|3ofVsWpT%N;ig}6_7+osL&YgcMNnAPs(uDL^0a;cs`Y&uHD6)c$IRq_gRGY#*G z#9y7n_%Dv2t-iyv-L8vyc+LMZn@K>akuqG{I)xAJofyrl2w>95%KUP!(_oQvmgc0b zDhlTD!-hzCpQknHfqv6Opp^W0B`l5Cjl|1$Sh|Hux!{Wy=7BOU%g0c!l^H)La&F&ys)32ohR^zmgops8*O}JIw&jQ9%{u=Q11$t?rIkq`-^hQ6!m`&z z)2Za7PO-vPu%FXLz&ts(wb%wNHg_}2^pxgj;5MwKA#ec=dG&40iUwwV>#r|5Vz0=8 zN}gNj?4bYh8KJ159NqqBM=vVX`Yz1Yh0p^{>y`=z&wEdOMfq|VG{>kjEc-qmEe<;l z{={Q9_!HK1GtDKmWi0 literal 0 HcmV?d00001