From a8c4e9d0db9f220c5f4676ca8f38472fe8dc44d9 Mon Sep 17 00:00:00 2001 From: akhabbaz Date: Tue, 19 Sep 2017 13:13:51 -0400 Subject: [PATCH 1/5] got all working but thrust --- INSTRUCTION.md | 2 +- README.md | 9 +- src/main.cpp | 37 +++-- src/testing_helpers.hpp | 2 +- stream_compaction/CMakeLists.txt | 2 +- stream_compaction/common.cu | 14 +- stream_compaction/common.h | 71 ++++---- stream_compaction/cpu.cu | 131 ++++++++++----- stream_compaction/efficient.cu | 267 +++++++++++++++++++++++++++---- stream_compaction/naive.cu | 118 +++++++++++--- stream_compaction/naive.h | 2 +- 11 files changed, 501 insertions(+), 154 deletions(-) diff --git a/INSTRUCTION.md b/INSTRUCTION.md index 792c530..d8e0397 100644 --- a/INSTRUCTION.md +++ b/INSTRUCTION.md @@ -310,4 +310,4 @@ The template of the comment section of your pull request is attached below, you + You can try multi-threading on CPU if you want (not required and not our focus) + for each element input[i] in original array - if it's non-zero (given by mapped array) - - then put it at output[index], where index = scanned[i] \ No newline at end of file + - then put it at output[index], where index = scanned[i] diff --git a/README.md b/README.md index b71c458..8aa5fd8 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,16 @@ CUDA Stream Compaction **University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 2** -* (TODO) YOUR NAME HERE -* Tested on: (TODO) Windows 22, i7-2222 @ 2.22GHz 22GB, GTX 222 222MB (Moore 2222 Lab) +* Anton Khabbaz +* pennkey:akhabbaz +* Tested on: Windows 10 surface book i7-6600u at 2.66 GHz with a GPU GTX 965M +Personal computer ### (TODO: Your README) + +Here I implemented the efficient scan using contiguous threads. This worked perfectly up to one block but beyond one block the code failed. The issue was that threads beyond one block do not synchronize. + Include analysis, etc. (Remember, this is public, so don't put anything here that you don't want to share with the world.) diff --git a/src/main.cpp b/src/main.cpp index 7305641..79ba365 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,14 +12,18 @@ #include #include #include "testing_helpers.hpp" +#include -const int SIZE = 1 << 8; // feel free to change the size of array +const int SIZE = 1 << 26;// feel free to change the size of array const int NPOT = SIZE - 3; // Non-Power-Of-Two -int a[SIZE], b[SIZE], c[SIZE]; +//int a[SIZE], b[SIZE], c[SIZE]; int main(int argc, char* argv[]) { - // Scan tests + // Scan tests + int* a = static_cast(malloc(SIZE * sizeof(int))); + int* b = static_cast(malloc(SIZE * sizeof(int))); + int* c = static_cast(malloc(SIZE * sizeof(int))); printf("\n"); printf("****************\n"); printf("** SCAN TESTS **\n"); @@ -45,12 +49,15 @@ int main(int argc, char* argv[]) { 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); + + + printDesc("naive scan, power-of-two"); + for (int i{0}; i < 10; ++i) + StreamCompaction::Naive::scan(SIZE, c, a); + printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(cuda measured)"); + printArray(SIZE, c, true); printCmpResult(SIZE, b, c); + zeroArray(SIZE, c); printDesc("naive scan, non-power-of-two"); @@ -61,16 +68,17 @@ int main(int argc, char* argv[]) { zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); - StreamCompaction::Efficient::scan(SIZE, c, a); + for (int i{0}; i < 10; ++i) + 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); @@ -129,15 +137,18 @@ 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 + free(a); + free(b); + free(c); } diff --git a/src/testing_helpers.hpp b/src/testing_helpers.hpp index ae94ca6..f0257a1 100644 --- a/src/testing_helpers.hpp +++ b/src/testing_helpers.hpp @@ -44,7 +44,7 @@ void zeroArray(int n, int *a) { } void genArray(int n, int *a, int maxval) { - srand(time(nullptr)); + // srand(time(nullptr)); for (int i = 0; i < n; i++) { a[i] = rand() % maxval; diff --git a/stream_compaction/CMakeLists.txt b/stream_compaction/CMakeLists.txt index cdbef77..6ad13f6 100644 --- a/stream_compaction/CMakeLists.txt +++ b/stream_compaction/CMakeLists.txt @@ -13,5 +13,5 @@ set(SOURCE_FILES cuda_add_library(stream_compaction ${SOURCE_FILES} - OPTIONS -arch=sm_20 + OPTIONS -arch=sm_52 ) diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 8fc0211..f3d7519 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -23,7 +23,11 @@ namespace StreamCompaction { * which map to 0 will be removed, and elements which map to 1 will be kept. */ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { - // TODO + int index = threadIdx.x + blockIdx.x * blockDim.x; + if (index >= n) { + return; + } + bools[index] = ( idata[index] == 0) ? 0 : 1; } /** @@ -32,7 +36,13 @@ namespace StreamCompaction { */ __global__ void kernScatter(int n, int *odata, const int *idata, const int *bools, const int *indices) { - // TODO + int index = threadIdx.x + blockIdx.x * blockDim.x; + if (index >= n) { + return; + } + if ( bools[index] == 1) { + odata[indices[index]] = idata[index]; + } } } diff --git a/stream_compaction/common.h b/stream_compaction/common.h index 55f1b38..fe5276e 100644 --- a/stream_compaction/common.h +++ b/stream_compaction/common.h @@ -1,5 +1,5 @@ -#pragma once - +#pragma once + #include #include @@ -7,36 +7,39 @@ #include #include #include -#include +#include #include - -#define FILENAME (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) -#define checkCUDAError(msg) checkCUDAErrorFn(msg, FILENAME, __LINE__) - -/** - * Check for CUDA errors; print and exit if there was a problem. - */ -void checkCUDAErrorFn(const char *msg, const char *file = NULL, int line = -1); - -inline int ilog2(int x) { - int lg = 0; - while (x >>= 1) { - ++lg; - } - return lg; -} - -inline int ilog2ceil(int x) { - return ilog2(x - 1) + 1; -} - -namespace StreamCompaction { - namespace Common { - __global__ void kernMapToBoolean(int n, int *bools, const int *idata); - - __global__ void kernScatter(int n, int *odata, - const int *idata, const int *bools, const int *indices); - + +#define FILENAME (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) +#define checkCUDAError(msg) checkCUDAErrorFn(msg, FILENAME, __LINE__) + +/** + * Check for CUDA errors; print and exit if there was a problem. + */ +void checkCUDAErrorFn(const char *msg, const char *file = NULL, int line = -1); + +inline int ilog2(int x) { + if (x < 0) { + return 0; + } + int lg = 0; + while (x >>= 1) { + ++lg; + } + return lg; +} + +inline int ilog2ceil(int x) { + return ilog2(x - 1) + 1; +} + +namespace StreamCompaction { + namespace Common { + __global__ void kernMapToBoolean(int n, int *bools, const int *idata); + + __global__ void kernScatter(int n, int *odata, + const int *idata, const int *bools, const int *indices); + /** * This class is used for timing the performance * Uncopyable and unmovable @@ -127,6 +130,6 @@ namespace StreamCompaction { float prev_elapsed_time_cpu_milliseconds = 0.f; float prev_elapsed_time_gpu_milliseconds = 0.f; - }; - } -} + }; + } +} diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 05ce667..981593c 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -1,50 +1,93 @@ -#include -#include "cpu.h" - +#include +#include "cpu.h" + #include "common.h" - -namespace StreamCompaction { - namespace CPU { + +namespace StreamCompaction { + namespace CPU { using StreamCompaction::Common::PerformanceTimer; PerformanceTimer& timer() { static PerformanceTimer timer; return timer; - } - - /** - * CPU scan (prefix sum). - * For performance analysis, this is supposed to be a simple for loop. - * (Optional) For better understanding before starting moving to GPU, you can simulate your GPU scan in this function first. - */ - void scan(int n, int *odata, const int *idata) { - timer().startCpuTimer(); - // TODO - timer().endCpuTimer(); - } - - /** - * CPU stream compaction without using the scan function. - * - * @returns the number of elements remaining after compaction. - */ - int compactWithoutScan(int n, int *odata, const int *idata) { - timer().startCpuTimer(); - // TODO - timer().endCpuTimer(); - return -1; - } - - /** - * CPU stream compaction using scan and scatter, like the parallel version. - * - * @returns the number of elements remaining after compaction. - */ - int compactWithScan(int n, int *odata, const int *idata) { - timer().startCpuTimer(); - // TODO - timer().endCpuTimer(); - return -1; - } - } -} + } + + + // occupied array converts an array of integers to an array of 0, 1s + + void boolArray(int n, int * odata, const int * idata){ + + for (int i{0}; i < n; ++i){ + odata[i] = (idata[i] == 0) ? 0 : 1; + } + } + /** + * CPU scan (prefix sum). + * For performance analysis, this is supposed to be a simple for loop. + * (Optional) For better understanding before starting moving to GPU, you can simulate your GPU scan in this function first. + */ + // implement the simplest for loop to do the sum of prior elements + void scanNoTimer(int n, int *odata, const int *idata) { + // odata[0] = 0; + // for (int i{ 1 }; i < n; ++i) { + // odata[i] = odata[i - 1] + idata[i - 1]; + // } + int prior {0}; + for (int i{0}; i < n; ++i){ + *(odata+i) = prior; + prior = prior + idata[i]; + } + } + void scan(int n, int *odata, const int *idata) { + timer().startCpuTimer(); + scanNoTimer(n, odata, idata); + timer().endCpuTimer(); + } + + /** + * CPU stream compaction without using the scan function. + * + * @returns the number of elements remaining after compaction. + */ + int compactWithoutScan(int n, int *odata, const int *idata) { + timer().startCpuTimer(); + int size {0}; + for (int i {0}; i < n; ++i) + { + if ( idata[i] != 0) { + odata[size++] = idata[i]; + } + } + + timer().endCpuTimer(); + return size; + } + + /** + * CPU stream compaction using scan and scatter, like the parallel version. + * + * @returns the number of elements remaining after compaction. + */ + int compactWithScan(int n, int *odata, const int *idata) { + + // timer().startCpuTimer(); + // allocation is costly and may dominate the time. + int * boolarray { new int[n]}; + timer().startCpuTimer(); + // turn idata into an array of 0 and 1s + boolArray(n, boolarray, idata); + // odata is now the exclusive prefix sum. + scanNoTimer(n, odata, boolarray); + int lastIndex{-1}; + for (int i {0}; i < n; ++i) + { + if ( boolarray[i] ) { + lastIndex = odata[i]; + odata[lastIndex] = idata[i]; + } + } + timer().endCpuTimer(); + return lastIndex + 1; + } + } +} diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 36c5ef2..5f5b1c8 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -1,40 +1,237 @@ -#include -#include -#include "common.h" -#include "efficient.h" - -namespace StreamCompaction { - namespace Efficient { +#include +#include +#include "common.h" +#include "efficient.h" +#include +static const int blockSize{ 256}; + +void printArray2(int n, int *a, bool abridged = false) { + printf(" [ "); + for (int i = 0; i < n; i++) { + if (abridged && i + 2 == 15 && n > 16) { + i = n - 2; + printf("... "); + } + printf("%3d ", a[i]); + } + printf("]\n"); +} + + + +namespace StreamCompaction { + namespace Efficient { using StreamCompaction::Common::PerformanceTimer; PerformanceTimer& timer() { static PerformanceTimer timer; return timer; - } - - /** - * Performs prefix-sum (aka scan) on idata, storing the result into odata. - */ - void scan(int n, int *odata, const int *idata) { - timer().startGpuTimer(); - // TODO - timer().endGpuTimer(); - } - - /** - * Performs stream compaction on idata, storing the result into odata. - * All zeroes are discarded. - * - * @param n The number of elements in idata. - * @param odata The array into which to store elements. - * @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) { - timer().startGpuTimer(); - // TODO - timer().endGpuTimer(); - return -1; - } - } -} + } + + // initialize the arrays on the GPU + // returns the addresses of the pointers on the GPU + // dev_idata is a pointer to the address of the dev_idata array that + // gets updated here + // initialize dev_idata has the first + // elements copied and the remainder to make the stream 2^n + // are set to 0. The first input is the size of the arrays + // to allocate and the second input is the size of the array to transfer. + // N the maximum size of the allocated array. n is the size of the data array + // N is one more than the multiple of 2 greater or equal to n, + // in dev_idata, and then the elements are copied inte dev_idata. + + void initScan(int N, int n, const int *idata, int ** dev_idata) + { + int size {sizeof(int)}; + cudaMalloc((void**) (dev_idata), N * size); + checkCUDAError("Allocating Scan Buffer Efficient Error"); + cudaMemset(*dev_idata, 0, N * size); + cudaMemcpy(*dev_idata , idata, n *size, cudaMemcpyHostToDevice); + // no need to initialize the odata because the loop does that each time + checkCUDAError("Initialize and Copy data to target Error"); + cudaThreadSynchronize(); + } + // transfer scan data back to host + void transferScan(int N, int * odata, int * dev_odata) + { + cudaMemcpy(odata, dev_odata, N * sizeof(int), cudaMemcpyDeviceToHost); + } + + // end the scan on the device. + void endScan( int * dev_idata) + { + cudaFree(dev_idata); + } + // kernParallelReduction uses contiguous threads to do the parallel reduction + // There is one thread for every two elements + __global__ void kernParallelReduction(int N, int Stride, + int iteration, int * dev_idata) + { + int thread = threadIdx.x + blockIdx.x * blockDim.x; + if (thread >= N >> iteration ) { + return; + } + int priorStride { Stride >> 1}; + int index = (thread + 1) * Stride -1; + if (index < N) { + dev_idata[index] += dev_idata[index - priorStride]; + } + } + // Downsweep uses contiguous threads to sweep down and add the intermediate + // results to the partial sums already computed + // There is one thread for every two elements. Here there is a for loop + // that changes the stride. Contiguous allows the first threads to do all + // the work and later warps will all be 0. + __global__ void kernDownSweep(int N, int stride, int iteration, int * dev_idata) + { + int thread = threadIdx.x + blockIdx.x * blockDim.x; + if ( thread >= N >> iteration) { + return; + } + // have one thread set the last element to 0; + int startOffset { N - 1}; + int right = - stride * thread + startOffset; + if (right >= 0) { + int separation = stride >> 1; + int left = right - separation; + int current = dev_idata[right]; + dev_idata[right] += dev_idata[left]; + dev_idata[left] = current; + } + } +// __global__ void kernDownSweep(int N, int * dev_idata) +// { +// int thread = threadIdx.x + blockIdx.x * blockDim.x; +// if ( 2 * thread >= N) { +// return; +// } +// // have one thread set the last element to 0; +// int startOffset { N - 1}; +// if (thread == 0) { +// dev_idata[startOffset] = 0; +// } +// for ( int stride = {N}; stride > 1; stride >>= 1) +// { +// int right = - stride * thread + startOffset; +// if (right >= 0) { +// int separation = stride >> 1; +// int left = right - separation; +// int current = dev_idata[right]; +// dev_idata[right] += dev_idata[left]; +// dev_idata[left] = current; +// } +// __syncthreads(); +// } +// } + /** + * Performs prefix-sum (aka scan) on idata, storing the result into odata. + */ + void efficientScan(int N, int d, int * dev_idata) + { + int Nthreads {N>>1}; + dim3 fullBlocksPerGrid((Nthreads + blockSize - 1)/ blockSize); + int iteration{ 1 }; + for ( int stride = {2}; stride <= N; stride *= 2) + { + kernParallelReduction<<>> + (N, stride, iteration, dev_idata); + ++iteration; + } + cudaMemset((dev_idata + N - 1), 0, sizeof(int)); + iteration = d; + for ( int stride = {N}; stride > 1; stride >>= 1) + { + kernDownSweep<<>>(N, stride, + iteration, dev_idata); + --iteration; + } + } + void scan(int n, int *odata, const int *idata) + { + int * dev_idata; + // d is the number of scans needed and also the + // upper bound for log2 of the number of elements + int d {ilog2ceil(n)}; // + int N { 1 << d }; + initScan(N, n, idata, &dev_idata); + timer().startGpuTimer(); + efficientScan( N, d, dev_idata); + timer().endGpuTimer(); + // only transfer tho first n elements of the + // exclusive scan + transferScan(n, odata, dev_idata); + endScan(dev_idata); + } + + void initCompact(int N, int n, const int *idata, int ** dev_idata, + int **dev_booldata, int ** dev_indices, int **dev_odata) + { + int size {sizeof(int)}; + cudaMalloc(reinterpret_cast (dev_booldata), N * size); + cudaMalloc(reinterpret_cast (dev_idata), N * size); + cudaMalloc(reinterpret_cast (dev_indices), N * size); + cudaMalloc(reinterpret_cast (dev_odata), N * size); + checkCUDAError("Allocating Compaction Scan Error"); + cudaMemset(*dev_idata, 0, N * size); + cudaMemcpy(*dev_idata , idata, n *size, cudaMemcpyHostToDevice); + // no need to initialize the odata because the loop does that each time + checkCUDAError("Initialize and Copy data to target Error"); + cudaThreadSynchronize(); + } + /** + * Performs stream compaction on idata, storing the result into odata. + * All zeroes are discarded. + * + * @param n The number of elements in idata. + * @param odata The array into which to store elements. + * @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 * dev_idata; + int * dev_booldata; + int * dev_indices; + int * dev_odata; + // d is the number of scans needed and also the + // upper bound for log2 of the number of elements + int d {ilog2ceil(n)}; // + int N { 1 << d }; + initCompact(N, n, idata, &dev_idata, &dev_booldata, &dev_indices, + &dev_odata); + timer().startGpuTimer(); + dim3 fullBlocksPerGrid((N + blockSize - 1)/ blockSize); + + StreamCompaction::Common::kernMapToBoolean<<>>(N, dev_booldata, dev_idata); + cudaMemcpy(dev_indices, dev_booldata, N * sizeof(int), + cudaMemcpyDeviceToDevice); + efficientScan( N, d, dev_indices); + StreamCompaction::Common::kernScatter<<>>(N, dev_odata, dev_idata, + dev_booldata, dev_indices); + timer().endGpuTimer(); + int lastIndex; + transferScan(1, &lastIndex, dev_indices + N - 1); + int lastIncluded; + transferScan(1, &lastIncluded, dev_booldata + N - 1); + std::vector input(n); + std::vector bools(n); + std::vector indices(n); + transferScan(n, input.data(), dev_idata); + transferScan(n, bools.data(), dev_booldata); + transferScan(n, indices.data(), dev_indices); + printArray2(n, input.data(), true); + printArray2(n, bools.data(), true); + printArray2(n, indices.data(), true); + n = lastIncluded + lastIndex; + transferScan(n, odata, dev_odata); + printArray2(n, odata, true); + endScan(dev_odata); + endScan(dev_idata); + endScan(dev_indices); + endScan(dev_booldata); + return n; + } + } +} diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 9218f8e..b973c86 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -1,25 +1,103 @@ -#include -#include -#include "common.h" -#include "naive.h" - -namespace StreamCompaction { - namespace Naive { +#include +#include +#include "common.h" +#include "naive.h" +/// threads per block +static const int blockSize{ 256 }; +namespace StreamCompaction { + namespace Naive { using StreamCompaction::Common::PerformanceTimer; PerformanceTimer& timer() { static PerformanceTimer timer; return timer; - } - // TODO: __global__ - - /** - * Performs prefix-sum (aka scan) on idata, storing the result into odata. - */ - void scan(int n, int *odata, const int *idata) { - timer().startGpuTimer(); - // TODO - timer().endGpuTimer(); - } - } -} + } + + // initialize the arrays on the GPU + // returns the addresses of the pointers on the GPU + // dev_idata is a pointer to the address of the dev_idata array that + // gets updated here + // initialize the dev_odata to 0.0; dev_idata has the first + // elements copied and the remainder to make the stream 2^n + // are set to 0. The first input is the size of the arrays + // to allocate and the second input is the size of the array to transfer. + // N the maximum size of the allocated array. n is the size of the data array + // N is one more than the multiple of 2 greater or equal to n, + // 0 is placed at the first element + // in dev_idata, and then the elements are copied inte dev_idata. + // dev_odata has its first element initialized to 0 too. + void initScan(int N, int n, const int *idata, int ** dev_odata, int ** dev_idata) + { + int size {sizeof(int)}; + cudaMalloc(reinterpret_cast (dev_idata), N * size); + cudaMalloc(reinterpret_cast (dev_odata), N * size); + checkCUDAError("Allocating Scan Buffer Error"); + cudaMemset(*dev_idata, 0, N * size); + cudaMemset(*dev_odata, 0, N * size); + cudaMemcpy(*dev_idata + 1, idata, n *size, cudaMemcpyHostToDevice); + // no need to initialize the odata because the loop does that each time + checkCUDAError("Initialize and Copy data to target Error"); + cudaThreadSynchronize(); + } + // transfer scan data back to host + void transferScan(int N, int * odata, int * dev_odata) + { + cudaMemcpy(odata, dev_odata, N * sizeof(int), cudaMemcpyDeviceToHost); + } + + // end the scan on the device. + void endScan(int * dev_odata, int * dev_idata) + { + cudaFree(dev_idata); + cudaFree(dev_odata); + } + + + + // TODO: + __global__ void kernOneNaiveScan(int N, int pow2d_1, int * dev_odata, int * dev_idata) + { + int k = threadIdx.x + blockIdx.x * blockDim.x; + if (k >= N || (k < pow2d_1 >> 1)) { + return; + } + dev_odata[k] = dev_idata[k]; + if ( k >= pow2d_1) { + dev_odata[k] += dev_idata[k - pow2d_1]; + } + } + + + /** + * Performs prefix-sum (aka scan) on idata, storing the result into odata. + */ + void scan(int n, int *odata, const int *idata, int indx) + { + int * dev_idata; + int * dev_odata; + // d is the number of scans needed and also the + // upper bound for log2 of the number of elements + int d {ilog2ceil(n)}; // + // add one so that the 0th element is 0 for the + // eclusive Scan + int N { 1 << d }; + initScan(N + 1 , n, idata, &dev_odata, &dev_idata); + timer().startGpuTimer(); + dim3 fullBlocksPerGrid((N + blockSize - 1)/ blockSize); + // int final { 1 << d - 1}; + for (int pow2d_1 {1}; pow2d_1 < N; pow2d_1 *= 2) { + // copy all elements to dev_odata to save + kernOneNaiveScan<<>> + (N, pow2d_1, dev_odata + 1, dev_idata + 1); + std::swap(dev_odata, dev_idata); + if (pow2d_1 == indx) break; + } + timer().endGpuTimer(); + // only transfer tho first n elements of the + // exclusive scan + transferScan(n, odata, dev_idata); + endScan(dev_odata, dev_idata); + + } + } +} diff --git a/stream_compaction/naive.h b/stream_compaction/naive.h index 37dcb06..4d9bfd7 100644 --- a/stream_compaction/naive.h +++ b/stream_compaction/naive.h @@ -6,6 +6,6 @@ namespace StreamCompaction { namespace Naive { StreamCompaction::Common::PerformanceTimer& timer(); - void scan(int n, int *odata, const int *idata); + void scan(int n, int *odata, const int *idata, int indx = 100); } } From 1cb1a08b3aa13c3e00881f14e5e1e0f09d9b51f5 Mon Sep 17 00:00:00 2001 From: akhabbaz Date: Tue, 19 Sep 2017 23:43:16 -0400 Subject: [PATCH 2/5] All code finished and figures made --- RunTimes.xlsx | Bin 0 -> 20926 bytes img/RunTimes.pdf | Bin 0 -> 43488 bytes img/RunTimes.png | Bin 0 -> 73970 bytes img/StreamCompactionTimes.pdf | Bin 0 -> 42320 bytes img/StreamCompactionTimes.png | Bin 0 -> 78655 bytes src/main.cpp | 8 +- stream_compaction/efficient.cu | 438 ++++++++++++++---------------- stream_compaction/efficientOld.cu | 193 +++++++++++++ stream_compaction/thrust.cu | 53 ++-- 9 files changed, 437 insertions(+), 255 deletions(-) create mode 100644 RunTimes.xlsx create mode 100644 img/RunTimes.pdf create mode 100644 img/RunTimes.png create mode 100644 img/StreamCompactionTimes.pdf create mode 100644 img/StreamCompactionTimes.png create mode 100644 stream_compaction/efficientOld.cu diff --git a/RunTimes.xlsx b/RunTimes.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..342477ea54da31d1cc852552766525ebe11a6428 GIT binary patch literal 20926 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 z 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 literal 0 HcmV?d00001 diff --git a/img/RunTimes.png b/img/RunTimes.png new file mode 100644 index 0000000000000000000000000000000000000000..3948a97d9b5364b5798defca76192efd49f8e11c GIT binary patch literal 73970 zcmeEuc{tQ>*zZ)5ETs~%w@b2QNp>kBdu88-WF1o0u|}wDMF=4~W#6|!gi7`p3{9Cd z7)-LSoqP22d*AoE&bh90{yWz>?{lf9neRN`=Xt)*bKjr)bAN76v^10%XxV5H2n2)5 z^{YAv1T{MXu}7PR8s1q`Wq1hx?7w&2-~j?5aFX(8mq(_Y8v;SAZmX!MrDfyf;`G4A z=^l@Yq9V_|`%ZUl9jp)tkKv@7?)uTo%(D1ptAn~%27eXDIXpz1IGIQDfzcq1F$#fv z#CTY~CFn7&F4NINudd&IAJ9*GJ?Zh-Yu+krg{O}VLvI^P%yN%pm;0c}Gc)Vh^*Z7! z;zp-u*Fpb7htE9!nP!K$tP>XU{>EY{A zB)74v&Y-B77Gjo>%$QZuwe-`R#`~{JR^Q5U=y( zPY6&o7VPpjsJN)S+aI$R;TEC)?4Z0k!ax2B|7Qe`#BPKl*O87rJZgJh3-va9%Qd?f zRCRq9qOm=uBko482vb!|H=FzKU*E=#k2N_IUqP~*W4ycn$B9>Qi6@U-C+<<}q(>mw zR(sxUNyt4T{`~R%=Ut)$d7&k3%l?2Wd_YS~|L!(-x^1AwsC^ACd1)-$H$t z;L|M}`WM1EK|VgeF+Fh88R_U&pc6rCr@A8SxJ*2`)fVKp8F8*>OtjdT|LD^>{U=pg zC)C?Kt971VJ^nFf?C_-D#X0WS&Hd5t42Zm7%|?xiedX;AjlQ$Hc84C&?{!1S`_5ko zW21YHV6+y!=(&tQL^rHP%Aenb=!nZ8AP{vEtj0MnSkzi+5QwXZ|hfry8XhuTcN+=b%kxja4{yt5I^0s=R0q+v`IK-x{#za2Jy zNV>;DZO)q9#99};pGx5a%@O2r$;XE*A_h-%(y+uwP@Ox=0|idk~% zUvfLj-k6Le)12BJ>VIUK#`FXUh6&`ieQHr%#q0uA$M}ANWYP>FkN<9L=)R z=)*otZt(bv*gB>DdEE%%ZQKI`A>-hX(EO)6Xud(5cv8$6ddWaWg}< zm(li>+8NR_)W@$sXiEI^c;cQ{K0EkKGiv=~^N&g<$(F}sYWvep>14b(tSV+DH%^tA za`8(1>o?jRxyfH>-aM8}F;qdlcGD8P8IpTM)HUIBM2zD4Z;8+Q=<`p9V?zHP!XWQo3ELMabR% zh52oNF6ZsqT=9ZV9e15btuAe|^m?<+fHg~olHeev*TL7*Z&_Bh9t%It+;l3m!N+bU4n1ir{<*(1rEGO(=+E(@a zdh|W#P`gdd^Y=FCJu2yEtIo`ZSQErNSY+?!IdNFziGH;jv6n_#*j~hCyw7O)QGc%E zg?+-^nx3*gm(QO+@Q>sT=6#%wxZMBBJ{eg*REOIL56Zmuszo(aJhUx#IM%y;Z>)Ok za^6c_SzS-vMO|#3%78J6pM)CFbI@YfOQcVfOl+^n$xqCG@0N(dGmSAtp6flgc++uM zczR=+b~<62dgk&Ha_RIEYN?C!Gsj`h0Vx+L@B1#UpWPhp)sZs3i#F%J&uyO6vu3wW zeULOS#*%g8S^MEQw>XxYsO+cNjw$H&m~pn*n%?rh#q`A5#F6|V)R)oEGA%xD*VP3Q z**}^z%a9coel6>dIe#W3WhZ7g%|9awn!1@9n66{EG)rHdNgfbFeZajp`i5!uGMAK< zv0Ce#+#}m6yE_G)5>lU4e*!O4f6{lrH{N&OM)JDUTKi_?O2c>0-^_Cwd(C&f+cmxm z^N{Uf=^pz%+*I*Ynft`{hVQMV7NnOwdWC*Jg8}#bXs1S&-|VZFA|uxP2|Y(Y(Ig!; zWM32dd`69H;7~+x7Y&}#*C}gNZSr#k&Es#%4v(w2ZI8vXtoksW!967ar=E;xu zgYRXY5FYF%IwXj^`jK!e*2S`5d?c-!<>zE)d$PNM4W*O2qjh08Bqy?B+b!(ba*b{;EK$y=#;_x$;2h990kQJ>hOLq0A4IJx>@ z9(U9sNUbNmOs7EW0JEB4&Up_bRwIw9>zM0?UqtYCx29H4(giSkW1bahRTY&ER(TlA zeLK-`t(N&@=uH-P0bvuJnmZo0zj}SzZQ4s>H?_v}b#DK*^Bnmdp%d7fnW=a_Kuzy4kLvP4JG?gI^yA6*Cp?bC;B@LC(b0em)|qw zJJ6&s{_ZS3%iD{fHIdrcJks2OkN2xwq#<4RJl`wX;F@>B$YU{|mLCMlj6a_cmErQ?}Vj;hl&iz{wRGc4}3vuYzI=tz&kjr!ruseNk)r~Jyc zime(^-&V{U&AXZn4w4V-4@us7@ux53d$00m<^GdOC&MF?xVhOG*f78EbVh&AF3CR9 z^~qQFk0I=hy4BFGh62yr`TOLzxrLH#C)>E|Iz46PvNrNNaX#cK zat*!>!yV7NA-|+7MiRG{1hjH$?={CXeNH9d!f(eHwxA4@4kV z|G>YK2!yK;0x@NdKuEqsAXuED%vzKXyO_CEt}5K}7@pqrao|`@B6|9&>Zs7>CbQ1O zexmmr76`u4HyZEDd)czz)Fo@QAA63W_3MH;@ow)WDeRfM4zHfn%4j|)s*;)*G2In@ znLgW|We?i?lKgT9^3|RZ7^;l^ylEVnherA&S}?D$(%P|-@LwY|8fpmYi}ms z?NRP&8tXGBQ(mf^i(d8J6|nLwvSGvO*@n;9^5)mlii)MMj7Wenf7@%nE-preJv;v$ z#6)tK1G4+u8hH+g`Tm|rkGyzd=dIUoiOF69TQ8FscHS}PdGz0}VKM&SU560X-7vpt zWd+6$%RVRvhxcZQ@$t`5IQj#WJwSg9N!dP2F+4Q4_+ox|nvN|qG;0;>-;zwaTSU3Q z{5lOpZ-^qNmHNV#mTN)C!KI5x);GFu4~ZiNQw{U&TwQNR-ATwQ8Oq~tw=joG(ei@` zMB~c`CY8BrYG?cU`Yx(R2OXI-_p<^g_=4YU2%0oqObU zSwT2`@{yE9VYS4}+SnWoPKDm#r+2dKY0C-g-xkx?GBr;GBW)ZV3v9FfQMgaU`C4?> z$bR=J-!s>kxTb%i3rJHb#lK%w0Gn7A`q|LryZcH zl=#HN8yhv`_2I$6XQUdbfS{aQ0oPpN0>k#RDmWR{;Fc2pqqITEosX8Jos>T&KOlB4 zy2z=7CJl~yU+43R(a28xWOuDe=mn|9(7<3)-*LZtFhN3wENOEgm z%SUT%O^SZ{xLV)li{VUtLy+KO4t)}LiC!^+@WJ_27T3WAhbpNw)AN{mtYLGo!dEBl z(tGf{7b1&xA^i6rxiH2dgLY|)Z|JwXJ>(FpBYkAnoCzZR_yCDGzgpoV6ved;JJB2O#75UAYL$?slluZz zl0;8}PWfWSM9PiYn&+ka?aHeh!jP;bD5>K8v!g#elXdm<2*tM2^CKnv@ma^ZqD`5D zVY2zUp>mpr=B5S)D)e1S)wf=f*VV^6)cPE7)~`n;^!Q>{=GD&hJt!T?AT7^t(FO20 z7IDDbCD*cSKUJVIb#kR-FB!Q@PA}S5m6ViN7AUv9zs1)-FYUx(gmtauvKNV0!&@2& z#1U{e5}Xtm;c@6=2AoUW?jCc9i5#^8zYA6`d1fmQn|WspD@^- z>}h&S^yG_cmvo;s?qX1b1Fr2SYq*hri%*KpN14tD$!h25I9t#q41M#(9B%e+C9=wN z-LK|vbA}BgS^skp?bG%^vqmi{T{&{;sQKvRoZSU0<_j9jCk$UWaNvBIY1ml|jfh54 zun4#KT>0M(tZ?a@n#Q7VKKmYGR1+>0kd{VDk(D*!iUi@}6i?H){gT0r`E7={irf6m zUb6L-Ty5z^$LSSg+Q%!%=@YW&W1i9mHEA(plod$MnMTbM11SdKaw5i96m4j9gcodp znXX3}mfi&CudXJrla7YAm|)`2s|H`u-U7^_GTf2q>d4mB+PbcXJ6nC#^|GM~7l5*@rY3hzR<`L$fA(cd^;kWP9Bu*B-C}tz}b~e{uN9_u1W9p)B+V2B1`~m`JzE+@cux(y-CP`%*3&eS_ zkG7UXqcQc_blJ__wsXRK*_Jpr+*~+w?(l^&4R!UIwPJ?*qnNu1KO=-EUAHQXCT15m z`y2(_6GCRbwrj`7IZ6dC**%w>l+Y1~TmIog@HE9;8*i;nc5z^6F3NQlnVIj`?{Q=ke8TSY0OXTQ4}*m`!fz{Vk48(*mGtbsP6|k{ zG63K6B-Bg$0%>497fV9jXue9f5l+XnIqh)0q`v;^&7qJ1l6#GYWzu|WI}2^l`<8ec zYh{9~H(oDamsFjh<06%xnat7lB+;j^u&~{AwAOIBMkn`_08fgPyGFd)-L{phi%mv1 zw6D?GfIEl0ve&8v+E*4EItW!r`{5lnRJ@k!aVwe>}`Ofm`f zuLQNIKm}WHDm<{2ueRPYhI=A&MAaMSF^du@?c*=Hh>6VAxV`-2_dQR2svK4Cw{un2 zOt_NTy&!otv&_&h_-b2GYvI|BOuOsvpQR%d0908TeA z=4(Mjd4|V#>E2<+@+7y=H<(w)l3loGR6krT?=fn#aC57ev3PBp02kwmY2XZx=&go= zGhwsu?CgA_&);f|`8n^|(bYxv^jXu0EG%CLL9!;Kr0B_}XmX_32)p|F`nIjC)Z@Pt zRk;?p4Ie+0^kj6+=}UR%A5-GJ+Ex7UukxgU^$Dhm(|Z|OEVN5YOHq5Cf}L1hUF9s_ z+;^F-At^^$t(NFHH`Y>sxr*+Yts0!wXOt;`3p@nQgkwK{4x?}Gu6{st`Q8*%K~8F2 zzM|ulVCr68R?pS5eo@l5Qa~P8kzZY1&1n{y5U5$wy82Bb;^)twZXE8gbH8w>F3R+; z4HNHIzh6yS5W(Ee)ESy9EzswmrFnt&tV{Y@nIG9wk{8i2n@%>Xx`)IsKsaW87~mvA zDAgD{S}ZX%tM-$J#_iQ<4zc4i*978l#rKYhRjEaleHfaVp4JF0?uq}NbZXSMwq?LD zzv6B2t`ordIcQb zVo6d0>@kXy<1)`&TK|~x>%dqeBF|057vX-(^+dcH<)BOZRjkE(D)>ePiWIpu5h*Ev zIBSyaYV2+_z)Q;}8T3F~CEJ%cobkAG%xQV;+HrfS7K>uSM#uR5C**WT!@%FB_}ZQW z;R6Jv+RL$J^Mx!~w!Iu|2!CNE3N)s=Z*pla?7f@y?n;4z8&j8UCR|qCtdR*>)s}}c zamQ-%LyJ|cN8EbR>od$s0X&0;4lLZH{wUhPS&2z3jjX+p@s&X(v@n9OP@c$RyGw*7 z;E7SA181q@!&{`4vd%w_$ZMn-Wf>OqWv-W5Ls%~!S`M@f7k!#Oznk%|myi1{xr@7*9VNt8usk~Suob<0c}ZVnFA@H8Z1B_>%*^d9Qmn$5?J8owGNoi(KPbJdr!(lRc-2PFb!EeT_{q%YOjw zV>dwWGYCoywElT)%wnuT&}Z@nba|a$r7t)3zK&;1e0;o#OhpE%+$iU|p##c&NQgd> zSw7ls-u=9AG*kU4Ta&z@4ug*>gl^6K@xEQj^*5v3;->FCK%PTj=B`=%IsVC;0+f2t4AZmv6jP-n=G-gXYyJ@XxI9as{(Z?eDRck8X(jx9-d*VFDR_C zi_+ZZ&uV=e?k1O<_0;4tZwIfkRpP!sILkbf-krJ~Yn-kR0Z^QKt9N6=8%vO{C5rHC z>(|uR3*eW%?9c~Y5=%ovL%q-`U=O9-L>?ho|BR?*_kFr^QRY%4Aky@|!NsAZd?%cn z_fJ2;ii(QaVM~on9re)6o?|0Pc1o9Gzu97Zdo6D0Frb-b-9mn|HbbD~E_&bH#9evM z40t!vq7Pn=HCQU(k?9TInKrD%6gleSoib#4k*oPC734L~KR9@5{)DvBhMD zVZNJQ6E)V=%TbphthZ}YDb~u?*VnY%5L~2~v+O>F*E+cws+nm+Lk7NFyAeXIl z*FYMHrWiFpZC%Bqz49>{XJ$M^q@>=0;mO+D!$Wh}{n7O4uKDeiA#KMa>YAEo1wIty z<%!Px+%0*IiFS|R^zva1C8@{1SL*hy_%oYk%}7 zUNuck_qtBX77559daBd;jWz{9FvBFCS5P2+p<=18P+{0q)YkZM81tWQ90`LXX-qZU z>>U9+oJ<^5<)Q2~U#bEU#s8*M#+pxEl3@R7FHKwcV8PdsQxCsfTi+E@y(hKYJGKlX zG=d7bMk4JO-I`WKH;hiEm{Hht^si_j=cayD7dS z#Y{VTiH=2J+QUJCaauwg@X8#8kwMf5(3B0&43*~BGG@%ud1cwoR;juC(Qd|F@7--q zvOuv0JAW%mJgk~e5dL66@=ZCf!cgtiv%DCQbyLXqbBh3EsQr#}kUi2bTHinIk9#4-oe0ImBdW_F^6 zvAc$*2$%3JA11M+Y=bd&kxE(<6SZSFo^~y40Cv}Fm0mQrcAxF3$UlxhReO)+W9r1$ zZ<8Jz43LK)9FPr0pl78*z;5}suUbuHOiWCD%FP81r8zMTTFt0rcM{eZ%c*+qwCZDI z;i--xZN^1wyQ`KiFn}Z51K`VbQEdoiQpr?6n;1J_jBn9q8SRgE!!An;Iv3At2vle^ zNk514GO#=Y5o1=D*JXllL!>>)U?G{f$Wc+=N#f0z7$6^4(OH?Oal}6~BH53S)(cq* zNVDk5Ym8Jf2JBkXLIHw&@u(;m(o);2zu z|AutsWo2LVXby{I&5WiPJ?QHI77$^wV(w<% zV%U#?B!XiAkM@Hk@6O zSKquego)EMw30z-!N}!Zu7=IS1MB=Ts6!Oz8q%XD>UFTtAK9$35#=_PGG#T#&lrB0c4r%?uPDYMVao4z(z*BGBV(o;PiC zCs`tguvqMPjpJBaB0<6@PE93Khm)nR=7Jjdx3ZT#HATH7gVEll-7A2j6Lv=m(G!Y4 z+__kS@=~^(%2~Kcx>8JD_Zj`edxMSLc0G)Y#t5`I1MPVv#e|(oL0Zp{#bld>{n3#< zBlNm&_Mzka*<5c`IdVz{*2>wrcoHI^N$|dN_8c95pmVH*twO05FFi_6abbmxs8bew zf|ip#@}@R9)Qv75d>$wHd`cJD!xWYTiA1(ZTz!Bs;sw|as|BG`FVM# zf4)^}Lt`nc- z2&Ns-ZSnQqF8yh}nbtGI9oqT2Udc``dRN9hGWsSftnQ=t<0LVDYbJxGD5Dk&VPS*{ zU-TD^VttOa&X_By&sM6^WRGHAuz{Bfx{^xT5TRFu$v$aoF>OmNSG!r(m+pE=Q804U znZr%u^;?_Hie&okF0V@5dYU%V6i{|o?t)cd*=A0<_}hmUci$`Xxb)$~m0J1KxFDVO zlHny6cx<(3X^5nPt{`8x##W%ni6#vBmJen}s!bw4Zfr;^D2BQ{yi&Ny3{2C7#*<>U&{m;x|Siw-S0 zKRv}0IalVu^}ZMJ@|vmq24}W(DqW=29mo`5v%$ajlNOUd#p}l&jWe1W|2%10Fa8u3 z|6+U?P!1OH8M@%&fvcBOvVFBQq?}N3%&xiEdA#~yN-C`=)5e) zq>CZ^0Bfc!vZ{go2+JeMbrn{;^_^&k2fbuR_?6VxxA-!FR(Gy^L686f!g;W#Dljvy z8e2oiblqB7|61Eeu0`Vg8VJG@>psug{#*+i)D&a2Vlmzr^2E*N9{~H zWsaMdKI4x77#Vf#8Xg|5?KvAMyT*HRH{=-ReB?}dCR~=bOl_yHb=#oPhFP`;HtAa? zwoYW(F1ac>Gg7J3J#6MGometzv$V5Q1*d0s95W}pyzZ@xDp;#8glK2QUOAF0#>zm^ zlasOlzkPUy%hrDgggNt+x{yPDvUoDJdnPdpE~-Iurq$h<(c zqMRKIQNsJ`{uQ?6i_2_+c(S)@LbSVO_J9!C@6ygJKNC#9G-NDpN`<8mRmcsPH5o9Z zBL-bE%f=hR6tD2NO&D1Y%6Gvz`rCvUx5@17|NQss|6Y^-<2~?9k^bF}`zCtq?Ck1h zH!^if_(R{p#@lWSVMWN@)dg?wSLXrY;_U>XSgcj9KL26Ke=b0vuN=$V4;X?18kj@} zD=zej61sfwSm1EI@z#wymzfloBL7kVOn#=kOfTBU$GQS}x_f)0fJtNxhA5{uh>nF7 z;@0gZuRQJWl4tz><*h0)n`fu`M8z&$I@>IC3Kep25uNmK=PbBf9TYkq!1Ijg8C9Ve zH1PVk1#9r{Rqu_}sVTld2;8^Z#N#65m8t@EzgHUBQl=Gi>)P@=)03Ba#BjvI((>e% z2V`joR_uw_LXd-B)Y$&{s=qFLo+d2x7=6*j0_Qg7y7NVwYj9(4e59NsJ+P{O8!HpC z`4LU?JuKFWVv)Do>u5##T{S}xlssws?wS16gTP?QNcluQEri=w|DfE4&>m1_n#d3O zKd&q=&x|wkH7Kn6{S=~0)_<-$sT?u!)r;I;xbdk_h!qS1@`d&lJrNNR_rJRw z=Q_m{7~msT7|C%t&1|#Z%u1`Vj#}x<4MEI%^6|mA`L%EF0_mv`2>1Okts<0BGErsf zf`g3%FN(GGx=dUM7y2;^lcgZNB4%ys?PvRGoF|HvdY%V7{D`uK89Z=L|$mO=-wVI{DnFsu115aAVdOGk}?$^-qnMa+4(GrQC#iuExx0E z(>0Da!2v<;>6hkQJ%6nZ4GH3)$Bfc z#@2}KtbhOTaDwC4x?_F-&|sb8vp(`5r$_5NZ+6M9=W%)edbeUfg=KwgWilp?)0ksd~)6aZs0G_+g0 zRuqH6B_t({$6X2QcqI_m{#&|m#)`gKD^=?mL4uyORfjbgJ=emr*v!49~b}UQO%5)kH=pV5@;j1wSC>z;z$_cX|^c? zPQQbf)NcZOr5I>x#B0rPIlrMH|L27DddR~O%uaE8eA^|n(5)!xHvQ7nbNndg_owqw z6T+$04<_qN_Z8UK`}i04sdjn3L6TrW_~hTijcPaC`9izYwke#ic|o#IY*4@ zX~2Xl^UHNanYD7Wb+OHS3yU1;xJSSZVw8I=;mEJOwH zd~-h(_5&Y0sxdf8$sP&_d|LKV!97es;Y#?=%SMDCb9iXR8ZPYT0BTaEi8|~D_i|5K z9zjCVZ>uiZXURaNcd{>g@!dgRA=9cwA2VQ|R=txSHeUzUBpAsX*M2UsLp93Od+wS_ z?|heBptV)lNpz-+Z2qukMKF}uY1scQk=b{a+;%UoRM7w@$|H7hO`KLzY4{%y0RreGi z@@~_3bY*eNpS)WLaF*Muo zb&x!{=D896yBNjIGl0-)mQXC%&bmJSl&&LZ%*{AbPA2)X*fMmjm{7U*4GidxDBgiwlAccrB%aqyYDYIN zsh8TG)g<6EKsq7!h=KK7cmtywu4Z&)b8*p?`k-aFNTcv9rAwhjv#q#4r}qRDAB}k~ zOdoir`lUp;wTtrEC4{@8cw#?zdH?`!KJ4MC3VbnB9z(6<2Pc3{tW^d#xIxH@6Vc1c z$~s&~H@$D;VWjh6Dh1=IZ;IS&&%VwlFAMRq;_%nfx<6N-0?eoBVy(nt9@|zv8y=K< z`kKK#5y`rTJ8*qq#fz%SJ5WjSZ5D5!?l9=|KU{~!dd8O- z!)n9B87NcvCcxv+Sl_6t7gkC+w*`j;Tpc5z57cGIj7&*Jo_Gsv}-J;)|{?z{%Jb;k@L&IJq zSk!-%FdZVdfs_tG;bw<9I9ZQ|tEbWh?S?0cWfi!}Ew}NjS<-pzQ3PNI#gGG&OEWkC zkVsZOn%!{ZDbgkWZVUdavf zw55VOZ6guNNNAdut}Zxl>!lD|`lrZDG?-5NNs*~Q;uqX5)}!_0OMBl#c3d4f>zBg~6U@j)|$4-ZZwU#QQ&$aYa(KHTyV?B#xog$h2LBlX* zeG-1NvjR>!Ki39Rm@^oybizjv7vBZ$Tl{ps@O>Nv`_8=Y1h~Qi;RX?S>jRd?+ZK)l z$?v7GneCl8X2MWzm_IYiW&Q<2lp%k2x&frkZm`o~ts<6Qm)GxXV`VftVb^Y<714Y^4V+VBCw15eH)!SF`!x#k^Mf^6dv<_JI>(EQ z(Q8;~5nLE0`(E0z5=zpT-zTdC`5hE(CunX`Ha@1jAHSP1Q`%_MbCm@#TL&8gd>q+v zrSi`bekzcA<29Tzuv7Kxqh#@+g`n*$ z1JQ{nnL=oTL)dmRmxHb-C@{YFW7=#n+qgD1-aF}nyLh9KcW8LnZmlkkdZO3u$pN=n zL}QW_YcNo1WmQ!S^7Er3(sx-C$Rq zAl+p@d>m;I3zQs3+i@F6sME|E7#W2wcgg+*rJakUZ7|)M;x~3A#av5hiH&{o{zi-M zD{NZ?XJ78kY*r?r!iR?zM;>&|dC|PYLKiu5ezuG|K@fua3MC2jxBcJ#Ita&~|+x#C=1g8J9*WIPNEYH#_ zQtz^KvbPWQ4EK>Kbi&tn)Ipg2ZP^~ap$6PvSQ3kw_j3irJR7U?C8w`b(%`UzJ%Nd9cA10Am9pBT0Ess1=;` z?^Wr4=UVmlfDrh|zs;QSe^pMf;P6sNfe|7vko-v(PR={3=j^N&4{$*Wj1ypCI0Z|q zss81^T>o_X`obsP)N~>GV>`F`OCM#~+JW?{5b;h_oqAi#4wq9nfk(ysp$h+e z6+wTL!tVcVjq;S7_W$dz4+v8wfvjDKzPz}&XXzqEe^0Miff6zQXXgG-6bHL`=oR6b z{{Gvm^@8~2^?HW(k~;>mckkW>cEgI5de08yF^HvMKh+Nwv7q3S>*zzL^R(w68xMIz z5WDN-GQHcOY|QZqgGI+_c5mkzTp{dT{5_+33jTH8_lQ&j;BoxE0b~sTh-KMcod0Je zi1pU@K@8yYj0He?f7TZW7ck?KlRyLvJ>U-Jb@}CE2CU_8X-x%2QJ)4-=bIL`J98YR z-Rt%*Ke-h2gpNIJ?;oXRURNfu$By)819%>L$&1F?fP(^ghv_CA5`NGq z%gkiL(dTG;PLP=E42Bd#8DVEH`a558Mg|fjoO3gzAZUhY4}JjIwU@l~*;zmzS{ z6si~Wu$8F9e`%v4@*(juZ6LSm>ORZw+@^akQgL_Jyc-omF!Do5UcF;m1&SInCEJbi zjZ^vt22bR~DcLblDhdhheDM^I!}adLbflYGEGMN-f4jNd^FKZj_WIwI==`sz_BC}&V!7jv-9)De|r^&{rQo< zU8h+8%QibqVUoe301{dir*D2{Wk7%CpI*$(PC869mhcuhi*hzc@wo;=*S`)j(UU@A~+8w&vDhrIHQbJ|z-|MQ{Hej4_}lstKGH?cG6 z=9%c{wh4bLVJH_|fDc#dx&4f{DeQk83}RTKkISUMTBzy{NeOI6R|&2ZDy6 zV&^VGjBetmJ`m?2B}ZX?|27%(f7xsVE6snTp;&3GUYyZl1g)YTiA17p7TT%-H8JF{ z!MN_YK1d&=!rA1d*$vOAS*UfY7ziL>PXPw6_-t$WDU2&GlSlE+WMqyzOq`%s1Tz6= z3JBvu(EqQldcuKs@dQB-6jt2g6T2@3d|i|=He3z}F$kvVo3n_zz}r6gcNbCE+5^T| zpjYhp#F)UHgVKeDT~}8ZLhal6x~`yHeLlR&D06VzTPJeWlGiB&@q|{sZcN8rcWJqu z*&Fuo)G%OOA-nN{Rn!I4TBlHg)0bvXukW5H+)@PBL4w6dg6WQBot6E>ds^SbBwX&Rdi0MR z;e{$P{cE$GPhYdZhDtMG&{oM%>8)ai6z9{AJ6%tJMyj~=w>A)KNg5(MyTreMhJC5A zDpnIlKGzmO=x*3~Hr+?quAY62KDtt0C`7+*>f&xvIqBA_07Tmj-ebY3-m-Efk&D&D zWXmWEJkr#%!4uLE@mO=yJsY4G15tDnEC{SxuNyfSf*Gu9`}qBvT_Mij)_wa5f-QHfC0D}&vw)6;oSyKo8>cMWzcFh+Y10I>*MACk58^y3ro05&>< z!5>ytvC1uh6#7c4(C@;I^{>maXLwt`4h+QlZq28N6c#%X7oVS0b{TuW|1b2xtc->J zXXw)%3?lEOB$Olxzr2~HmFmo*coJ7Z{*dNVtUo;%HVmR>teK(V)09Xn1K2p0bHiF= z`_~W6v#obPl>VQW3I?qpnG|bf01pBDl!>6zb^#qM8>go?$6eq{%|`-u*17RD4LkY{YcM#v zi~{vIjfRaQ@Q$7v!9lQm%r z$U%J;C}~Uz<2vp_`Xl~dKwSYQ6UgqEb}JRoUe@uqPp#GfYXM*`D#KVH8`k=8*Eu-B zkPdvT_}uY7d`c3S$id;^r*e)a8RS+W`fW20)m6%89E$jFP%5;D(H(dH<3Ht1kLlsP7DB!O0Av1&J-J~;#UBu z1XQIyh-ztRF~N(6$LxG9+I*~?7xcAfEA1(HMrjeKtJrQuWc7_s>ORpBU#|+(TP;jyZqsOtoCmov+eE8m)OCVq|t^4`n;Ze(3_hA1NiSA`)AnZW{HDE zsZhA(YN8TF^rXa03H6nAb<)3l1}Osm%m3xdi>eBYzovF}h!EA0+S21Osvqa2Rfe^v zDAI}w6x`v3*3P`t0-i9i->-fJNRXmY=Lh$d#kGUO5w9_d(HlS1`(D^4eBSv6f*KIU zKVw560$=7NF+kBJ5Op!C=aMu^|INkuAAgxs1l3=+lZkM9*ja!IK?<^668duIK_aG` zt_CsOym?bSMfsg#?yV@mauGW@VMKTB6IyoI_efSKV0=!hQO84|1Sbuwas+`l`XgnT z{`HY290_G-A$v?o>uncvf+P8{?z=&$_RH6WAF%5X)NgX`jD6x;cZRHUvk#9CO`e@E-Tlp&$ z@bAFSa3U4yz>`oC4`~3kq4+OxP3r1+9K2TRgR0!DhMh-bo_0vw1@IT8P6bcd(hY&z z9(uujXPjyrO~G6Xz4&(&z^UoCbCbsR;DwL;$8>Cz28H}b7u-MGEq!6I^RTARKVnck zyyy-#87fkz$-h92EM)#q&;CAvMaU0oePQcT0GHwn>}JU32F!swxz9lsII95VO89R8 z@C13__Om?nH;oNlEFEnMmO7QB(RXSmLs}%bEtLJ+eIw7{P~efy6a_pE)ChNV!G3OE-dtJaWuldliOkFdTs%1M z#aIhL*Y7=zkbZ2R7N)KCZo0$FKkT z9GFlXLE_$6D$__%ZvA-~j2YII(3Kv9cMMGe(k!kV<&}d}bgA8j8e#|7)2`j=ns0Rz z9)NSBdU~%y_tJVY(H3MKz-E9#ZgRaR0DTGOX~}yeUs$QotPq$mYTwajN>QE#&b7ma z9;}#vaaB<^0kZOM#lk5%#UNnbUE92@K)gm;WW$F%V(kvYj2}k-G{C4~(f^ z?kye3BwfCk6CQsb;`MuCRk?nf+<(x@jolMxNrh9CKXU!z3tsU@*0LLx-COxwY#<%K zE_uXz5O5KT*Uj7)r^NCN3}VG%32gZ-Voy8k;(U*NyGlm{<{wTvilqjK!#OrFfha*i z!Sgh`p)&G0TS)8ccS7`+Bhulq1tD`fI@CeX0$Ip88tFX@x{q(Vx1c+_N{T{4lu z#fKjIKA2&(>VPe~LaStG0l z8IvAz16l_KqccM%oPDM)NWkH6E|m1-ukC7j$}{R+3fKS0tntM#4IU31&Tg&0HbO09F`T{j0NV-eZ@>PmG`#BZX`K*s z23%?^z>;#*Od!tdjTruIj%Y;2bJGV;xw4V0iu;W~es>H;jNcyd2T|anyYX+%4p`XQ%4* zqPs;qB+iBD)Bs~pk^47pZalSu&1~TMG*fq|KHqQIx{GACMK~DIGT(W(6sUXWJ>NCN z=Dohx6i|GM=hujf-+PAjviFXFVSoszPc$)MFR=LVn;GJ>a-pOyqLvHD`lhA;@FP&u zWBlqsfIN75kd}MA(ymS$oz2VXx0`DN-E;)Mc%{IP^?JGc$Zxazka)s zXKUW>HLSB@ErwiR+}Ho@r@r*EjSp|{uzw{tWP_abpM8n^0)llAGAti5DO`L%Xfw)3 z6Tr#fVa2+2Agfn--D)1fp&vyF-GvuQNdH%mY1BtoAvDqZh_*;H=k{ zYe^P@ZKcJJbiSCS&Yk)-5Ve4@qi0FW8m;m=BjE7(6X&S9S9RiFe`NmRwr;_JP4PdQ z?tkKnJ-5QG=k_TSy}h<%qxWc`{U-)67X{vc>^K{Og_gK{ENRZltG~(yQ&Q49R}voj zAwRTF``e-5)PHLm_sYz@KT>n=`;|Td?dz^{Uvh)7@+?UJ#eZ@=`=b;$YpulMpm&gC$nU`u{8c4P0u?s1B;RfJ6*9M4J9S;F9aA;r)=ky`Dm+VD#y|=Yhsc&ZVTzF2dd%3B$OjfTFjH2C_`E=!+U@4hCMn`_{Qe9T7ScQcsM)#i$s@iR;L%0+*C zk8E~KV67A84|r3$mPgrphQudU1{c*u1iqIgZb5`IMM;o)7vAD~#NhsMSFpJd z7)ir?NRCavVg73m8b^OcFX}B{>%Mnsv-bCVZM~yq6{A=K12K(&3 zSGku&`BfbMgRUv6j|G~*s^C$ijZUpku7`neP2pZ*^2BTd&-hs##V}i z?CW4i*1=e2494(X&*=C2{@?cc20s=zsixkg%8 zPhu!C$9B-Rq3=D`86VJb`lvtsw#gJ>v)L9jojCMdUkU>g8Z4WsuE@muaP*XGFra@2 zo}S9T)Muv$O#nx7u~rBDON5HF0}zI0kZ59_?;|XA8=>}t-$IpfrR&Ow!sx-hQ4A~BMWhkH)t%oGZ(+A&*{*)~&PREfc}kB+F>huVmI0+6dVnSzGQ zuWy(MsnXP2qA_V#`wt=6~<_Dji zx+^KwW^#j)+XlQ57W92s8+$Dkf{+Qn+nDtD>n*D-9E}Srph2?0SsDelwi{DQ$CViCl?O4$`B)SVcZHpQ zYlFV~P$ndwOVJ;%;9tUZxF#$!@f-h;+N>4hoQMq&5~hpnFzPTHOl43FA_RIk0yra~$5cIKsECFbh;blBzOA4ctyAbtKE-*U!_=A|9 z(r4=Usxvh>oZ{JuhGmJ))r4WYSu*a2HOmZ_jpf5oPPclje3(fYoN*T817fOPo@9zx z(lM?S9aXWi?jsok#uqsQ*H%v$%cZbH>DBWe<04md+w4?36BF=Yf&i9OvsauAi;7Ax+{tdqU)sbn__nkoXy#Y9+@I6Wg*aLbwH_fTT4u*e)7H-# z12vTG;?2WfwikZHvSH@P@BRp`HYsGE{Nh;)MyCG zwY#gjTs%9^=C!i)_S)NJm2IJI_Xa<0x$lne)@)YoLUO|_s=0VFD)Z6Kf+Ge(yeC9g zUrm?1utB?RiUppU?r#wXU=~Zz=Q*Sh7IC%)haBHa59Y%l70FcZ09O%W)utyTM@;h+ z{`aFtZBI`fK*+Y5ie{qL;gnJy`5DNBUz*H&8gy0toN$u(mS!AkVQm&?P#^U{;dX|j zewpD;c$cb%w|J|j)LtQ#3m_`$B#TBZFgV-}tKrSl-t8>T>qY+S5i%DQHx_=C>g#XA zLd9b?M@XwZaYDTbxN~p@VO62C1XbdaxTZz5e*8@ z$LJL0=wIU5vBZf9<}{Ub*SL|h%EE(GxVq(_ucXr~)Ta+?ODk}#|KD<-POz^q{_!JmReMeJ7b9w-n&2LobvhF2T zE|@)t0SB;&%KYBGK6mZ_cza6cTgt&+6I}+t|6WL*5Uuk2AN-+feuF&IZ7nT$vKL`_ zlkZ_g`_g*0dQR#dPKwo384+L>f%rRZAw(2=Tf1&Ic<$bR81dH&0PyY3*YM%0#(Pw-wxz4* z{Dj^@L*JVZyWCLn*LLCq6;;U@o9XxHZ$6@Bw$^rbcBaXylmdR%<0SN8fL;UZY4`s3 zU-R_JUFHXc0c3vc?5ts5O^8{jCK{-ys8~UpAt-g{)8Z`QoUB03;*w9VjWvNfb2}1} zPu|!rFcPsr$54pg_e*u}GY0{l14|E5?%fQ#7;p_?tbo>Q=RZ{3+yYg?IYn`wwa<4` zr1QG6Rk6T{qX7;v^6LU%-VkVljtPZ6+75*L2spwbQX>CpSi|!&M?9JG1jzN^lb5hA z9`?=86qVZzM}m2oo}LEqQC~7}F<+;A7S$aZz+Zs^cgYfV2&ANQ&4*mC%m9c4SeCa& zZb1Qqh|wec8lNxoc0qUThAT61zBq4j@6}um&%a0a{W~!ko_s$21V>tG1aJ%T$4AND zCjC@*J`V4r%_~1jaNhYQs#O#5fQ50AlI0E;BU{U5ZrDh%HjWDGzhLLH|-Nf0S~mxd(Ux)75LA|R2e_n<)K zn3-Bc1SyKIq?T4vwtZCXh|ie}+9hyRUHH=S5if+)lI>_vOX$^Wu?Bk5)vr~M8`tqe zXdD9;mZ)fHRTWzb!SEtuLruwRs|4Fxrae!f&kGZB==oFb=06dq@4PjRz4xjLL@4@G zJkUy^4Jm?_(>SnTpyy;$ zUXPdONHvI&TBlm)>OweVA#V<_{dd#)0ORrHOR1%CPM`Mg4ENll+1wr-WPR!B>S& zxN71;Tsbf{ds`EsY1XgJGDUboz260Vh5q%L)+ZDHXRqn?DP2p>iTASVeWy|}f;kin zBNtq_E?S{-VP&7~s~_vm(YT{N_cDr0b#}JrlU(iaehv?#Mu0mIa^o2os)Z>Fp@Ikw zsb2`Ah#AV6_g4!FId@b$NEaNE!1rIlv`ye79D&V6@>%wB(umOz=d5i4awd*X)q=mk zGHv=3<7Bw%X@5H{2 z{;S>%C7^$JH>^e|CyN@JhmBpQd5A!ZMJl4dOGS}bo4_jw;e@3f67hAju$zint z&g%=HUicwzD}LHJE{osqPHsRjvYUk;>5jgl&1|&uD09lt1O)_9hOXYhP!eIaz^RUC z!x8hR6)eTs5-O$f0%$HOT{iynPR#K}gyizic6(xPo?fNTdJ(T-O|D+K-PL~`{(kLg zXiz4$HiRrhE14O-Rez;azen~xbhg1a&PqbZiaU`J6!p`s*-spo`b{FN0De$a;?)1* zbSp72aRXS$E!TIpk`V?vYP-9HT!De5s9vf&pR?KiA%sOgF>3%%=zR~=CD>RmtzXd! zA<>V+e{)HH-a!n08_p>+vLt|f+KSA!Gx-lwt={Tixi!Itf7op)bo0IJ_-Vm1G=lS=I0x(xxVNK31Pc(bY zWX28}tOCc|YioUquz@YWLd@f&-hqSy3gw|eP4q=zYatbY+aNW)9Ig4OX9IHF2fepr zjEcBFBLrq9Ih%w&}>Be zPeg0u5jD?PFlTsk(!WqQ9`yP2*V);RP;t2XNad983TQg=oQ^E!yHRrYof!Cy_BvX8 zPqeSe;Y#sQkC0mJPZrAl*A-Z0kz%DXqKEToW^;W-KkyaI=nTA|zWa@xbwZW?B8m1O zP%MGxw67+~PljtPP06oKUe6`uyi_DtRXRW;bu-tDW@cVn&$dO?$ zebJQl@civ1OkZN`i9v(Ak;o9J`fqf>keW7hAQ9$ zd^`2kqs@&cp5mM=WUlb|rd>ga1(2IQm`^Jd1WhM&W z-Vpay615Akiv=|a9!c&P=?{7`{`boLRG;xkN`y*~*J3xS32U$aVnHFH$}o0JFG1lC&~C500V!) z>p`C@;ct}cEG(p|fSpgMu!b2QwXa4Ig6P<)Gfg6Dgcfbtt7Jl{L(qH$^Rptq-(5=w zAigvg*^!q%?VgF_2^YPLWZ4@Q*eW zDg+Ptg6@Ta{mf7Az|@hfr6(!0KCF!qoY}em@*(*_5YAAQvHRlt7wL;M?59`9#<(|A zt~twdsU~+%G{;H=9fV~AFcAaS-NkRnnNX(>0lBoa^t@sM#f(_LfB}(uCY%G^UQ{_qT)URQ|QZZVIAhbZWPteg=?#Lcs z3^i6YwlAT*Bz&va!WCaGEm7813XRFKd6d(! z+>9)eif&@1UW9cyfKkAy>2iinE$AV+*p**VM*}N_m9GCR1Ct11v`Y%sL7>-$CUfzm zktka$AcH~LE_;L@9iZk;-tX;HT<%|%6<8~>iI#Gn3A4)>7gn&+y*zf*OkOHVkD1eP>IREL(iU5{0^4{Ln&+DTTWE!{|Bjtd}gG|V>r{Q(p-bdCizkpqBRTdIv-OCLy1lPt(4p2}4F|X5&GZ>~* z`$TPeX--C?sGVe6NFR~AS;@x$cvvZIR}x#7v#3}5;Yq{x$9*^rLf9oDJO$9S>z@vT zcx>HgE1&R+sy&b-eWrS8E}49cJgXfdz7=0UQ{6D#-TfAl1VkZm;Xd9=9x+>cK}#Fpu>7aTq#8g}(&#uC9taSvbI4tza4&_Mee?JV}d?5CyKFIu+d&D6{p@BDyKb3n6L<|>*9L$6BkP#%J zxm?3!uVpq2({`?&ArB2L+?5Awae$8QZW?Hof~yHoxXSeB>~a@6m_=?z%bc@93<@57 z!B#GtEq)7J?CokWhtQz1*4>X-aD6e9}3W7{KiJ~g_M}v$npn zwb7BTFiw4^yoQddq0akIXKHXpc>(?W1T1_z(Vz_> zFP={>*j^sk6c76H^}9?Wq~v#w3it0YSl7DI-tJgeWC%=(QDDu7;1AE|{H{E@S*?(1 zsMX7_q5*KLuA!m*p`$?Zv_UUe@4t098cLeT41jIIL(ouDsPtI_TLXdao;!nBu*vjK zF;QDf3;xXnB1#~4*7WwJIZXh)k0>l5fhKyC?Sp;)eH;v#d~P@~zPbtI5H=x@0fA?( z_L2Vn{uj#T5R^3ra-nWpbG-Q#&J&d$9T*@?0hdGe5fS_;@#|`b4#rVsZ$)$-_7|%P zoa<&4Umm$G>R+}J8{lm>+#a~y@#DxH3z+nEk!*yMYqgJv6z(eDXtE4d|QTI z<9XUHn}UWXH_9*u&6nZbcfwEHbtL&i72T7ufslT0ja)F?K^j6b&$_uj*Tu0eUqjKv z){oH7Kd>9%Ij`ywZ7a5Ve#BrlJhll8f{u)O8WU7cbn#-4Z0UPWExiK zmZ1`1)+OlFCD&;;0cZ7i@Cx`tb%{mKh!J5Kz5fc!9JATGx-I7dZ+L-@J#uJch8_=L zwvxO&*q)*e839yG?0iho_n|s;YD}V_ZmYpaQWf%k%+8Y%Y}q>gIA*Bl(2$pC2bF~Y zi{=!KQF`2+^Gto5$YOs*v4n~Gf&=(ILR#hjMn#6LfJX?_f&HXMBkemi^O0KF*Z;8_NxvaQyW1B6A|=R$pd_C08n~jJKaG^cVXUHY2yRg)y}HoLO7ksX-=%{SVt1>KuoI}6&#TGo z$?@DTmp&cp+a(0|1Xw;if^!q`A3w8Y*Ee(rv59;K>N+>>epLRa5GKBb0|G2EoI>wT z2HBA>Pcwx;rIN{;CT^)F7}p?5+}zv@zX`5uNCp@uSu!i48vdnaeWZet1;$C`SzJa^g`- zo=h0}$Zj^4hgBX+;nf#FDLN4aTb%6$^jhGGgll8aiu}vJl)Rl9 zT;?sE>zhB{%He7MJ`j>)LaoP5T#YaPk^oY)jcg4#SK>G~$MR?W-2{Y%GgqeCu>UQ# z7a)fR)ixAWE~*k|knk2IS z4^MZ$_?*fE+_9`HsA~tn1gFfCF5s#&p4{2OfZjeg6K0WFUSN-VbbEObXTM#$l{w#h zp4}&Vq@6l~Tx#IG5ok+|tp1tO%r@+rMNL|L?bgdw>C6wgogg(&25ccbR$ouAtJJ#h zZL7KK=9=RqlJI?w7~1|)fSnY?bV&4xF7*2@{2;UYtl`_Y?Pe!`D#&C~)2qEdNP86!qA!&f4}4%tmf_QVQpW zMk=N12{_A1?q;uT8y3;Bo0_)wUCoz_Fn;m$siiEqqr2FG^dxrt{a4T`h5V56_JNoM ztE$tj?sfA-g3`s(!wM|*`*OT7LDh`&9B&fbAKp>j7T}&O9|ETmP$g1iuE*qJ!FGX8 zAdXq+#ocy~Iu|wt&?7jpWlxz3i+e1%p_l`F(}LxJ)Z#EYofj@zN=Ub#CD{8I;OwfU z@xdpf@6Vn%bJHw3tymjbU`C?hK6nkec~$qe4ieHng~n8c4?w}V%EjS|$!_a`%;Cp0 z(r^f!6OO&7G~0JdSk#xpjqjzb(7xSa5rr5h&9DMllVW?LNFWwiN*XOp2C%a~l%KhN zXq0ybV$)*n+7I<`LzmJs29JqP@4VBR;h@;{w zcN&+KiENd5`#DI~?CYZ>@sVz1c6$m=AVas%Bqs$J2UNZV^}+P+RYOoP6Xxyx^&rU^ zCm_VucG2-D!}hPis<2{%{mBd_wVzH$wwjMWC)sg*7Ku5hqF2D8@(&3utZ;LrYmKuWNWi+`yrHyw%%V5EX*52N=DSxw#CSbX#Y)JYzT-` z3Wl&Sk3^rPHXk!gDA>&d`BBC9CK@~~mv$3Dq=m3UKG%Xa=W(fcx8N*7m1`gIaPu#( z-3uL7fa}jGLKzH2H*k%tM8Cr&C%~k{k&0|lxDhbngwT}(OpW;xkS>8W@m|p%j~p9c z{ur@s0a9* z%M8H-L1zFCOV_!MBhmK}zzp1ae_#=B0tfuJUB<19te|qaaUF#Mq@r8f(Ob8g9|tUlQ)K2UUQl7fvpN9fbjMIn&s%ikZ-)Y> z+07F66E|}*D4Jmv%ywsN4I}5K9{p25`|rv`<%ewP*ZS#$qm<3&I+yekXnQEGW)oZX z`0HzVznLV-wAJe^SELA*{L<@tPo`{sOO_mg?c&PwiSZgB8qkt#4UtS;+4#X^`1TyT zgxj6$yGf6B+|-=gq`0=|_N=g^Bftv`VmAIaAuOwa)5B7i=r>uCNNSo>r-V zJ3v9*h31pYB)!@;pVoUxx}>id_>`P7F3%u`t(ipylcR%5DMKD;AY@A zZK#ObuK&#hnIK)wMge}5Nm<`p5W$EGczkPc`>d;xtPcT3v45MQ*!kSY8)yNGRs_Jk z>Yvn!#AYnFUoDEM(b222$|~V9;~`LermGze*xDS7&FsQV`@}<)LfmZKmL(qFuCTTb z0vx6<%-;6_?B@QcU{*N(GDYh(RHZVTWBJ^N4*tX2m*gRf1w0WhI0JA1TZw4rXKg@z z1-Vm83yoP670u)r2D9Zq?>x`9vYet63EM$#Kc{paD`vx~QJPLqW+Th4c5^5h@A$eb zQ8q==v&cHm;r}iK!4xDITJfgL@>TVxQ`!ViQLV~zKBA9Kgk3~F~7|UINdOS1tWd^ z^<}ePmv;tbP7u_r{I3>BFYseHcRDtMOUg3q84K53^e7QRLIy)HxA(y|R|3j|8>p9t zJpq@!L3kZna)S1KN0h4cfFsuqw!CBV9s1E=cd%%3wBNGg48-aUy_6p6V*k!k(R!pl z)~?l^>&F@&0Z7=c`ea&>5?G5JE7(!=)y1V-$k9{USiUJwB&4MBT*OsRx^7Q18?Q#RX4Ih{lfD_SO(sb~N2smnOJ%cM!=;W&W>;BG4@L5Ny#GY^eAvE;_6=aiR9pac4B_TzSt0B z+iuaWT=nVC6SVj}4eM3kTPQa#Z)UL68jwwKzfG}%9bQFUTxzH~E8tmBtpiUT>^JD7 zO4!AQh;LS7JxN{~ryQYj?tnu!6RU!A{2WvxcLng1LmrOwxl@yVRk-F#vXpikA$oBt-kcSVrrTUPcs@tls=j+leWogU~UcP=pa&v|lC?=~tS55|_u z1>fzJ<|4Q9xeML&Wve8Z!?e5168Jv=$njsZCt$)D>~K2*j>O#5NxV`|Y`FQv4)Bz7(e$_P=#^g56L> z$12j(``4Tq+-X}6-2!?cZ;Jk#G^Es$_4dT65>d z=n;aWhwaP?yEig`9C2i?zGQk7xVPF8%vY8_^^H8oCt8-QCS(vjMXIxfPQd6+ED5GE)(8EY?bp49^(V-U%$h~yA?bFl?iMT2xeZS=bXgu731;^o=^C- z@d#+qz3Ssc@rs`MN9+uGlpZX+&f(lU{Z|}c3Qsua=^Br z7#?UovaE$G-}13ak$^L{sTAxA{US$ii*x8V8+G`bp3)g;$n84c>VWj6pv;n3^IDxzRWbLbIkk>%$d@3k+5tCs9F+g z2WJJ_*$^PGKw|x<@S>IX{yM+IY_JilOahk`>z>UDJFIQ{8j-e7r1v(CeSgXDKYwWO zc6OKJ=smCrxE#$GG}bSJ`11ibWa_qtrO{KuF|jINU+-YK8>6Sfv^azPVE@(r! z5gCtEqVz}T8DR<)Cf~e=(qe(&JxQrmsOqTTeSwPz z%0pjb6-(lcDW_}kS=VCP#{UWOzo1t(>Xu|WNOoHq?4H={CMFM3<%s8nY^GNKf<)q$ z*SEb39a1ST^c!O{xEY`>XhC$@mWy`{~w}%#2y-MyF0H4MGPg;d4yy0xXzcbZBTGB#cG>+JgE;~ z^WOK=(!!XD7r~$4e}Bz=+n|wDIn_%mwI)L*3T(}GCQD}r?x&xH{i9D38>;cu1N*=# z1CO!2!!^E%O*=d4^I^EM?seN#lyB+n-{`;T-FWUh7V!fZ z_TMHWEEs55BR0**%T{lbaed&36!(vL=?iW}RG@TF&$&IwsgjBz))1G{9?ij(wlm;! zyKea#OC;}~@n28FFQ;7alQ_g?w>3Pm+M0KD7mG#wnFbG@y*!~ z@nyqpjElo#FVzTEaJK*8hfn9+$^MY<&&$h$=JpI6n#O5#{1iK9=)Cb?1QOiYStv>V z60PU32pMic@>|eVE$$QGOpHeKe^#h5SLUF|3%Qx4QS9mFXg|4Nbe#pCD4ZE zr!nxElQ=6{pz3cz+NOIFxHN>ZMhodi;%hM7Z}?*H@&JnWuE^MVYZI%SZrPJ(a_Rgh zuZVAAQ~JBEN+XW0UbC0r`AVyY=F#PZsFcl{1+`n19Nu$R*`kTlkZDghxY8 zfhAm3@;;B#w|HJ3SPqpV7s-dALVF5HxiPpB#tT}wEdNzRdQm|5eC+)NkZ?=Dk&!H= zyPI)k=a6|%4F+AWn@mB{U4=?bY6wWZ`ZErE1CKmW?6Dr@UwMXK#Fbaa119Y{P3G)E ziU`2aMpm7GosxxA)(GI~9X?WPp^AmJ0Agi}Al5}nz|QhoZsKxXoqGVRw^!>s3$?ug z^rf&sfPMî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 M)gvme_ZzzZ7qQKo?EnA( literal 0 HcmV?d00001 diff --git a/img/StreamCompactionTimes.pdf b/img/StreamCompactionTimes.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6953cd93046c17aaa89f63ff44d30deda44f6c27 GIT binary patch literal 42320 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 a|AFQS!g+LtybKg-EH9&_W#fRCm-#=JuNuh! literal 0 HcmV?d00001 diff --git a/img/StreamCompactionTimes.png b/img/StreamCompactionTimes.png new file mode 100644 index 0000000000000000000000000000000000000000..cbeef67612364763aa3fcb8d72dba72116501049 GIT binary patch literal 78655 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 literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp index 79ba365..4feb0d6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,7 +28,7 @@ int main(int argc, char* argv[]) { printf("****************\n"); printf("** SCAN TESTS **\n"); printf("****************\n"); - + printf("Size: %d\n", SIZE); genArray(SIZE - 1, a, 50); // Leave a 0 at the end to test that edge case a[SIZE - 1] = 0; printArray(SIZE, a, true); @@ -52,8 +52,7 @@ int main(int argc, char* argv[]) { printDesc("naive scan, power-of-two"); - for (int i{0}; i < 10; ++i) - StreamCompaction::Naive::scan(SIZE, c, a); + StreamCompaction::Naive::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(cuda measured)"); printArray(SIZE, c, true); printCmpResult(SIZE, b, c); @@ -68,8 +67,7 @@ int main(int argc, char* argv[]) { zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); - for (int i{0}; i < 10; ++i) - StreamCompaction::Efficient::scan(SIZE, c, a); + StreamCompaction::Efficient::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); printArray(SIZE, c, true); printCmpResult(SIZE, b, c); diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 5f5b1c8..4b6c770 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -1,10 +1,10 @@ -#include -#include -#include "common.h" -#include "efficient.h" -#include -static const int blockSize{ 256}; - +#include +#include +#include "common.h" +#include "efficient.h" +#include +static const int blockSize{ 256 }; + void printArray2(int n, int *a, bool abridged = false) { printf(" [ "); for (int i = 0; i < n; i++) { @@ -15,223 +15,207 @@ void printArray2(int n, int *a, bool abridged = false) { printf("%3d ", a[i]); } printf("]\n"); -} - - - -namespace StreamCompaction { - namespace Efficient { - using StreamCompaction::Common::PerformanceTimer; - PerformanceTimer& timer() - { - static PerformanceTimer timer; - return timer; - } - - // initialize the arrays on the GPU - // returns the addresses of the pointers on the GPU - // dev_idata is a pointer to the address of the dev_idata array that - // gets updated here - // initialize dev_idata has the first - // elements copied and the remainder to make the stream 2^n - // are set to 0. The first input is the size of the arrays - // to allocate and the second input is the size of the array to transfer. - // N the maximum size of the allocated array. n is the size of the data array - // N is one more than the multiple of 2 greater or equal to n, - // in dev_idata, and then the elements are copied inte dev_idata. - - void initScan(int N, int n, const int *idata, int ** dev_idata) - { - int size {sizeof(int)}; - cudaMalloc((void**) (dev_idata), N * size); - checkCUDAError("Allocating Scan Buffer Efficient Error"); - cudaMemset(*dev_idata, 0, N * size); - cudaMemcpy(*dev_idata , idata, n *size, cudaMemcpyHostToDevice); - // no need to initialize the odata because the loop does that each time - checkCUDAError("Initialize and Copy data to target Error"); - cudaThreadSynchronize(); - } - // transfer scan data back to host - void transferScan(int N, int * odata, int * dev_odata) - { - cudaMemcpy(odata, dev_odata, N * sizeof(int), cudaMemcpyDeviceToHost); - } - - // end the scan on the device. - void endScan( int * dev_idata) - { - cudaFree(dev_idata); - } - // kernParallelReduction uses contiguous threads to do the parallel reduction - // There is one thread for every two elements - __global__ void kernParallelReduction(int N, int Stride, - int iteration, int * dev_idata) - { - int thread = threadIdx.x + blockIdx.x * blockDim.x; - if (thread >= N >> iteration ) { - return; - } - int priorStride { Stride >> 1}; - int index = (thread + 1) * Stride -1; - if (index < N) { - dev_idata[index] += dev_idata[index - priorStride]; - } - } - // Downsweep uses contiguous threads to sweep down and add the intermediate - // results to the partial sums already computed - // There is one thread for every two elements. Here there is a for loop - // that changes the stride. Contiguous allows the first threads to do all - // the work and later warps will all be 0. - __global__ void kernDownSweep(int N, int stride, int iteration, int * dev_idata) - { - int thread = threadIdx.x + blockIdx.x * blockDim.x; - if ( thread >= N >> iteration) { - return; - } - // have one thread set the last element to 0; - int startOffset { N - 1}; - int right = - stride * thread + startOffset; - if (right >= 0) { - int separation = stride >> 1; - int left = right - separation; - int current = dev_idata[right]; - dev_idata[right] += dev_idata[left]; - dev_idata[left] = current; - } - } -// __global__ void kernDownSweep(int N, int * dev_idata) -// { -// int thread = threadIdx.x + blockIdx.x * blockDim.x; -// if ( 2 * thread >= N) { -// return; -// } -// // have one thread set the last element to 0; -// int startOffset { N - 1}; -// if (thread == 0) { -// dev_idata[startOffset] = 0; -// } -// for ( int stride = {N}; stride > 1; stride >>= 1) -// { -// int right = - stride * thread + startOffset; -// if (right >= 0) { -// int separation = stride >> 1; -// int left = right - separation; -// int current = dev_idata[right]; -// dev_idata[right] += dev_idata[left]; -// dev_idata[left] = current; -// } -// __syncthreads(); -// } -// } - /** - * Performs prefix-sum (aka scan) on idata, storing the result into odata. - */ - void efficientScan(int N, int d, int * dev_idata) - { - int Nthreads {N>>1}; - dim3 fullBlocksPerGrid((Nthreads + blockSize - 1)/ blockSize); - int iteration{ 1 }; - for ( int stride = {2}; stride <= N; stride *= 2) - { - kernParallelReduction<<>> - (N, stride, iteration, dev_idata); - ++iteration; - } - cudaMemset((dev_idata + N - 1), 0, sizeof(int)); - iteration = d; - for ( int stride = {N}; stride > 1; stride >>= 1) - { - kernDownSweep<<>>(N, stride, - iteration, dev_idata); - --iteration; - } - } - void scan(int n, int *odata, const int *idata) - { - int * dev_idata; - // d is the number of scans needed and also the - // upper bound for log2 of the number of elements - int d {ilog2ceil(n)}; // - int N { 1 << d }; - initScan(N, n, idata, &dev_idata); - timer().startGpuTimer(); - efficientScan( N, d, dev_idata); - timer().endGpuTimer(); - // only transfer tho first n elements of the - // exclusive scan - transferScan(n, odata, dev_idata); - endScan(dev_idata); - } - - void initCompact(int N, int n, const int *idata, int ** dev_idata, - int **dev_booldata, int ** dev_indices, int **dev_odata) - { - int size {sizeof(int)}; - cudaMalloc(reinterpret_cast (dev_booldata), N * size); - cudaMalloc(reinterpret_cast (dev_idata), N * size); - cudaMalloc(reinterpret_cast (dev_indices), N * size); - cudaMalloc(reinterpret_cast (dev_odata), N * size); - checkCUDAError("Allocating Compaction Scan Error"); - cudaMemset(*dev_idata, 0, N * size); - cudaMemcpy(*dev_idata , idata, n *size, cudaMemcpyHostToDevice); - // no need to initialize the odata because the loop does that each time - checkCUDAError("Initialize and Copy data to target Error"); - cudaThreadSynchronize(); - } - /** - * Performs stream compaction on idata, storing the result into odata. - * All zeroes are discarded. - * - * @param n The number of elements in idata. - * @param odata The array into which to store elements. - * @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 * dev_idata; - int * dev_booldata; - int * dev_indices; - int * dev_odata; - // d is the number of scans needed and also the - // upper bound for log2 of the number of elements - int d {ilog2ceil(n)}; // - int N { 1 << d }; - initCompact(N, n, idata, &dev_idata, &dev_booldata, &dev_indices, - &dev_odata); - timer().startGpuTimer(); - dim3 fullBlocksPerGrid((N + blockSize - 1)/ blockSize); - - StreamCompaction::Common::kernMapToBoolean<<>>(N, dev_booldata, dev_idata); - cudaMemcpy(dev_indices, dev_booldata, N * sizeof(int), - cudaMemcpyDeviceToDevice); - efficientScan( N, d, dev_indices); - StreamCompaction::Common::kernScatter<<>>(N, dev_odata, dev_idata, - dev_booldata, dev_indices); - timer().endGpuTimer(); - int lastIndex; - transferScan(1, &lastIndex, dev_indices + N - 1); - int lastIncluded; - transferScan(1, &lastIncluded, dev_booldata + N - 1); - std::vector input(n); - std::vector bools(n); - std::vector indices(n); - transferScan(n, input.data(), dev_idata); - transferScan(n, bools.data(), dev_booldata); - transferScan(n, indices.data(), dev_indices); - printArray2(n, input.data(), true); - printArray2(n, bools.data(), true); - printArray2(n, indices.data(), true); - n = lastIncluded + lastIndex; - transferScan(n, odata, dev_odata); - printArray2(n, odata, true); - endScan(dev_odata); - endScan(dev_idata); - endScan(dev_indices); - endScan(dev_booldata); - return n; - } - } -} +} + + + +namespace StreamCompaction { + namespace Efficient { + using StreamCompaction::Common::PerformanceTimer; + PerformanceTimer& timer() + { + static PerformanceTimer timer; + return timer; + } + + // initialize the arrays on the GPU + // returns the addresses of the pointers on the GPU + // dev_idata is a pointer to the address of the dev_idata array that + // gets updated here + // initialize dev_idata has the first + // elements copied and the remainder to make the stream 2^n + // are set to 0. The first input is the size of the arrays + // to allocate and the second input is the size of the array to transfer. + // N the maximum size of the allocated array. n is the size of the data array + // N is one more than the multiple of 2 greater or equal to n, + // in dev_idata, and then the elements are copied inte dev_idata. + + void initScan(int N, int n, const int *idata, int ** dev_idata) + { + int size{ sizeof(int) }; + cudaMalloc(reinterpret_cast(dev_idata), N * size); + checkCUDAError("Allocating Scan Buffer Efficient Error"); + cudaMemset(*dev_idata, 0, N * size); + cudaMemcpy(*dev_idata, idata, n *size, cudaMemcpyHostToDevice); + // no need to initialize the odata because the loop does that each time + checkCUDAError("Initialize and Copy data to target Error"); + cudaThreadSynchronize(); + } + // transfer scan data back to host + void transferScan(int N, int * odata, int * dev_odata) + { + cudaMemcpy(odata, dev_odata, N * sizeof(int), cudaMemcpyDeviceToHost); + } + + // end the scan on the device. + void endScan(int * dev_idata) + { + cudaFree(dev_idata); + } + // kernParallelReduction uses contiguous threads to do the parallel reduction + // There is one thread for every two elements + __global__ void kernParallelReduction(int N, int Stride, + int maxThreads, int * dev_idata) + { + int thread = threadIdx.x + blockIdx.x * blockDim.x; + if (thread >= maxThreads) { + return; + } + int priorStride{ Stride >> 1 }; + int index = (thread + 1) * Stride - 1; + if (index < N) { + dev_idata[index] += dev_idata[index - priorStride]; + } + } + // Downsweep uses contiguous threads to sweep down and add the intermediate + // results to the partial sums already computed + // There is one thread for every two elements. Here there is a for loop + // that changes the stride. Contiguous allows the first threads to do all + // the work and later warps will all be 0. + __global__ void kernDownSweep(int N, int stride, int maxThreads, int * dev_idata) + { + int thread = threadIdx.x + blockIdx.x * blockDim.x; + if (thread >= maxThreads) { + return; + } + // have one thread set the last element to 0; + int startOffset{ N - 1 }; + int right = -stride * thread + startOffset; + if (right >= 0) { + int separation = stride >> 1; + int left = right - separation; + int current = dev_idata[right]; + dev_idata[right] += dev_idata[left]; + dev_idata[left] = current; + } + } + inline int gridSize(int threads) { + return (threads + blockSize - 1) / blockSize; + } + /* Performs prefix-sum (aka scan) on idata, storing the result into odata. + */ + void efficientScan(int N, int d, int * dev_idata) + { + int iteration{ 1 }; + int maxThreads{ N >> 1 }; + for (int stride = { 2 }; stride <= N; stride *= 2) + { + int grids{ gridSize(maxThreads) }; + dim3 fullBlocksPerGrid(grids); + kernParallelReduction << > > + (N, stride, maxThreads, dev_idata); + ++iteration; + maxThreads >>= 1; + } + cudaMemset((dev_idata + N - 1), 0, sizeof(int)); + maxThreads = 1; + for (int stride = { N }; stride > 1; stride >>= 1) + { + int grids{ gridSize(maxThreads) }; + dim3 fullBlocksPerGrid(grids); + // printf(" %d %d %d\n", grids, maxThreads, stride); + kernDownSweep << > >(N, stride, + maxThreads, dev_idata); + --iteration; + maxThreads <<= 1; + } + } + void scan(int n, int *odata, const int *idata) + { + int * dev_idata; + // d is the number of scans needed and also the + // upper bound for log2 of the number of elements + int d{ ilog2ceil(n) }; // + int N{ 1 << d }; + initScan(N, n, idata, &dev_idata); + timer().startGpuTimer(); + efficientScan(N, d, dev_idata); + timer().endGpuTimer(); + // only transfer tho first n elements of the + // exclusive scan + transferScan(n, odata, dev_idata); + endScan(dev_idata); + } + + void initCompact(int N, int n, const int *idata, int ** dev_idata, + int **dev_booldata, int ** dev_indices, int **dev_odata) + { + int size{ sizeof(int) }; + cudaMalloc(reinterpret_cast (dev_booldata), N * size); + cudaMalloc(reinterpret_cast (dev_idata), N * size); + cudaMalloc(reinterpret_cast (dev_indices), N * size); + cudaMalloc(reinterpret_cast (dev_odata), N * size); + checkCUDAError("Allocating Compaction Scan Error"); + cudaMemset(*dev_idata, 0, N * size); + cudaMemcpy(*dev_idata, idata, n *size, cudaMemcpyHostToDevice); + // no need to initialize the odata because the loop does that each time + checkCUDAError("Initialize and Copy data to target Error"); + cudaThreadSynchronize(); + } + /** + * Performs stream compaction on idata, storing the result into odata. + * All zeroes are discarded. + * + * @param n The number of elements in idata. + * @param odata The array into which to store elements. + * @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 * dev_idata; + int * dev_booldata; + int * dev_indices; + int * dev_odata; + // d is the number of scans needed and also the + // upper bound for log2 of the number of elements + int d{ ilog2ceil(n) }; // + int N{ 1 << d }; + initCompact(N, n, idata, &dev_idata, &dev_booldata, &dev_indices, + &dev_odata); + timer().startGpuTimer(); + dim3 fullBlocksPerGrid((N + blockSize - 1) / blockSize); + + StreamCompaction::Common::kernMapToBoolean << > >(N, dev_booldata, dev_idata); + cudaMemcpy(dev_indices, dev_booldata, N * sizeof(int), + cudaMemcpyDeviceToDevice); + efficientScan(N, d, dev_indices); + StreamCompaction::Common::kernScatter << > >(N, dev_odata, dev_idata, + dev_booldata, dev_indices); + timer().endGpuTimer(); + int lastIndex; + transferScan(1, &lastIndex, dev_indices + N - 1); + int lastIncluded; + transferScan(1, &lastIncluded, dev_booldata + N - 1); + std::vector input(n); + std::vector bools(n); + std::vector indices(n); + transferScan(n, input.data(), dev_idata); + transferScan(n, bools.data(), dev_booldata); + transferScan(n, indices.data(), dev_indices); + printArray2(n, input.data(), true); + printArray2(n, bools.data(), true); + printArray2(n, indices.data(), true); + n = lastIncluded + lastIndex; + transferScan(n, odata, dev_odata); + printArray2(n, odata, true); + endScan(dev_odata); + endScan(dev_idata); + endScan(dev_indices); + endScan(dev_booldata); + return n; + } + } +} diff --git a/stream_compaction/efficientOld.cu b/stream_compaction/efficientOld.cu new file mode 100644 index 0000000..6086197 --- /dev/null +++ b/stream_compaction/efficientOld.cu @@ -0,0 +1,193 @@ +#include +#include +#include "common.h" +#include "efficient.h" + +static const int blockSize{ 256}; + + + + + +namespace StreamCompaction { + namespace Efficient { + using StreamCompaction::Common::PerformanceTimer; + PerformanceTimer& timer() + { + static PerformanceTimer timer; + return timer; + } + + // initialize the arrays on the GPU + // returns the addresses of the pointers on the GPU + // dev_idata is a pointer to the address of the dev_idata array that + // gets updated here + // initialize dev_idata has the first + // elements copied and the remainder to make the stream 2^n + // are set to 0. The first input is the size of the arrays + // to allocate and the second input is the size of the array to transfer. + // N the maximum size of the allocated array. n is the size of the data array + // N is one more than the multiple of 2 greater or equal to n, + // in dev_idata, and then the elements are copied inte dev_idata. + + void initScan(int N, int n, const int *idata, int ** dev_idata) + { + int size {sizeof(int)}; + cudaMalloc((void**) (dev_idata), N * size); + checkCUDAError("Allocating Scan Buffer Efficient Error"); + cudaMemset(*dev_idata, 0, N * size); + cudaMemcpy(*dev_idata , idata, n *size, cudaMemcpyHostToDevice); + // no need to initialize the odata because the loop does that each time + checkCUDAError("Initialize and Copy data to target Error"); + cudaThreadSynchronize(); + } + // transfer scan data back to host + void transferScan(int N, int * odata, int * dev_odata) + { + cudaMemcpy(odata, dev_odata, N * sizeof(int), cudaMemcpyDeviceToHost); + } + + // end the scan on the device. + void endScan( int * dev_idata) + { + cudaFree(dev_idata); + } + // kernParallelReduction uses contiguous threads to do the parallel reduction + // There is one thread for every two elements + __global__ void kernParallelReduction(int N, int Stride, int * dev_idata) + { + int thread = threadIdx.x + blockIdx.x * blockDim.x; + int priorStride { Stride >> 1}; + int index = (thread + 1) * Stride -1; + if (index < N) { + dev_idata[index] += dev_idata[index - priorStride]; + } + } + // Downsweep uses contiguous threads to sweep down and add the intermediate + // results to the partial sums already computed + // There is one thread for every two elements. Here there is a for loop + // that changes the stride. Contiguous allows the first threads to do all + // the work and later warps will all be 0. + __global__ void kernDownSweep(int N, int stride, int * dev_idata) + { + int thread = threadIdx.x + blockIdx.x * blockDim.x; +// if ( 2 * thread >= N) { +// return; +// } + // have one thread set the last element to 0; + int startOffset { N - 1}; + int right = - stride * thread + startOffset; + if (right >= 0) { + int separation = stride >> 1; + int left = right - separation; + int current = dev_idata[right]; + dev_idata[right] += dev_idata[left]; + dev_idata[left] = current; + } + } +// __global__ void kernDownSweep(int N, int * dev_idata) +// { +// int thread = threadIdx.x + blockIdx.x * blockDim.x; +// if ( 2 * thread >= N) { +// return; +// } +// // have one thread set the last element to 0; +// int startOffset { N - 1}; +// if (thread == 0) { +// dev_idata[startOffset] = 0; +// } +// for ( int stride = {N}; stride > 1; stride >>= 1) +// { +// int right = - stride * thread + startOffset; +// if (right >= 0) { +// int separation = stride >> 1; +// int left = right - separation; +// int current = dev_idata[right]; +// dev_idata[right] += dev_idata[left]; +// dev_idata[left] = current; +// } +// __syncthreads(); +// } +// } + /** + * Performs prefix-sum (aka scan) on idata, storing the result into odata. + */ + void efficientScan(int N, int * dev_idata) + { + int Nthreads {N>>1}; + dim3 fullBlocksPerGrid((Nthreads + blockSize - 1)/ blockSize); + for ( int stride = {2}; stride <= N; stride *= 2) + { + kernParallelReduction<<>> + (N, stride, dev_idata); + } + cudaMemset((dev_idata + N - 1), 0, sizeof(int)); + for ( int stride = {N}; stride > 1; stride >>= 1) + { + kernDownSweep<<>>(N, stride, dev_idata); + } + } + void scan(int n, int *odata, const int *idata) + { + int * dev_idata; + // d is the number of scans needed and also the + // upper bound for log2 of the number of elements + int d {ilog2ceil(n)}; // + // add one so that the 0th element is 0 for the + // eclusive Scan + int N { 1 << d }; + initScan(N, n, idata, &dev_idata); + timer().startGpuTimer(); + efficientScan( N, dev_idata); + timer().endGpuTimer(); + // only transfer tho first n elements of the + // exclusive scan + transferScan(n, odata, dev_idata); + endScan(dev_idata); + } + + void initCompact(int N, int n, const int *idata, int ** dev_idata, int **dev_booldata) + { + int size {sizeof(int)}; + cudaMalloc(reinterpret_cast (dev_booldata), N * size); + cudaMalloc(reinterpret_cast (dev_idata), N * size); + checkCUDAError("Allocating Scan Buffer Scan Error"); + cudaMemset(*dev_idata, 0, N * size); + cudaMemcpy(*dev_idata , idata, n *size, cudaMemcpyHostToDevice); + // no need to initialize the odata because the loop does that each time + checkCUDAError("Initialize and Copy data to target Error"); + cudaThreadSynchronize(); + } + /** + * Performs stream compaction on idata, storing the result into odata. + * All zeroes are discarded. + * + * @param n The number of elements in idata. + * @param odata The array into which to store elements. + * @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 * dev_idata; + int * dev_booldata; + // d is the number of scans needed and also the + // upper bound for log2 of the number of elements + int d {ilog2ceil(n)}; // + // add one so that the 0th element is 0 for the + // eclusive Scan + int N { 1 << d }; + initCompact(N, n, idata, &dev_idata, &dev_booldata); + timer().startGpuTimer(); + efficientScan( N, dev_idata); + dim3 fullBlocksPerGrid((N + blockSize - 1)/ blockSize); + StreamCompaction::Common::kernMap…•”ŸŸŸŸŸŸŸŸŸŸ‰ + + timer().endGpuTimer(); + timer().startGpuTimer(); + + timer().endGpuTimer(); + return -1; + } + } +} diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 36b732d..d738956 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -1,28 +1,35 @@ -#include -#include -#include -#include -#include -#include "common.h" -#include "thrust.h" - -namespace StreamCompaction { - namespace Thrust { +#include +#include +#include +#include +#include +#include "common.h" +#include "thrust.h" + +namespace StreamCompaction { + namespace Thrust { using StreamCompaction::Common::PerformanceTimer; PerformanceTimer& timer() { static PerformanceTimer timer; return timer; - } - /** - * 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::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); - timer().endGpuTimer(); - } - } -} + } + + /** + * Performs prefix-sum (aka scan) on idata, storing the result into odata. + */ + // read about cuda host/device vectors. This way uses host and device + // vector iterators. + void scan(int n, int *odata, const int *idata) { + thrust::host_vector myvec(n); + thrust::copy(idata, idata + n, myvec.begin()); + thrust::device_vector dev_idata = myvec; + timer().startGpuTimer(); + thrust::exclusive_scan(dev_idata.begin(), dev_idata.end(), + dev_idata.begin()); + timer().endGpuTimer(); + myvec = dev_idata; + thrust::copy(myvec.begin(), myvec.end(), odata); + } + } +} From ca9988c41d611eae5bcde3394b636d642c950b12 Mon Sep 17 00:00:00 2001 From: akhabbaz Date: Wed, 20 Sep 2017 00:23:41 -0400 Subject: [PATCH 3/5] Read me finished --- README.md | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8aa5fd8..8eba48d 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,30 @@ Personal computer ### (TODO: Your README) +This project aimed to understand parallel algorithms and how they are implemented on the GPU. A scan takes a running sum of integers and here we used the scan to implement three versions of scan: a cpu version in series, a naive GPU version, a work efficient version, +and one where we used the thrust library. + +To do the work efficient scan I implemented the extra credit. All the threads are contiguous in both the up and down sweep. Furthermore, I trimmed the number of threads needed so that the grid size was enough to run all the threads needed. In the end with some 10^8 data elements, my work efficient scan matched the CPU scan in speed. The GPU and CPU timers measured computation, not the time to copy and transfer data. + +For all number of elements all the tests passed. + +![](images/RunTimes.png) +THis figure plots the log10 of the run time per element in the array. This measure was relatively constant as N increased. Here we can see that the work efficient scan at first is worse than the CPU scan but as the number of elements increases, it first beats the naive scan and then matches the CPU scan. Thrust on the other hand is the fastest scan for large data (faster by a factor of about 6). +The non power of two scans were slightly faster but comparable in speed to the power of two scans. + +Stream Compaction is one application of scan and it allows one to remove elements from the stream. Here around 10^5 elements, the work efficient compaction actually beat the other compactions. A thrust scan would beat the work efficient compaction, since a majority of the time to compact is spent making the exclusive scan. + +![](images/StreamCompactionTimes.png) + Here I implemented the efficient scan using contiguous threads. This worked perfectly up to one block but beyond one block the code failed. The issue was that threads beyond one block do not synchronize. -Include analysis, etc. (Remember, this is public, so don't put -anything here that you don't want to share with the world.) +I had many difficulties. First I used syncthreads to synchronize and that worked only when one block had all the threads. I then changed my code to iterate over strides on the CPU and this allowed all the blocks to be synchronized. + +Another major issue I had was that aroud 2^15 or so, I got an allocation error. I traced it down to the work efficient scan and then used Memtracker in cuda to catch the out of bounds error. That showed me that I was multiplying 2 65K integers to calculate the index (some threads had high indices). That produced a negative index. I got around that by returning depending on the stride, so that the actual index would never be larger that the avalable array. Ultimately I also chose the grid size so that the minimum number of threads would be available, a number that varied with the stride. THis culled the number of possible threads and sped up the run time. + + +A final issue I had was that in the compaction I did not return when index was beyond the array size. That caused multiple writes to the same location and that was hard to debug. + +The code now works for any N I tride up to the maximum memory, about 2 GB. From 504d77c9bae9db014057b108cd3fb124b29a5693 Mon Sep 17 00:00:00 2001 From: akhabbaz Date: Wed, 20 Sep 2017 00:26:49 -0400 Subject: [PATCH 4/5] Read me updated with pictures --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8eba48d..10bac98 100644 --- a/README.md +++ b/README.md @@ -17,13 +17,13 @@ To do the work efficient scan I implemented the extra credit. All the threads a For all number of elements all the tests passed. -![](images/RunTimes.png) +![](img/RunTimes.png) THis figure plots the log10 of the run time per element in the array. This measure was relatively constant as N increased. Here we can see that the work efficient scan at first is worse than the CPU scan but as the number of elements increases, it first beats the naive scan and then matches the CPU scan. Thrust on the other hand is the fastest scan for large data (faster by a factor of about 6). The non power of two scans were slightly faster but comparable in speed to the power of two scans. Stream Compaction is one application of scan and it allows one to remove elements from the stream. Here around 10^5 elements, the work efficient compaction actually beat the other compactions. A thrust scan would beat the work efficient compaction, since a majority of the time to compact is spent making the exclusive scan. -![](images/StreamCompactionTimes.png) +![](img/StreamCompactionTimes.png) Here I implemented the efficient scan using contiguous threads. This worked perfectly up to one block but beyond one block the code failed. The issue was that threads beyond one block do not synchronize. From 463669c50087439588d69a9b18fff86cb89e5c4a Mon Sep 17 00:00:00 2001 From: akhabbaz Date: Wed, 20 Sep 2017 00:29:05 -0400 Subject: [PATCH 5/5] Read me updated with pictures --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 10bac98..fe3fc01 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ For all number of elements all the tests passed. THis figure plots the log10 of the run time per element in the array. This measure was relatively constant as N increased. Here we can see that the work efficient scan at first is worse than the CPU scan but as the number of elements increases, it first beats the naive scan and then matches the CPU scan. Thrust on the other hand is the fastest scan for large data (faster by a factor of about 6). The non power of two scans were slightly faster but comparable in speed to the power of two scans. -Stream Compaction is one application of scan and it allows one to remove elements from the stream. Here around 10^5 elements, the work efficient compaction actually beat the other compactions. A thrust scan would beat the work efficient compaction, since a majority of the time to compact is spent making the exclusive scan. +Stream Compaction is one application of scan and it allows one to remove elements from a stream. Here around 10^5 elements, the work efficient compaction actually beat the other compactions. A thrust scan would beat the work efficient compaction, since a majority of the time to compact is spent making the exclusive scan. ![](img/StreamCompactionTimes.png) @@ -35,5 +35,5 @@ Another major issue I had was that aroud 2^15 or so, I got an allocation error. A final issue I had was that in the compaction I did not return when index was beyond the array size. That caused multiple writes to the same location and that was hard to debug. -The code now works for any N I tride up to the maximum memory, about 2 GB. +The code now works for any N I tried up to the maximum memory on my GPU, about 2 GB.