From a31b391ff75c087a06709770178c2ec564c40b75 Mon Sep 17 00:00:00 2001 From: ziyuli Date: Mon, 18 Sep 2017 20:20:21 -0400 Subject: [PATCH 1/3] Update All Features --- README.md | 61 ++++- img/39fig06.jpg | Bin 0 -> 57014 bytes img/compaction_2.PNG | Bin 0 -> 36271 bytes img/scan_power_2.PNG | Bin 0 -> 19328 bytes img/scan_power_not_2.PNG | Bin 0 -> 19726 bytes src/main.cpp | 107 +++++++- src/radix.cpp | 0 stream_compaction/CMakeLists.txt | 2 + stream_compaction/common.cu | 15 +- stream_compaction/cpu.cu | 63 ++++- stream_compaction/cpu.h | 2 + stream_compaction/efficient.cu | 410 +++++++++++++++++++++++++++++-- stream_compaction/efficient.h | 4 + stream_compaction/naive.cu | 42 +++- stream_compaction/radix.cu | 153 ++++++++++++ stream_compaction/radix.h | 14 ++ stream_compaction/radix_.cu | 132 ++++++++++ stream_compaction/radix_.h | 12 + stream_compaction/thrust.cu | 18 +- 19 files changed, 993 insertions(+), 42 deletions(-) create mode 100644 img/39fig06.jpg create mode 100644 img/compaction_2.PNG create mode 100644 img/scan_power_2.PNG create mode 100644 img/scan_power_not_2.PNG create mode 100644 src/radix.cpp create mode 100644 stream_compaction/radix.cu create mode 100644 stream_compaction/radix.h create mode 100644 stream_compaction/radix_.cu create mode 100644 stream_compaction/radix_.h diff --git a/README.md b/README.md index b71c458..c642f89 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,60 @@ -CUDA Stream Compaction +University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 2 CUDA Stream Compaction ====================== +* Ziyu Li +* Tested on: Windows 7, i7-3840QM @ 2.8GHz 16GB, Nivida Quadro K4000M 4096MB (Personal Laptop) -**University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 2** +## Performance Analysis +#### Efficient Scan with Optimization +To avoid the efficient scan method uses extra non-working threads, simply change the index pattern to perform the kernels. So this optimization can reduce a huge amount of threads to perform useless operations and increase the overall performance. + +For the benchmark and result, please check **Performance** section + + +#### More Efficient Scan with Shared Memory +The optimized method which states above still is not efficiency enough. Actually by performing the operations in shared memory can highly achieve the maximum the performance. The whole implementation can split into three parts. + +* Scan each blocks seperatly and use a auxiliary array to store each block sum +* Scan the block sums +* Add scanned block sum to next scanned block + +![](img/39fig06.jpg) + +(Figure 1: Algorithm for Performing a Sum Scan on a Large Array of Values, Nvidia GPU Gems) + + +This implementation is relatively easy to achieve, however using share memory will sometimes suffer from bank conflicts which could hurt the performance significantly by access those memory everytime. To avoid these bank conflict, we have to add padding to share memory every certain elements. And those offset can be easily implement by a macro. + +```c++ +#define CONFLICT_FREE_OFFSET(n) \ ((n) >> NUM_BANKS + (n) >> (2 * LOG_NUM_BANKS)) +``` + +For the benchmark and result, please check **Performance** section + + +## Performance +#### Scan Performace Measurement and Result +The benckmark is performed the scan operation under 128 threads per block for array size from 2^4 to 2^22. (Since there is only one grid, 2^22 is the maximum amount for a 128 block size.) + +The benchmark also makes a running time comparision between CPU, GPU Naive, GPU Efficient, GPU Efficient With Optimization, GPU Efficient With Share Memory and GPU Thrust Scan. + +![](img/scan_power_2.PNG) + +![](img/scan_power_not_2.PNG) + +(For the detail result, please check the data in the **benckmark** folder) + +#### Compact Performace Measurement and Result +The benckmark is performed the compaction operation under 128-512 threads per block for array size from 2^4 to 2^24. (128 block size for array size 2^4 to 2^22, 256 block size for 2^23 and 512 block size for 2^24) + +The benchmark also makes a running time comparision between CPU without scan, CPU with scan and GPU with scan. + +![](img/compaction_2.PNG) + + +(For the detail result, please check the data in the **benckmark** folder) + +## Questions -* (TODO) YOUR NAME HERE -* Tested on: (TODO) Windows 22, i7-2222 @ 2.22GHz 22GB, GTX 222 222MB (Moore 2222 Lab) -### (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.) diff --git a/img/39fig06.jpg b/img/39fig06.jpg new file mode 100644 index 0000000000000000000000000000000000000000..973e531c7f2feb5b1c6867735dcec6c50773a772 GIT binary patch literal 57014 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 literal 0 HcmV?d00001 diff --git a/img/compaction_2.PNG b/img/compaction_2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..3652faf7e22bde12b1d257a88d4190ec675ab8a2 GIT binary patch literal 36271 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%0DKooOuY0qDp|RKlnSuH9J9fOf3~iSE>_cbK z`@`jb8r~7|#%jboA5^vX65{&PMlZoAFm`~9 zw6e1<6A!CkBpq?imR`l*HIf*m93B>o!Eap-SCdfmMbHhFcq3+|R` zpth)Y>pfr#73TqHwK0=KQ%{jF{xP5+}^1Hw?_xYwu+0ZtI?gw=?YFaB)5tRln9x;|ScOO;k z#Nav=i`#hqu}C4JOVQBWvdDj>_8?8ATPnwbMKT}E$ZsoLn$fE3$wEP$7is5j4;c~n zC~kDHnamu$J*4c9@jB0~p~;$u5+rnu6erISFUOh6@2JZcj%hu7vB4H+bCR03VAZ2I z$bXB+p3sL$-BoRqUlL2oB#FEfsw`}P8{|cX_!NZFm2w3~$Ldd`b`nM{oB7SjTE&2C(IXm;RRtXk&{taoZ7m=A8yEuCc(UbxI z`fBG?Oc8j2>RB^871$D`O4&ldzDflHqkafm4_Pt_>38(ay=E3BH%7A7UcxCF`qW`b zA*ujUfC z;Tb3u{MufWYL{rfrTNL|te;LZU#>o835>8aAc@xuHX+|dhBkLiqB<*YgmhGvw(FOA zUdc_(4-7cp#ZX?_^L-+f2xW{~6hf(BLG26;EwoYGb*sN=^VJF!=BR|<8%>zQ!X|uF zQOlhbcGQ5?5VbI94InJ1Nt?`A)*iLy6ZL-P_)9jfrnJ{g(FggI<7rWGrM4;k74?zS zW$ess8?8+n2KZxefpk=!N7st1h(4Q z=T}y<>(eMpjfVTimZdS=178ht%qM0-us1hIL*<_JrE5 z{j%KXju)3;p>(s{-OT8aE?8KZu6I520!3rO7EIgY+vj_uYjxK5;d|=pT4^h3&qeVm zc=%e13AJFl@gjbSfF&Ks^U&jZpy;LsQ8Y67pWcB)o42AASF0Hw9LX>kl`CE_>M=B{ z!eSc&8*XKJw zu|?Qf_R(9Tiqm7*smfwZrURaIW@T;F#T2KbpyRUvPrH$dn!&EXVi`QleX$O6j?G7NY^DkC?j7YEWS8LXs9{gC_st)~^A_At zq9(5Jx&WPF^oaPNcF4Mjw}R=E&igg>rInO^)0L9kVG#V4#CpVIi9x3d)+`4i;4|#P z$s_zGghV+!O3P;u@pw1~NN`l0A38?@CL`L^YDmG^yH-W007iexXt{9xbUm0jLXpa7 zC1d5mQ5wd&^^$7ZEUqN9jTlYFevBqFV2xWj3R#OuQfI2lgYsWmm=v0>x=VFSO=_zc zg7SrX*RgJHsDtbPuwA-o)m=QOjm1S|Y5Ds4svWc(7fL7G7Sf-_=0?B?xnJiZ zSwvb3)brxV$RI54+}5Pc3)*tTUBHX8j+e|^EOq#~q@In-3lRO?>Xqlt*mgFbmC!<7 z*1(K}pj?f`pLl03(58yvB%OLfPst6gO{5S;O@oGRBpkp~8+gx93#>-xl<~ZU(g@TI zE^Zxc0ODYLWy(n_fdGYu`4Bu#8iiVBBwcEqo>SagK=FlnMLF^1!z;LhhQbIJs?9AJ zgX%U^@ohXJmGfa$4X&Pb^&}0#+p)F>J>l2}YMd>4Dad7De(p?_b=({Y{Cl$`YA@Cj znx)Zlf{;5IYa#CLV?~`_Fj3I9e4w3yz>^x^XXd->xn~TH!io7Fk5lk2J?=Sp984ic%SHo)T-LP+`Kow@^(330e*(Y8k{1&r~+ zyo|@#Kx}nzu^~soix-hpuVK3}s#?su?;uvJ-eHtQdj(d2UsIo3;bn70&aSUdYnh2t zPfeC?N-c~=6V%X{84803DRHzVcrR9@KBd@;2bKCuKFW5S#P$&vif3A4D!<#UkPVn; zrPCpg1fL|wpJQco;+SDgL)|xXJ3dV?THGtXBtnh|^>exKoHq30be2~`?&EUaMK#5(5#f2^{3#M0qH_19$ zrxF?zA?cp4il~){W=S6?V#C8%1MMw#?EhJh?KI=wp!S_tSsjo&C9j9<{$WQyBe+z5 zx?Fv^;!onAcA#h`sRY&+JxY?ef literal 0 HcmV?d00001 diff --git a/img/scan_power_2.PNG b/img/scan_power_2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..4f4b8454531ca912da93b759dd994b77a4a76479 GIT binary patch literal 19328 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

?+#8nf!BXuwL0ED`5Sv;Mv#=kmC_ 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 O7@jlHtvq`*?0*3sUM{f! literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp index 7305641..740d0bf 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,15 +11,39 @@ #include #include #include +#include +#include #include "testing_helpers.hpp" -const int SIZE = 1 << 8; // 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 SIZE = 1 << 4; // feel free to change the size of array +int NPOT = SIZE - 3; // Non-Power-Of-Two -int main(int argc, char* argv[]) { - // Scan tests +StreamCompaction::Common::PerformanceTimer& timer(); + +using StreamCompaction::Common::PerformanceTimer; +PerformanceTimer& timer() +{ + static PerformanceTimer timer; + return timer; +} +int main(int argc, char* argv[]) { + int *a, *b, *c; + a = (int *)malloc(SIZE * sizeof(int)); + b = (int *)malloc(SIZE * sizeof(int)); + c = (int *)malloc(SIZE * sizeof(int)); + + // Scan tests + + if (argc == 2) { + if (atoi(argv[1]) < 0) { + printf("---------------------------------------------------"); + SIZE = 1 << (-1 * atoi(argv[1])); + //printf("---bash test: %i----\n", -1 * atoi(argv[1])); + } + } + + printf("\n"); printf("****************\n"); printf("** SCAN TESTS **\n"); @@ -59,20 +83,49 @@ int main(int argc, char* argv[]) { //printArray(SIZE, c, true); printCmpResult(NPOT, b, c); + zeroArray(SIZE, c); + printDesc("work-efficient scan, power-of-two"); + StreamCompaction::Efficient::scan0(SIZE, c, a); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(SIZE, c, true); + printCmpResult(SIZE, b, c); + + zeroArray(SIZE, c); + printDesc("work-efficient scan, non-power-of-two"); + StreamCompaction::Efficient::scan0(NPOT, c, a); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(NPOT, c, true); + printCmpResult(NPOT, b, c); + zeroArray(SIZE, c); - printDesc("work-efficient scan, power-of-two"); + printDesc("work-efficient scan with optimization, power-of-two"); StreamCompaction::Efficient::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(SIZE, c, true); printCmpResult(SIZE, b, c); zeroArray(SIZE, c); - printDesc("work-efficient scan, non-power-of-two"); + printDesc("work-efficient scan with optimization, non-power-of-two"); StreamCompaction::Efficient::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(NPOT, c, true); printCmpResult(NPOT, b, c); + zeroArray(SIZE, c); + printDesc("work-efficient scan with SHARE MEMORY and optimization, power-of-two"); + StreamCompaction::Efficient::scan_s(SIZE, c, a); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(SIZE, c, true); + printCmpResult(SIZE, b, c); + + zeroArray(SIZE, c); + printDesc("work-efficient scan with SHARE MEMORY and optimization, non-power-of-two"); + StreamCompaction::Efficient::scan_s(NPOT, c, a); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(NPOT, c, true); + printCmpResult(NPOT, b, c); + + zeroArray(SIZE, c); printDesc("thrust scan, power-of-two"); StreamCompaction::Thrust::scan(SIZE, c, a); @@ -119,12 +172,20 @@ int main(int argc, char* argv[]) { printCmpLenResult(count, expectedNPOT, b, c); zeroArray(SIZE, c); - printDesc("cpu compact with scan"); + printDesc("cpu compact with scan, power-of-two"); count = StreamCompaction::CPU::compactWithScan(SIZE, c, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(count, c, true); printCmpLenResult(count, expectedCount, b, c); + zeroArray(SIZE, c); + printDesc("cpu compact with scan, non-power-of-two"); + count = StreamCompaction::CPU::compactWithScan(NPOT, c, a); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + expectedNPOT = count; + printArray(count, c, true); + printCmpLenResult(count, expectedNPOT, b, c); + zeroArray(SIZE, c); printDesc("work-efficient compact, power-of-two"); count = StreamCompaction::Efficient::compact(SIZE, c, a); @@ -139,5 +200,35 @@ int main(int argc, char* argv[]) { //printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); + + + printf("\n"); + printf("*****************************\n"); + printf("** RADIX SORT TESTS **\n"); + printf("*****************************\n"); + + genArray(SIZE - 1, a, 50); // Leave a 0 at the end to test that edge case + a[SIZE - 1] = 0; + printArray(SIZE, a, true); + + memcpy(c, a, SIZE * sizeof(int)); + timer().startCpuTimer(); + std::sort(c, c + SIZE); + timer().endCpuTimer(); + printElapsedTime(timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + + zeroArray(SIZE, b); + printDesc("radix sort, power-of-two"); + count = SIZE; + StreamCompaction::Radix::sort(SIZE, b, a); + printElapsedTime(StreamCompaction::Radix::timer().getGpuElapsedTimeForPreviousOperation(), "(cuda Measured)"); + expectedCount = count; + printArray(count, b, true); + printCmpLenResult(count, expectedCount, b, c); + + + free(a); + free(b); + free(c); system("pause"); // stop Win32 console from closing on exit } diff --git a/src/radix.cpp b/src/radix.cpp new file mode 100644 index 0000000..e69de29 diff --git a/stream_compaction/CMakeLists.txt b/stream_compaction/CMakeLists.txt index cdbef77..bcc484e 100644 --- a/stream_compaction/CMakeLists.txt +++ b/stream_compaction/CMakeLists.txt @@ -9,6 +9,8 @@ set(SOURCE_FILES "efficient.cu" "thrust.h" "thrust.cu" + "radix.h" + "radix.cu" ) cuda_add_library(stream_compaction diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 8fc0211..e290a6f 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -23,7 +23,12 @@ 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 idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= n) { + return; + } + + bools[idx] = (bool)idata[idx]; } /** @@ -32,7 +37,13 @@ namespace StreamCompaction { */ __global__ void kernScatter(int n, int *odata, const int *idata, const int *bools, const int *indices) { - // TODO + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= n) { + return; + } + if (bools[idx]) { + odata[indices[idx]] = idata[idx]; + } } } diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 05ce667..c23d95a 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -12,6 +12,8 @@ namespace StreamCompaction { return timer; } + + /** * CPU scan (prefix sum). * For performance analysis, this is supposed to be a simple for loop. @@ -19,10 +21,31 @@ 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(); } + void scan_wo_timer(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]; + } + } + + void scan_incusive(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]; + } + } + + + /** * CPU stream compaction without using the scan function. * @@ -30,9 +53,18 @@ namespace StreamCompaction { */ int compactWithoutScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // TODO + + int nRemains = 0; + + for (int i = 0; i < n; i++) { + if (idata[i]) { + odata[nRemains++] = idata[i]; + } + } + timer().endCpuTimer(); - return -1; + return nRemains; + } /** @@ -42,9 +74,28 @@ namespace StreamCompaction { */ int compactWithScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // TODO - timer().endCpuTimer(); - return -1; + + int *temp = new int[n]; + for (int i = 0; i < n; i++) { + temp[i] = (idata[i] != 0); + } + + int *temp_scan = new int[n]; + scan_wo_timer(n, temp_scan, temp); + + int nRemains = 0; + + for (int i = 0; i < n; i++) { + if (temp[i]) { + odata[temp_scan[i]] = idata[i]; + nRemains++; + } + } + + delete[] temp, temp_scan; + + timer().endCpuTimer(); + return nRemains; } } } diff --git a/stream_compaction/cpu.h b/stream_compaction/cpu.h index 236ce11..a120163 100644 --- a/stream_compaction/cpu.h +++ b/stream_compaction/cpu.h @@ -8,6 +8,8 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata); + void scan_incusive(int n, int *odata, const int *idata); + int compactWithoutScan(int n, int *odata, const int *idata); int compactWithScan(int n, int *odata, const int *idata); diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 36c5ef2..97db880 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -2,6 +2,23 @@ #include #include "common.h" #include "efficient.h" +#include "cpu.h" +#include "naive.h" + +#define BLOCKSIZE 512 +#define SOLVE_BANK_CONFLICTS 1 + +#if BLOCKSIZE > 1024 +#error "Warning: Blocksize cannot excess 1024!" +#endif + +#define NUM_BANKS 16 +#define LOG_NUM_BANKS 4 +#define CONFLICT_FREE_OFFSET(n) \ + ((n) >> NUM_BANKS + (n) >> (2 * LOG_NUM_BANKS)) + +typedef int var_t; +int scan_timing = 1; namespace StreamCompaction { namespace Efficient { @@ -12,29 +29,392 @@ namespace StreamCompaction { return timer; } +#pragma region PrescanEfficientWithShareMemory + __global__ void scanWithShareMem(int n, int * idata, int * odata, int * aux) { + + // Declare Share Memory + #if SOLVE_BANK_CONFLICTS + __shared__ var_t temp[BLOCKSIZE + NUM_BANKS]; + #else + __shared__ var_t temp[BLOCKSIZE]; + #endif + + // Declare necessary variables + const var_t tid = threadIdx.x; + const var_t bid = blockIdx.x; + const var_t s = bid * BLOCKSIZE; + var_t offset = 1; + + // Copy Global Memory to Share Memory + #if SOLVE_BANK_CONFLICTS + var_t ai = tid << 1; + var_t bi = ai + 1; + var_t bankOffsetA = CONFLICT_FREE_OFFSET(ai); + var_t bankOffsetB = CONFLICT_FREE_OFFSET(bi); + temp[ai + bankOffsetA] = idata[ai + s]; + temp[bi + bankOffsetB] = idata[bi + s]; + #else + temp[2 * tid] = idata[2 * tid + s]; + temp[2 * tid + 1] = idata[2 * tid + s + 1]; + #endif + + // Reduction Phase + for (var_t d = BLOCKSIZE >> 1; d > 0; d >>= 1) + { + __syncthreads(); + if (tid < d) + { + var_t ai = offset*((tid << 1) + 1) - 1; + var_t bi = offset*((tid << 1) + 2) - 1; + #if SOLVE_BANK_CONFLICTS + ai += CONFLICT_FREE_OFFSET(ai); + bi += CONFLICT_FREE_OFFSET(bi); + #endif + temp[bi] += temp[ai]; + } + offset <<= 1; + } + + // Copy Block Sum to Aux Array + __syncthreads(); + if (!tid) { + #if SOLVE_BANK_CONFLICTS + aux[bid] = temp[BLOCKSIZE - 1 + CONFLICT_FREE_OFFSET(BLOCKSIZE - 1)]; + temp[BLOCKSIZE - 1 + CONFLICT_FREE_OFFSET(BLOCKSIZE - 1)] = 0; + #else + aux[bid] = temp[BLOCKSIZE - 1]; + temp[BLOCKSIZE - 1] = 0; + #endif + } + + for (var_t d = 1; d < BLOCKSIZE; d <<= 1) + { + offset >>= 1; + __syncthreads(); + if (tid < d) + { + int ai = offset*((tid << 1) + 1) - 1; + int bi = offset*((tid << 1) + 2) - 1; + #if SOLVE_BANK_CONFLICTS + ai += CONFLICT_FREE_OFFSET(ai); + bi += CONFLICT_FREE_OFFSET(bi); + #endif + var_t t = temp[ai]; + temp[ai] = temp[bi]; + temp[bi] += t; + } + } + + __syncthreads(); + #if SOLVE_BANK_CONFLICTS + ai = tid << 1; + bi = ai + 1; + bankOffsetA = CONFLICT_FREE_OFFSET(ai); + bankOffsetB = CONFLICT_FREE_OFFSET(bi); + odata[ai + s] = temp[ai + bankOffsetA]; + odata[bi + s] = temp[bi + bankOffsetB]; + #else + odata[2 * tid + s] = temp[2 * tid]; + odata[2 * tid + 1 + s] = temp[2 * tid + 1]; + #endif + } + + __global__ void sumWithBlock(int n, int * idata, int * odata, int * aux) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + int bid = blockIdx.x; + if (idx >= n) { + return; + } + + if(bid > 0) { + odata[idx] = idata[idx] + aux[bid]; + } + else { + odata[idx] = idata[idx]; + } + } + + void scan_s(int n, int *odata, int *idata) { + int dSize, dLen, _n, aSize, aLen; + int *dev_idata, *dev_odata; + int *host_aux, *host_aux_sum; + int *dev_aux, *dev_aux_sum; + + _n = ilog2ceil(n); + dLen = 1 << _n; + dSize = dLen * sizeof(int); + + aLen = ((n + BLOCKSIZE - 1) / BLOCKSIZE); + aSize = aLen * sizeof(int); + + dim3 blocksPerGrid((n + BLOCKSIZE - 1) / (BLOCKSIZE)); + dim3 threadsPerBlocks(BLOCKSIZE / 2); + dim3 blocksPerGrid_aux((aLen + BLOCKSIZE - 1) / (BLOCKSIZE)); + dim3 threadsPerBlocks_aux(BLOCKSIZE / 2); + + // Alloc variables + cudaMalloc((void**)&dev_odata, dSize); + cudaMalloc((void**)&dev_idata, dSize); + cudaMalloc((void**)&dev_aux, aSize); + cudaMalloc((void**)&dev_aux_sum, aSize); + cudaMallocHost((void**)&host_aux, aSize); // Use Pin-Memory to ensure the maximum memory speed + cudaMallocHost((void**)&host_aux_sum, aSize); + + cudaMemcpy(dev_idata, idata, dSize, cudaMemcpyHostToDevice); + + timer().startGpuTimer(); + + // Prescan Each Block use GPU + scanWithShareMem << > >(n, dev_idata, dev_odata, dev_aux); + + // Prescan Auxiliary Array use CPU + cudaMemcpy(host_aux, dev_aux, aSize, cudaMemcpyDeviceToHost); + StreamCompaction::CPU::scan_incusive(aLen, host_aux_sum, host_aux); + + // Sum up with Blocks use GPU + cudaMemcpy(dev_aux_sum, host_aux_sum, aSize, cudaMemcpyHostToDevice); + sumWithBlock << > >(n, dev_odata, dev_idata, dev_aux_sum); + + timer().endGpuTimer(); + + cudaMemcpy(odata, dev_idata, n * sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(dev_idata); + cudaFree(dev_odata); + cudaFree(dev_aux); + cudaFree(dev_aux_sum); + cudaFreeHost(host_aux); + cudaFreeHost(host_aux_sum); + } + +#pragma endregion + + +#pragma region PrescanEfficientWithOptimization + __global__ void reduction(const int _d, const int ts, int * idata) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= ts) { + return; + } + + int ai = idx * _d + _d - 1; + int bi = ai - (_d >> 1); + + idata[ai] += idata[bi]; + } + + __global__ void downSweep(const int _d, const int ts, int * idata) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= ts) { + return; + } + + int ai = idx * _d + _d - 1; + int bi = ai - (_d >> 1); + + int t = idata[bi]; + idata[bi] = idata[ai]; + idata[ai] += t; + } + /** * 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(); + + int dSize, dLen, _n; + int *dev_data; + + dim3 threadsPerBlocks(BLOCKSIZE); + + _n = ilog2ceil(n); + dLen = 1 << _n; + dSize = dLen * sizeof(int); + + cudaMalloc((void**)&dev_data, dSize); + cudaMemcpy(dev_data, idata, dSize, cudaMemcpyHostToDevice); + + timer().startGpuTimer(); + + int _d, ts; + for (int d = 0; d < _n; d++) { + ts = 1 << (_n - d - 1); + _d = 1 << (d + 1); + + dim3 blocksPerGrid((ts + BLOCKSIZE - 1) / BLOCKSIZE); + reduction<<>>(_d, ts, dev_data); + } + + cudaMemset(dev_data + dLen - 1, 0, sizeof(int)); + + for (int d = _n - 1; d > -1; d--) { + ts = 1 << (_n - d - 1); + _d = 1 << (d + 1); + + dim3 blocksPerGrid((ts + BLOCKSIZE - 1) / BLOCKSIZE); + downSweep<<>>(_d, ts, dev_data); + } + + timer().endGpuTimer(); + + cudaMemcpy(odata, dev_data, n * sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(dev_data); } - /** - * 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. - */ + void scan_dev(int len, int _n, int *data) { + int _d, ts; + dim3 threadsPerBlocks(BLOCKSIZE); + + for (int d = 0; d < _n; d++) { + ts = 1 << (_n - d - 1); + _d = 1 << (d + 1); + + dim3 blocksPerGrid((ts + BLOCKSIZE - 1) / BLOCKSIZE); + reduction << > >(_d, ts, data); + } + + cudaMemset(data + len - 1, 0, sizeof(int)); + + for (int d = _n - 1; d > -1; d--) { + ts = 1 << (_n - d - 1); + _d = 1 << (d + 1); + + dim3 blocksPerGrid((ts + BLOCKSIZE - 1) / BLOCKSIZE); + downSweep << > >(_d, ts, data); + } + } + +#pragma endregion + + +#pragma region PrescanEfficient + __global__ void reduction0(const int _d, const int n, int * idata) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= n || (idx % _d)) { + return; + } + + idata[idx + _d - 1] += idata[idx + (_d >> 1) - 1]; + } + + __global__ void downSweep0(const int _d, const int n, int * idata) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= n || (idx % _d)) { + return; + } + + int t = idata[idx + (_d >> 1) - 1]; + idata[idx + (_d >> 1) - 1] = idata[idx + _d - 1]; + idata[idx + _d - 1] += t; + } + + void scan0(int n, int *odata, const int *idata) { + + int dSize, dLen, _n; + int *dev_data; + + dim3 threadsPerBlocks(BLOCKSIZE); + + _n = ilog2ceil(n); + dLen = 1 << _n; + dSize = dLen * sizeof(int); + + cudaMalloc((void**)&dev_data, dSize); + cudaMemcpy(dev_data, idata, dSize, cudaMemcpyHostToDevice); + + timer().startGpuTimer(); + + int _d; + for (int d = 0; d < _n; d++) { + _d = 1 << (d + 1); + + dim3 blocksPerGrid((dLen + BLOCKSIZE - 1) / BLOCKSIZE); + reduction0 << > >(_d, n, dev_data); + } + + cudaMemset(dev_data + dLen - 1, 0, sizeof(int)); + + for (int d = _n - 1; d > -1; d--) { + _d = 1 << (d + 1); + + dim3 blocksPerGrid((dLen + BLOCKSIZE - 1) / BLOCKSIZE); + downSweep0 << > >(_d, n, dev_data); + } + + timer().endGpuTimer(); + + cudaMemcpy(odata, dev_data, n * sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(dev_data); + } + +#pragma endregion + + +#pragma region Compaction + int compact(int n, int *odata, const int *idata) { - timer().startGpuTimer(); - // TODO + + int _n = ilog2ceil(n); + int len = 1 << _n; + int bsize = len * sizeof(int); + int nsize = n * sizeof(int); + + int *dev_in, *dev_out, *dev_bools, *dev_indices; + + cudaMalloc((void**)&dev_in, nsize); + cudaMalloc((void**)&dev_out, nsize); + cudaMalloc((void**)&dev_bools, bsize); + cudaMalloc((void**)&dev_indices, bsize); + + cudaMemcpy(dev_in, idata, nsize, cudaMemcpyHostToDevice); + + cudaMemset(dev_bools, 0, bsize); + + dim3 blocksPerGrid((len + BLOCKSIZE - 1) / (BLOCKSIZE)); + dim3 threadsPerBlocks(BLOCKSIZE); + + scan_timing = 0; + timer().startGpuTimer(); + + // 1 + Common::kernMapToBoolean << > > (n, dev_bools, dev_in); + + // 2 + cudaMemcpy(dev_indices, dev_bools, n * sizeof(int), cudaMemcpyDeviceToDevice); + scan_dev(len, _n, dev_indices); + + // 3 + Common::kernScatter << > >(n, dev_out, dev_in, dev_bools, dev_indices); + timer().endGpuTimer(); - return -1; + scan_timing = 1; + + + int *test; + test = (int *)malloc(n * sizeof(int)); + cudaMemcpy(test, dev_out, n * sizeof(int), cudaMemcpyDeviceToHost); + for (int i = 0; i < n; i++) { + //printf("%i\n", test[i]); + } + + // 4 + int s; + cudaMemcpy(&s, dev_indices + n - 1, sizeof(int), cudaMemcpyDeviceToHost); + s = idata[n - 1] ? s + 1 : s; + + cudaMemcpy(odata, dev_out, s * sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(dev_in); + cudaFree(dev_out); + cudaFree(dev_bools); + cudaFree(dev_indices); + + return s; } + +#pragma endregion + } } diff --git a/stream_compaction/efficient.h b/stream_compaction/efficient.h index 803cb4f..480a3b5 100644 --- a/stream_compaction/efficient.h +++ b/stream_compaction/efficient.h @@ -6,8 +6,12 @@ namespace StreamCompaction { namespace Efficient { StreamCompaction::Common::PerformanceTimer& timer(); + void scan0(int n, int *odata, const int *idata); + void scan(int n, int *odata, const int *idata); + void scan_s(int n, int *odata, int *idata); + int compact(int n, int *odata, const int *idata); } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 9218f8e..31cd82c 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -3,22 +3,60 @@ #include "common.h" #include "naive.h" +#define BLOCKSIZE 512 + namespace StreamCompaction { namespace Naive { + using StreamCompaction::Common::PerformanceTimer; PerformanceTimer& timer() { static PerformanceTimer timer; return timer; } - // TODO: __global__ + + __global__ void scan(const int n, const int _d, int * idata, int * odata) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= n) { + return; + } + + odata[idx] = idx >= _d ? idata[idx - _d] + idata[idx] : idata[idx]; + + } + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { timer().startGpuTimer(); - // TODO + + int dSize, dLen; + int *dev_idata, *dev_odata; + + dLen = 1 << ilog2ceil(n); + dSize = dLen * sizeof(int); + + dim3 blocksPerGrid((dLen + BLOCKSIZE - 1) / BLOCKSIZE); + dim3 threadsPerBlocks(BLOCKSIZE); + + cudaMalloc((void**)&dev_idata, dSize); + cudaMalloc((void**)&dev_odata, dSize); + + cudaMemcpy(dev_idata, idata, dSize, cudaMemcpyHostToDevice); + + for (int _d = 1; _d < dLen; _d <<= 1) { + scan <<>>(n, _d, dev_idata, dev_odata); + std::swap(dev_idata, dev_odata); + } + + cudaMemcpy(odata + 1, dev_idata, dSize - sizeof(int), cudaMemcpyDeviceToHost); + odata[0] = 0; + + cudaFree(dev_idata); + cudaFree(dev_odata); + timer().endGpuTimer(); } } diff --git a/stream_compaction/radix.cu b/stream_compaction/radix.cu new file mode 100644 index 0000000..23c5272 --- /dev/null +++ b/stream_compaction/radix.cu @@ -0,0 +1,153 @@ + +#include +#include +#include +#include +#include +#include "stream_compaction/common.h" +#include "stream_compaction/efficient.h" +#include "stream_compaction/radix.h" + +typedef int var_t; + +#define blocksize 128 + +namespace StreamCompaction { + namespace Radix { + + using StreamCompaction::Common::PerformanceTimer; + PerformanceTimer& timer() + { + static PerformanceTimer timer; + return timer; + } + + template + T findMax(T* &arr, T n) { + T max = 0; + for (int i = 0; i < n; ++i) { + if (arr[i] > max) { + max = arr[i]; + } + } + return max; + } + + __global__ void getB(const int n, const int t, int *idata, int *odata) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= n) { + return; + } + + odata[idx] = ((idata[idx] >> t) & 1); + } + + __global__ void getE(const int n, const int t, int *bdata, int *edata) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= n) { + return; + } + + edata[idx] = (bdata[idx] ^ 1); + } + + __global__ void getTF(const int n, int *edata, int *fdata, int *odata) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= n) { + return; + } + + odata[idx] = edata[idx] + fdata[idx]; + } + + __global__ void getT(const int n, const int tf, int *fdata, int *odata) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= n) { + return; + } + + odata[idx] = idx - fdata[idx] + tf; + } + + __global__ void getD(const int n, int *bdata, int * tdata, int * fdata, int *odata) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= n) { + return; + } + + odata[idx] = (bdata[idx] ? tdata[idx] : fdata[idx]); + } + + __global__ void refill(const int n, int * d, int * idata, int *odata) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= n) { + return; + } + + odata[d[idx]] = idata[idx]; + } + + //template + void sort(int n, int * odata, int * idata) { + + int size; + int *dev_idata, *dev_odata; + int *dev_b, *dev_e, *dev_f, *dev_t, *dev_d; + + size = n * sizeof(int); + + cudaMalloc((void**)&dev_idata, size); + cudaMalloc((void**)&dev_odata, size); + cudaMalloc((void**)&dev_b, size); + cudaMalloc((void**)&dev_e, size); + cudaMalloc((void**)&dev_f, size); + cudaMalloc((void**)&dev_t, size); + cudaMalloc((void**)&dev_d, size); + + cudaMemcpy(dev_idata, idata, size, cudaMemcpyHostToDevice); + + dim3 blocksPerGrid((n + blocksize - 1) / blocksize); + dim3 threadsPerBlock(blocksize); + + int max = findMax(idata, n); + int ndigit = ilog2ceil(max); + + timer().startGpuTimer(); + + for (int i = 0; i < ndigit; i++) { + getB << > >(n, i, dev_idata, dev_b); + + getE << > >(n, i, dev_b, dev_e); + + thrust::device_ptr dev_thrust_e(dev_e); + thrust::device_ptr dev_thrust_f(dev_f); + thrust::exclusive_scan(dev_thrust_e, dev_thrust_e + n, dev_thrust_f); + + int tf, le; + cudaMemcpy(&tf, dev_f + n - 1, sizeof(int), cudaMemcpyDeviceToHost); + cudaMemcpy(&le, dev_e + n - 1, sizeof(int), cudaMemcpyDeviceToHost); + tf += le; + + getT << > >(n, tf, dev_f, dev_t); + + getD << > >(n, dev_b, dev_t, dev_f, dev_d); + + refill << > >(n, dev_d, dev_idata, dev_odata); + std::swap(dev_idata, dev_odata); + } + + timer().endGpuTimer(); + + cudaMemcpy(odata, dev_idata, size, cudaMemcpyDeviceToHost); + + cudaFree(dev_idata); + cudaFree(dev_odata); + cudaFree(dev_e); + cudaFree(dev_f); + cudaFree(dev_b); + cudaFree(dev_t); + cudaFree(dev_d); + } + + } +} \ No newline at end of file diff --git a/stream_compaction/radix.h b/stream_compaction/radix.h new file mode 100644 index 0000000..04b6c3e --- /dev/null +++ b/stream_compaction/radix.h @@ -0,0 +1,14 @@ +#pragma once + +#include "stream_compaction/common.h" + + +namespace StreamCompaction { + namespace Radix { + StreamCompaction::Common::PerformanceTimer& timer(); + + + void sort(int n, int * odata, int * idata); + + } +} \ No newline at end of file diff --git a/stream_compaction/radix_.cu b/stream_compaction/radix_.cu new file mode 100644 index 0000000..e23dbe2 --- /dev/null +++ b/stream_compaction/radix_.cu @@ -0,0 +1,132 @@ +/* +#include +#include +#include +#include +#include +#include "stream_compaction/common.h" +#include "stream_compaction/efficient.h" +#include "stream_compaction/radix.h" + +#define BLOCKSIZE 128 + +typedef int var_t; + +namespace StreamCompaction { + namespace Radix { + + template + T findMax(T *arr, T n) { + T max = 0; + for (int i = 0; i < n; ++i) { + if (arr[i] > max) { + max = arr[i]; + } + } + return max; + } + + __global__ void getB(const int n, const int t, int *idata, int *odata) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= n) { + return; + } + + odata[idx] = ((idata[idx] & (1 << t)) ^ (1 << t)); + } + + __global__ void getE(const int n, int *idata, int *edata) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= n) { + return; + } + + edata[idx] = (idata[idx] ^ 1); + } + + __global__ void getTF(const int n, int *edata, int *fdata, int *odata) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= n) { + return; + } + + odata[idx] = edata[idx] + fdata[idx]; + } + + __global__ void getT(const int n, const int tf, int *fdata, int *odata) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= n) { + return; + } + + odata[idx] = idx - fdata[idx] + tf; + } + + __global__ void getD(const int n, int *bdata, int * tdata, int * fdata, int *odata) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= n) { + return; + } + + odata[idx] = (bdata[idx] ? tdata[idx] : fdata[idx]); + } + + __global__ void refill(const int n, int * d, int * idata, int *odata) { + int idx = threadIdx.x + (blockIdx.x * blockDim.x); + if (idx >= n) { + return; + } + + odata[d[idx]] = idata[idx]; + } + + void sort(int n, int *odata, int *idata) { + + int size; + int *dev_idata, *dev_odata; + int *dev_b, *dev_e, *dev_f, *dev_t, *dev_d; + + size = n * sizeof(int); + + cudaMalloc((void**)&dev_idata, size); + cudaMalloc((void**)&dev_odata, size); + cudaMalloc((void**)&dev_b, size); + cudaMalloc((void**)&dev_e, size); + cudaMalloc((void**)&dev_f, size); + cudaMalloc((void**)&dev_t, size); + cudaMalloc((void**)&dev_d, size); + + dim3 blocksPerGrid((n + BLOCKSIZE - 1) / BLOCKSIZE); + dim3 threadsPerBlock(BLOCKSIZE); + + var_t max = findMax(idata, n); + int ndigit = ilog2ceil(max); + + for (int i = 0; i < ndigit; i++) { + getB<<>>(n, i, dev_b, dev_idata); + + getE<<>>(n, dev_b, dev_e); + + thrust::device_ptr dev_thrust_e(dev_e); + thrust::device_ptr dev_thrust_f(dev_f); + thrust::exclusive_scan(dev_thrust_e, dev_thrust_e + n, dev_thrust_f); + + int tf, le; + cudaMemcpy(&tf, dev_f + n - 1, sizeof(int), cudaMemcpyDeviceToHost); + cudaMemcpy(&le, dev_e + n - 1, sizeof(int), cudaMemcpyDeviceToHost); + tf += le; + + getT << > >(n, tf, dev_f, dev_t); + + getD << > >(n, dev_b, dev_t, dev_f, dev_d); + + refill(n, dev_d, dev_idata, dev_odata); + std::swap(dev_idata, dev_odata); + } + + cudaMemcpy(odata, dev_idata, size, cudaMemcpyDeviceToHost); + + } + + } +}*/ \ No newline at end of file diff --git a/stream_compaction/radix_.h b/stream_compaction/radix_.h new file mode 100644 index 0000000..e9840ab --- /dev/null +++ b/stream_compaction/radix_.h @@ -0,0 +1,12 @@ +#pragma once + +#include "stream_compaction/common.h" + +namespace StreamCompaction { + namespace Radix{ + StreamCompaction::Common::PerformanceTimer& timer(); + + void sort(int n, int *odata, int *idata); + +} +} \ No newline at end of file diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 36b732d..3bfb425 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -18,11 +18,25 @@ namespace StreamCompaction { * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { - timer().startGpuTimer(); + + int *dev_data; + cudaMalloc((void**)&dev_data, n * sizeof(int)); + + thrust::device_vector dev_thrust_idata(idata, idata + n); + thrust::device_vector dev_thrust_odata(odata, odata + n); + + timer().startGpuTimer(); + + thrust::exclusive_scan(dev_thrust_idata.begin(), dev_thrust_idata.end(), dev_thrust_odata.begin()); + thrust::copy(dev_thrust_odata.begin(), dev_thrust_odata.end(), dev_data); + + timer().endGpuTimer(); + + cudaMemcpy(odata, dev_data, n * sizeof(int), cudaMemcpyDeviceToHost); + // 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(); } } } From 88961b8ca5c96b8acaa32968862de03260223923 Mon Sep 17 00:00:00 2001 From: ziyuli Date: Mon, 18 Sep 2017 21:36:39 -0400 Subject: [PATCH 2/3] Update README, Remove Redundant Files --- README.md | 41 ++++++++++ img/compact.PNG | Bin 0 -> 13632 bytes img/compaction_2.PNG | Bin 36271 -> 29022 bytes img/radix_c.PNG | Bin 0 -> 20029 bytes img/radix_result.PNG | Bin 0 -> 6930 bytes img/scan.PNG | Bin 0 -> 24311 bytes src/main.cpp | 11 ++- src/radix.cpp | 0 stream_compaction/efficient.cu | 2 +- stream_compaction/radix_.cu | 132 --------------------------------- stream_compaction/radix_.h | 12 --- 11 files changed, 52 insertions(+), 146 deletions(-) create mode 100644 img/compact.PNG create mode 100644 img/radix_c.PNG create mode 100644 img/radix_result.PNG create mode 100644 img/scan.PNG delete mode 100644 src/radix.cpp delete mode 100644 stream_compaction/radix_.cu delete mode 100644 stream_compaction/radix_.h diff --git a/README.md b/README.md index c642f89..32747f7 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,11 @@ University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 2 * Tested on: Windows 7, i7-3840QM @ 2.8GHz 16GB, Nivida Quadro K4000M 4096MB (Personal Laptop) ## Performance Analysis +#### Efficient Scan without Optimization +This implementation is achieved by reduction and down-sweep in GPU. The performance of this method is much better than naive scan but actually still slow compare to CPU. + +For the benchmark and result, please check **Performance** section + #### Efficient Scan with Optimization To avoid the efficient scan method uses extra non-working threads, simply change the index pattern to perform the kernels. So this optimization can reduce a huge amount of threads to perform useless operations and increase the overall performance. @@ -30,6 +35,20 @@ This implementation is relatively easy to achieve, however using share memory wi For the benchmark and result, please check **Performance** section +#### Radix Sort +One of the most significant application for GPU scan is radix sort which is a sorting algorithm for parallel processors. + +![]() + +To use radix sort function, please call the function below: +```c++ +StreamCompaction::Radix::sort(int n, int *odata, int *idata); +``` +* The first argument is the array size. (input) +* The second argument is sorted array. (output) +* The third argument is unsorted array. (input) + +For the benchmark and result, please check **Performance** section ## Performance #### Scan Performace Measurement and Result @@ -41,6 +60,8 @@ The benchmark also makes a running time comparision between CPU, GPU Naive, GPU ![](img/scan_power_not_2.PNG) +![](img/scan.PNG) + (For the detail result, please check the data in the **benckmark** folder) #### Compact Performace Measurement and Result @@ -50,11 +71,31 @@ The benchmark also makes a running time comparision between CPU without scan, CP ![](img/compaction_2.PNG) +![](img/compact.PNG) (For the detail result, please check the data in the **benckmark** folder) +#### Radix Sort Performance Measurement and Result +The benchmark is performed the radix sort operation under 128 threads per block for array size from 2^4 to 2^24. + +The benchmark makes a running time comparison between CPU 3-part hybrid sort (standard sort function in STL) and GPU radix sort + +![](img/radix_c.PNG) + +![](img/radix_result.PNG) + ## Questions +#### Roughly optimize the block sizes of each of your implementations for minimal run time on your GPU. + +Based on large number (larger than 2^20) benchmark result. The optimize block sizes for each implementation: + +| Methods | Naive | Efficient | Efficient (Optimize) | Efficient (ShareMem) | Thrust | +|:----------:|-------|-----------|----------------------|----------------------|--------| +| Block Size | 1024 | 128 | 128 | 256 | 1024 | + +#### Compare all of these GPU Scan implementations (Naive, Work-Efficient, and Thrust) to the serial CPU version of Scan. Plot a graph of the comparison +For the benchmark and graph, please check **Performance** section diff --git a/img/compact.PNG b/img/compact.PNG new file mode 100644 index 0000000000000000000000000000000000000000..2e70da4da881a1f44ca33a39eafc705311b666f2 GIT binary patch literal 13632 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 TuoDC;$nV#0TE~BD`-lGx`t}66 literal 0 HcmV?d00001 diff --git a/img/compaction_2.PNG b/img/compaction_2.PNG index 3652faf7e22bde12b1d257a88d4190ec675ab8a2..ff64de03d9355d79b9e23fd1f3602fd1874f683d 100644 GIT binary patch literal 29022 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%0DQf_$I+e*d3wJZrx!TnEv(iyq9m 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 E0Kl^}#Q*>R literal 36271 zcmcG02UOF^7p|@=Hqdn~Gyz={RGM_@t0<^6k*c8xp%XeGbaod63jr0Wp@>LtA`og| z1py&aLni_0C6LfV=gkjrcXj`|=biJON0H=&;WsmP?)~m}zdMg^t12=aWI4EN*Di*e zH?G~;wQG<5u3fvw_tSxQ+{(32fd6(o-BG-{E34tuIC$}+`4yEbyLROSA6hfo3tk_v zzj4=T*RI2r(7)X^b}1&icA>A`ymm#?)nIDOILj4(!0+jg&v(V6f4aKg z&o6HudOw4k+vCt*P??@i9o;2XnR@v?8@Q(rz7~czWI&ro%8mmMD`~g+Is8dl}lja&>x0B#(&uQ#^NVs#;tFD z_5Hses_EcKe!VgN!cRYl3kkK{ZDAkz7^%^!l7r}a+i>TGAc{g9h_c`*KB-xgq+8-* z;}BT&gb@|?t3XQ3idg!hl>X~Y<;8u!dH(6VJ8zfWNND5Y(~u* zR=Rc8N=&Db*c%l+>oXBq;|bK4Y2B73m+DrR^w!J|{W=hl0AAHa%3v7vG0TB%$z3yy8 z>C)j{7W*Rje>M){rWrZZhqIt%rtsd&u_j7*pwpIM_2SsuP(@5t-$KJ z7h0fRX75(mFv{0=O-+kBJtFndj+7Vh9y=#_Av;;mob2FL)$Zm*w;;0&0e{6&|PLaciRM)d4dH4PNg*Y`Ocs#OO!IkYqyTiIWN52DHvZ{`| zu18hN&X9XO9l0Xql6AGh^YI&cSw*G`F?C~|+RPrcdv-1V4o!AV1?~MbxuS30Z!AD& z&Ebe$%382TAukbInl13;m(tzMqtkQ>WM_?`8S!iVLUBB$@0#2^Soa)K-u-mxkfN9^(eHI;i31p?`cJ!Ge%j8~q=wE4?xIPh_MHj6wdesvkhezzGn{OB9cHKt)3Pp_+W z_jJ2mGZsvz>Rz{}>&3Hs_uQskEWT@c_(1TmlYh564nC@9(WA>OZCWq?LcEkeU*D}K zZDmzxb=J!5#0zm^-=HYXt#0)FVE*D5^^NLEPk60HmPV-i>Z#!=V@=L9c-Pz-Z!M2hz4Da*>DBN?0I|>Wh0ioxoPQW|kjzzC$NXw=m6h2?Ub9U7 zP)?9mdx8}%)6=MkH_uR_;_WJN*h$mCmh|xe-;o8i7@B?0i!ec(wZ&nl(2E#Fu8ej2})f7-amErTdn*P(VdWOhZUY)ZGs!Y!qUTU#Mrw%ze4;Y!?z zu*Ea&%L@y$9g!P{7iceN0_4PUt;6f&f|*snF8Z2Fz{+0itMxK4=^?aOq( z_3tL^z4Ur4>55#725DEKEhUfGcTHEEVi)^r76oGhvH4Z!IIS44k}h1V{Xo zr&}q-z*k5spXXRQW_r19^zJY{zB}EPy_`Srl3h{RiWG8cf1kIfA5xog+vzAziJ{r` zjM$2nGsFVVOh4VJx{g|EdO6&5x@UP^e*L%s%yNv@(Pt2n22JXEq2WUu+ZHbjAY$mOr~aoJuKUFl1nfNo#<7BSSiudwmBA-QyR?88{9!^ zNlJ4uUGp~8j*13L-X{*+9ek| z^nGf&ZzFuX+8rPCDf)P@X`;MNYLTb#gES@e{EXp7jsARPeR3LXvUArZX%KY$nbv;_ zw|iTsE52(O!$2O97yof1sTxi)d0}Tie;2=A@3+Cu9>#-`T7+o0Nzqz29in>)Gq=la#8w__Ztg7Z`Vsjey?xNp{Ak}>qFYJD-6F+^= zuvdYcPRz5!*h{IGrB26Hu6r?8U}7C5));gVcU_OYIyGE6%=%M#Ty}2C9jc?gw4|9^ zpHR0zh9NzhQqP022qWhC0wgb=0GR`SH!D3cWLn()jJHR2ZnB;j*rS@!gW;jHnHP9? zTV-5j=gM0bQ{xVY$?p9Jf(hxiuQG6Q26y-PWZqqt*G!s@;MW!SmRhSycSGxMDiI0&~mz*dgVD(*+K~(9Cjh zhD8-QX;8O+*D^p47Q2i4n}QvghB2wLVy3zG*WZv8s*59M#832(PG25|?=M%4FD;&F zl0CCwc9zJ0R*xFoAHHx8nrC;GUY1afr(m9nuD_$#d>7cg@B+qrVRd)QEDz5NADHQ> zY4Fh%D~~xce8;awfI8T`I6V7;tZpC|>LQpIvpA>A;=U&O(#NB%K4DnanRm+0^5uEM zWWkE)$4}p=mQ96mW;h`*n#{(M=M4*eit7F5XJdZif$^eTryeZL{VZj!(bkhKU`RWu zRmajUb6rA>$w+^`AWW;sY}aW+aI!AJ(|S#I&F>-k)zGUQRyN($^F!Z(g?O^5n4a)1 zn|%Oi3H!71emI~XAYl+(rl;kh<r&uMF{0e zuKq(zY$)dnM#KW)D<%fMR6{RWF~xN)XCtx>-Y;$$YSnG3_Lmm32%$sUG*v@iI>Aeu zbV5;xB5_7B+dkpYW_yet3T8e&pOUVs^2d1Et|T56HaGBLo0gY33@kk_(csI|8tCPW ziEQ`m8`kyuaAJSldffFu{v~7c`mG-n%1g4I>dvS9afsg@AI3-KT|Uk?CkR1VD}n4E zzB6QUw8V50rf_&*&J17kC^?&q5R{on(+HtY9Dm*%C56g@725ZoB_uXJVHDs8;BCLP zo7N?L%ZU%rl((kUNoRxDnwCX~8P?j9(&~U(tCcIPoRbx=MWFfCqFDRZbj{PpHFRR4 zOj0-mcrjVJ)UZu)Z0W^_ED_|;6;{@~n_%sBR#BcEycEWW$}X(r+D@jG$C_YG%1kO6 zVq`-@#Z+1(2`7Zi8=@-^ck$_ejNb~;fPyl8uwstmGbg@UE zL?hc-?p8#Im`cUq1G*lp4bMkyUhT|#!!8tJm($oE5BaE~-4Xk2CV#~^zszB?KC1LSDKR&@m+eESS^BWWqEVBw`8!!)?_s-Yw85jGDIpd3Dq2dDk6fqJ6v+j+)<~?cmswbko1Z zx%Su8g1P{9#^W36S2@_X_sP+U*8;w^q|ge(x0YF+9m7j@UJR64Uem9VhQ)Waj0TIz z-p+`79Gz$RJf1Q>!PuYh03&8|QI+?~Pd`F`Kek7>!hKnBl%9}}+D3(xcIeOT1~OlyE#&FE^zn!A}sH>LvXXpJuLZpI&2Z^?QmAaSY950`IbL}-{@NUbla;$oXD|z zkLF*YnB*?p3?!{J+8Q^e&v*$vBm(#GTkJOtpPnV1Hu2s`oN*6aSqN6X{#I(?7A?Wg zrgdxHe>x}Drse>b;D%`8`s^IQW4R%sc=0tQV#npn0?d?xf3~u4WjM-_fbJGKkd*!d zIA#)}C-ZX71T%EM{_N01uxEl*j+sh$%s-WK-}F%xgT=jn&%jtrST!IcP9*RA=!O^n zUaIraEhG3zo^23r>)G}T%5{U0i#1D4HaNQ|L6?IhF!&#L zGTF3op}zOA;u+k%_L6(4;G;zrbBh~;lsXRu;@ksPV4g0%VPodS4GPy_pa4|xnvu+DD3WXYME?>M*{)toJUy}rF3 zmCZ}ZrWTX4ehK4)wRbtWw`wKtpnz}qy$Wdp+wb;Fc@oGKgy8w=f)SfZA=qYlQ95a0 zH8#ow>xt+q!-W|A_dr~W)X15VdlJ@8^Y1NDJ&#dDasHkrQ|!igxHTz8DK;o7vn^ex z1l8wN5MsLWU(e;xz{cTJ!+|qan6q+oY#o_?ra@UTEg|)-4?W<|Mb4}tDZQqR5oXrT z&hwtJk#|7E{*EWiI~T0{!X2x?=$V7JP(l4z5uN8otqie!HY>R+ssDNIKqyWq5?w zCQ6|29DXqPsO;QF;VQUaPBij51%!>4Pm&K$6rYAd?v5MW@y@_2Ru=`M%7?gY3*X=o zDn#dJ7*{VZ06v6o*cfz)QoJ1r*7^!cGXyys$KVWIHc?nkY^D&hHJ$&vKA#>QD;z*8 zPCyy9m}0B5H&zF{_yjXptb;N+^h)@wu-m(bjw8Zu#zk&YDB4%}cO~z!h zLddolk;~PWEGI`hAFEho)Ex9d(Zpy&!q(=9{~UyAHp17$)3_{1&O1~J_0}WKs7coe z!3SIQcD@Q{h;Sf1?;r}Nx3`)7*GOD6>0|>pUdfIyE~$37|49k!3<)g7ZG<%DR~>~S zH{wx+qwN{lB!t^e;QfZXQOR<<<7*P#JLj0A^7xc!`zhFyxQA*Myn9?mk4cfDkl3y? z_#OB&fS`5|?*DSYj(Fi5RLu)t6U{T+XvM`-7r8`&>T?nm4~0wT;xi35*IvlLBx2IP z53jkxrE&Dn)gPP^Y4@wv=@tGt22M82A`Y+{(y$&I%Zy1Pu-NDZH+|EsaQ%(oBRnQe zU_P60(6?1L_~?drZB|OxO0Ou4l&0cAIwYVe{?8$tkFIp)S!y^KAJ_^G4;SCR_fMou zYxxLwA-sNuqc%KdB8(7m(StFxBPD%(n+o%S6&!2*Ckj>)3y4voGj7;ew~@$!m`vSX zJx<6~H&yBGL+bxz^YPyZyHYQ?^)&Ob>})DRRCpydM}f1{VYx>=7dejXIg~3J18i9$ zX72k7loaPC@_tp**MvT#S_oE<`7l`FeD1=)qE~(dU*jdqkUif{U6MH5+?mh9nM7n~ znwbd*FH}FC(#6=vtE|;!q0)hH^S|=lNTxCp*>IX!!rF6U{%(Quf=BaB^yUIepd`7y zoD%Cg@Tj{!jN9DC@jD(zBy_ZuC%7o*fgy+!vX2sI8!4_In|@J5YnYLJHb&0T#)L7X z*h2e(YT`|&bZ$E^Pi=qx7LlYrL`mK|pzq8z$X9C<~ zBs{V%!8S$8OU%gw%Vc6pP5W`2u4(Q zAeqbAEvK2an4EF#HgZG!D+@{B8Owcg+eveu>IT^J5mg|{m$&4HlVf8fd;(Un#i22CK%xt~l_VrI`$wW39@08HJ zVnzLOZ!a~@qlYK-?zTQl&U*Vj5S#j9bdni0v0zSGLiSO_U~{rM^R6nB-NY_ev-xy` z>`4{@u1kmO+jV^Ms@F%`c!)8mzCKedrGzS5;5KK5n(WL`^`Dqu(9?PuB>f*-Db&bq zMo!>6!su)C9zvwEGO)^5GmE5Sz)Z-SGtsNdqQS*d)Z%13f=|D=6}Q-Jt?vt;uXtlY zI0OxS&%9Vc0e~w;y-z0v42XAUFF1{Syb#9Io~7S&_a4JH5{~z?$3s};e8O2*r@~7< zwvP$O8J6ZE7suio+T)&=RF^EWInAA%iZH>JiPG+hZwBLK1z{oRuz_ca><-ywD``?r zBg)*B^R@bz@!L9gqh4zzDVg0Gx#iCzqQBzNU-6)-&l_X#E$fX?^fiojUGz5|dIt=v zRwy%c5B-h@@8i$-i|-7J?K#| ze^>)roOUC^^B9k*~g3FRwz{@lb~{ss3KDP(D`Vl+{Nz02u?zFXr5w}gd00sYak zlKY7zi(&hU1H&j%I@tzOvTM_o4ZU&CVKI(%8enE7?Gaf`CiO8=1<8u^g8wtEIHgF1 zqe(Qvz_WL6yIMT-+~d+Gq+tN~_6Bg1>?qyiWwVtF54u(`9GS?z@&N}FA(MuT7lfytDW$*n6G%5FX1`#Vs-tw z{%C!B-)0R9jpGo9!xK9y`zd(s^K-Ug8=W<2KB}3H6+=IYjD7 zrvy`U&e0{-<9l2Rd2D+IHbxZVqB1vU2<9Y#&FMEK>kTC(AHx)WXj&-fT%{53-h(%5@xODJ)PD%`?rt_+_TqNX!LhD>* z#p<*l-ktfHydO^QpZtTmV08^~X^vLZY+c@FgB|h8at&8H#-d28zkC=SR8kU0oGM$M zV>|@h)PBa^LJ=z{rZN|J&?pw{#v{+9GAGB=Slx?TTA%%U9vP>qPQh3yXjKcnk2wot zCq}tNPFB9!N+#;i`-s=edo=^EEtT{8)aiTV%KRM9vFOD`|3nOTM=|z$f!55oI!cZV zve20WXhzRwHlNue`o~zF7&V!Z7Ud}bk=%*M^wED)L3%T`k<#Vf|A4W9YN!Z>(DA3+ zFzGjzpd;)8XSX=Yhc)jvWNg=F(n})XQLjV;lf=q1RV%aLi$Hv95 zXr5ryXIGZ*arP?1DmYLQSYwHYBfmhn;$`yxBo@t#sX=PoB4Q(*0B>bos?iSWp6o__ z)ORPj(AqdM9pqNBYhG2B$xZ*cr|LsTvT7AsR}th6Nr%6O2=gv9)^L)iB(PcQW`gk! z0#1nG*Y&-7xQV9XHUcA^#gh|?#LR-40I!ax)MT|d%H)aUpxL3<=nogZ8}}+>6{*H2 zsMdUI_ke*b6P?usdDomjT)`YU>@$>AYW{vb7#}M<+Ig?cv&e&-SwM^wZlgD4Td2E& zdHUD6{jJZ11e(PIWd*luQ2e~s`#T?&072iV2W=yjX zA8_jKJR8cY=kc5`oIXJ;Sv3x+q*Fe+G4o_+7NCjn2&<$LY@BL`19{1 z6J}4{+`V+tFBVzlTGs3?m~Pw}W{$E-8sUT0A3$FRLud^~es74RKDVTaHpw+|`2=7X z6l}W@#1(7_Wik1c6N2Q>c&A`FREMWNCsYIHNGSX_Stdv?i0N&cooT@q5E)R?M?n_S zUc&C&Xh*C&1>-}1lLQo|cT1Yf(q(VW9iFo&G_7FQz{&=;jvooS6&(vD5)Z-&!y@TOM(e)!XE~`g^uG6^9 z48MKWuM9~zxn@hb)6VIeS+7O;ocH(3_KgR(Q@fPD=nR`3rCc>oW zlB8zT-GefXWJgchWQ2V9PEASUTqDF&gTjo{c0B^5!)jS2nXavGR9J$8f{M+xGo4Vq zNVV{;;^lS^qCggGJl54HP6`lD=D{KomYj}FoxWneyT3tb*K4||;$|aQOD3|pBl#ZC zH8x4>#fn*!+V#oO#s<~Eepls-%YE|pUcX2q;`fmN$0q5a$;oZ={9fgKkTBKE3} zCHYs(yWhUS(k4aMu>9aXSzyTTj^p)L84Tf8E6#)!6njuSUT&>#+@^O?$y%6-?J7kr zz$@+mnEy(m!-*!dOW&$CNW|4J{a`?KfC6-thyDfs>u_B5!rGjGr=#2nA477$=0e13 zwub=<;B0)Fs>%&nBou+9DQ-|Ky9ijNPo=_cGJ^=>cjt{GeS~@e)P;9dYv=U(Xx8)i1eG+ zc#CCP{zk_iNJ;}YAhozvQHv8?$&!zvXJ4XKzLR#wsU!C<8Pr}GTn7&bv5p>;N9Ebb zajoDYpQ3^5P)Z*<(peX;dPZXS`(@CnGoKVUosDvAljze7HjY-*uzO_SEiTNLwU_hj z_HWR%FeHGz+@s*uw~=o@TmYf<+n77|?qI6_Zyeg_U^b}{ETU_G-Swr%2UL|^w&4W- zN)>_P(Sbmcv1-}->~!-ZA4`6BlEOTqS(krYdt*7tai(?sb{BMJ@tbcxdaar_7As}< zPymV8+hy%ej}g<_3i;o8E|tMxl+AgC)AaRW10Q1g1QdAbnd#8U?tV?>*$cGIoN9kx!!`L zR4faepdubclSPg>)&chDo9V1dk7#V|Pty`sdJ9J@1PtFccn!W~ploQZa-kI>;4u@Y zlR-5PN~!)g7n65)F!J#3xF=#@>lE4DfI(fTP~2~dEn68JeR2~GpF<4a;Z|dv``esM ziainCd8wCkwyTL*5ln8i=w4U#@UE7hrtdNKaMxV6|MXkW8zbKmfP@mv$Wfn;UIom+ znmrC?ziMquE30hw{PCImw_Na`Z4%25Wjb_;DicR5N+@MDe1(+$x!|8xB0TV9+m14L z4852{jNMjY^*i&rItZeRA}dFPBQW&wWHAl&RactKk;0-5X@`xYS2>)ryc3iA`4M}?}+q##A>j$c8rf-Qw_*1hGI#x zM%+qB$NwHu8{H^(OIHXssI!T~bgnp?r$;uw7E4v!PsPy;Xk(8@iE3Frmuf98l!@9U zz_5#6sFBGc)ui4Jb0G z@|(ihQnzJH^U(tyXLM}LZmE8M_FU*p#RH<_GhI0}N!V~QTH%bc%+*52;ajwcAbm=j zhr;8d`{i>J8_Nyf;@M>H1V?^U!TiS~GKr|l+*+FXu+pF%_e?&fHGQE$ih7pgj9$4n z&V#n@TNQn8qV`~Ym~rnbHVW>Dnv0NFx}d6wPG2M#X`Ww6@{`MIi7GNtiHWU2jN1-a!i;^CE23Qe}Kvu z-?ptK+ZSb0>Q|dV76{>myk)Taz#-M-;HiEjpOvty;P!U3jsGPt{+n+8t2&|GIKdFQmp6{Bw0mf@(rS0_6dt!Fjr}hXC6U)a0gIrnmS2%kqu(E!k z4WK{UD57{Sqt2P^ytXuBY;whV*7!lYC94fgfr_vkdKb~vGWY;s2r@!KX5zArycg;0 zUx6)BE11!^n2S*TrJ`uPA;kT~^oO!%4cfv9;gYH0w{Th$`Hv%cAGnu@+4btpdxtiE zVq|f+B=)O6JEvxFc<*?cuVh2p8v}8TzaIO4XOSzR$#n^SUOf0Br>a#Q_X-6nyecrP zx6hqYH2RoUR6)y=7J{`mQH5ZjgyOgX^k@xQ5YmTg65COQj^(kI8PCad?Mz206lGGv z`O5n+8VmFRmzOG%fRqx!?y;F<3X|rvo3y7&&nlwEbT<2H{mG1*90jOaJ7PnJp-j0A z!BpL@O+!t_^zg%Y*P&;Mk5NS;r#yKZ)3eL_ZFOfKua*mVfKuRkeQ%8TnhWH}2_bM22N z7eqS3l*2}P4<491CF9Tyh^iRl2pS**g)#|Zf>9|Q&b6t$|KZ(1hUEV!{n_n%b z*@N+WSj1gHJx?awPqOz4EeS~j?|+73WpgqU2M^a}S?SF~A;1ftI|W--6c=;1Qz>9TJO`V(hb z*0di#IK-$bq`xxRVOb*P`!C%OCUT@X!4H(CUxBi%`5%K9O`G3LxhpDBjjEKxjxY<# z7%w#|av&F#=jyT?XdxH_ve3PQ^|*WoMVkGLR_%E7sOHJPqWf9P;;ixwcX6TTu{~GG z`TCe=!MZ{9~nYFyh^vu>wN{rC=uZ%l4cy@SEX(T7a1^yDt5|5d-_2%{ce?%AzHDs{dfEWK;^aNOkty~JWln*pZ4)eVn zTHY@%`3pQ@-$N|0i-XV&?5)YoR$znktHnq%vB$1lU)gaoGELPxh|l^e927fi=zHw5 z>hf|_e?Z$niLj=azWeK@gxJg?r_oteo!};25F7rM2G*aR^(=Or{=Ctb>NdMJ(45T)NKwbq(Ckl)knXEoD@nf=D zSA%y?tY@_T%5;!~ADg)L$=qw`%-um60UAKSfw;Tn zkrtby4d7o%U{A^&jf2YIBoK(4z}$|Yfe)7k`Sq`GjF=VSY^X{& z`-K;^cLc)s5!zTqPC~lQzjR>)6ZXi|5bKjCMlOoLgbZsq%IjjJx^QY~(j4APMuJCY zKvgk;PAR_6e%(BWU9k1`wD1)tgyq%2&Qmb=yxYfE$m*4;7K0LY@R%Q2dh*mUT;rCf z85W!$jHy?4{SV5mZmV7{QCg6zC2kZ8fdMF~LbHk&2e7-Jw|aX#Dnr-F0w_AunYz7_ zkS(jaEI)FJ)wGxE6(urBCxlC29p!Wg@o41F76^iZP1I{{f+!3!bEz$1g}MyjF{c!= zS6#xpSk?&-s!lWKcvUd5vO3w7&iH!(FHc;j^>K*aJqWyBRGq@=d&dP9cMfuz$G|a` z#${5NvF=i*_m5ZRQ^mKn^)lemb7d!?YaX&UlkEp$qQlQk6N>jq!KZ$FUGA`GcZu} zY~GVpL$^@aubeaCJdhxq)U`sX2qzuNR*`jKZO{q?xho_|hBU~jh+@#NraSKf%3Y{C zAL&4Xb?GS`bW}ZARtu!bF2wmg1^q|*oYY85JhVTj3a+6wdFL@JV+p}0H-Arm6xioB z8q-bpXT-&w0t#D9>yi|J_P^2p!Bp`frY=dz*KFFg|Kq=-1AO?|ndgGtZ%vRh6Iv>Og=Hy`kE`|^k-j~d@J_JT zdv&TJqux()LR3sv{bM4se=Yo#*;Yj_CLORD|5&V%#yCSD2XLJkxGBi`b+Hqab68Z@ zJ9FSwtLpA*xBPGU-m^IVYb0mA-MNIyuZyq8gumf& zs@+uKER6CACxg1KT{YP%Z$ijl_*JO41AU34-uI*S!Tb)Stb6eup}zA|Br za53EcwKmgNcXB+J9Shv691BdF8=pMeFZxS7#}D2ENl%F5G6JYucEab;rdSaO?XC|t z8bo8eW`~?f5C5@bH>0x1+2y_Hz(8l&s%8&^?yP!90XYxJZeQIxb=m&Ush)yH06R*U zHr7IQ3@&)fw`bfPgrqFS_aE)!@O+b8vz)~0-gwL3X1FfYwk=Jo>f!GfpC~YBc4;bv zYMI7%mQx6P3ah&}uO`K-BR{{8r72-@D%!$*YHf!*tSDCnb>O&w-_x!I&1c z`l7)&#OBxupd}6Y*#3t=G0<)CaLG{~c*pRl=w%!T#G5HO*;yXuSMenJlLZt&VhrhW zA$_x^d+BZ5T_N`P@s`mpp{O%o)LpvMa(rG>E04%IQ_DBKXKwUaXXCWju;b5U`&bh< zbpx5>BstAqwH|7F@+c}xOh|*fgZJV`Eejxp-`0FNy1QXyM|)6e*C1)bT4{-Qm#w(> zKaI11hRO|4aQ^T3Y$aL4$K%h5JRHTto8U#L~rpx&+7CYnHk$p{S>$ z<6jAE&P&`-I1!cBk>yoGEWIwJoQqt#feI#`77c>n7SsUnzv_VXFGbkj@Apb|1z9g~ zFj&rDUSWJGs`6Iwe5#&1#{{TLU3W`YT_H2ScY|cTwgdi$0Od(n8?mLaXs#v7K#;`IEp z6WfWFq{C@L>eL+q4dPIw@@=l?sL0_p9st;UP{TAblO`+O)z!jPAej%^KY&mg1N88a zsQd5a6_9XfaT%jAFRsW#91}Uum=9J4JC4flQT%XrdD{1e-x*=fxuFCO&iRE|15MS@ zG!D~o)2D%YdCwxBr#>&b$eOhmRjOVK)O4vK$^V!Sgz^wqN927iT;~(SSa0LJ#zy41 z!=R&Pv7d6O*Na9ncBNbrag}HCwwSpj^3j!vW#|g^(1ZB?n#w|mF&i<_eHCuh0PjAg z2*kKY>wh@eyqR3Rp1)nR=0in5+^#eJvcWnhPFeSl&Sg0wxwA#*A}T|*72niBHu z`zwqimJab3zRZ2EvQkq24|qG#u8TWubmXb>b9awc*ei_J=K1If+Jr^KwD-aYy%W8o zUzt#mfsb%}w0SX*mEFQivzUCM22I z+0*BBN#ubi0{rZP^9o9GW%tDXiU{>@MwuVcA!POnjK=Rd@7IA8Iy`I? zV0uw4_~l~*aG^Bg+7EOh+*N-=DcN8S`>S#59#@0}C-$~n%NM$BMHNz?;G30E^zKcR z^hf~<7o}r$(XrJvX-gn8|D03wM)i9#SqfGkSe!Q#!lDLLiYu882mjH{1(4L5lpf27 zc;F6BPpt1AG6_q&Cg+}VErzA>IQT4DCG^w;E(%zd-h>DNs4Ul83J>nIeu1hLlseUi z_4k7-44{^;sJaApM&<{X)}&QsMQ)~Zn7j+%c+e2Q@s?Nvvc3jP!rPm(&33t(=N!l5 zf6nb+!SGukgn7H?g>F>8Bx@FQ&5C3?2<&v7KrZ~IDIw8-U*)MZD**WM7>gKPhN-I%*>3rKRQu&23jY7IU zM#|i?@9^>Bs`<0~U-d>X$qZG;t%OKzlM5d^I^XWyR+O+_8xyS9TTp&d6b9t{xCnC| zEC;Ca$2^k)Nz_J-K2Co)f??Z3Aj8fT7=0k`k382mH|+7gRVm5crnj^xB|-T))o2c9 z=kBK_qegEYyOp!59P5Vm-MhmwEjCkC3HqX6 zM5JU}Sx?FyPEnlHq~l-}LtNgx9Pd+lJLHjv{Ojq;uz;ho#VJivdVi3)puRaMM6{-= z{Ots?CAGW)FF`f3e_E`_Q~#0tNHo~6);8U4G5VquCCnB(3b_c$+0Vz{-ha(bP+3Ovmt=vTcT99#v=M6h0!Q%` z6;bQS=CgJYMH!l}(?-RZNwOHJj$TZD`w(#FP$v7?6wM|s=}WmxT1-83MPBa#W~^#> zcE?&ZM1$MXhv8{ggwk&7#5hK^>b5@P{&EDN#POD0yK>ojzanXF4&Pj~^7=WUeEGRl z*?^UJ&S+Z$yD&Tn>F%*PbMIpq_rGQr+2Xux)L&^dQ2B2tY`i6}0D91>UCbLXnO8c- z7i1I~L31AD%lv8%@qFDaHshAIXceqZKi(&yUtV-|d{W%|Sq|iI{h{Yn?+! zM-IZpzM9O&3xmG4v|AxaN#sfftawF+mg&X{)SjQQ9ct;r&@8rJFVu32U;r&&-Sqyq zlJJk82$U7(YW)>Hwi?6g5ui9|0Cgp$$Aae)QBMX%-jW{e(!nx^E`N}vo8C*dF{URM z-D=)qf1s8yX8KIm(n}(LwEsk#2qmnT;=_<(n)|-UFLKof({T5WB?L%%D91^XUmNf& z7_5`j48}l^ow}3V@hG^#dGVnzVl?gG7VEM-<4f~N)<9)yJ2OyK)hDEx^Sj)dqs^1? zl|V7E&n;<@d@O3C`k8up&8xZqo@9bUgTT(Shxd-QB=~DF`GcJCp93b2&-!!e)Zt(k zLLQDsDgRBx=jjhdmZpnZ*ob7T4i``!s#;_mJ*ZXpyG^UB@n-Bjh0~{AhyejHO0H-;AIMyrh%i=EpbK^~hS<>dQY7dK)Tz3Y z`bY5l+Vo&ge4i1g1c{4hx={I6V!P58-f;*xdua2!NE!Nw7W+u7WY(|q6ckYnmW^8x z`Yr?)+R}v8ud4m=ewjb5_2(49Yk;lPlzGxpL3j7QY3i(zQ(A z|Dq02nE~~09+Ved!8bxe4j6xId+EJ1Dpm=<3xs8Q$w|iN(0wdid{@u_nmyjs{cU5Pi~53LVSq*FR$QdeQ)&S$q|(GOa( zA0JZ!?8Oi(OP!Zz6$b=ffn6nZc;nIK#gfH_hjTVRMU*Ve=uK!}yEP)VsBaeP?3I%|DS z{?el*(Cq>z12sexkZ49voP`j?*8w<_4~9M7@A3GOKJLm6dI?PW}#6B;dmt5tp<%&yGA<)6rx;; z6p%v*ioC4u&bMwnlF|I-3J_e-a=q)%F@^mVwz>JAo>1QBiXZp2(51hFY4xk_D=|xl z6|CPj$M-Us#27G%#z~(_w!8B&wz&)V#u5M$ zLxCvliUnt`s9kdqI5A5z4B01-u{Zi%X}$23X#j$$TApef3jdpCet+K>^vK#yE>cmE zeDyd{mp(NTP@y%i)3G($dGxK1GW5JM0}E1)U z&=~-^1~_3r{V`940{s`1P*NWYIfj?PPjDr@9PBn+eA7wrw`yg}tE`ckP#k&-@iMWW z0RuoL+dOs$0LBS|tkYDd3$DpeK$aNU)I?z!Sf5@KaE{Cb8fh(h296%Pr}1Y<9I)~Z zuhF!6P(z)wUEkOcCsMou5>}zw(!zDfW^$RoAav=`)lr?U1YcVqvZ4sVq9zL?It%6b zk&;e}(NI&&YVtBG&>@Aeae(4hE;1^*A>?y{w@pNYNSk=`+4bd|s~ovswor?t&ZOG# z9E59$!G!K}*m%CYWOBwgi;xP0=!2}XTR}6tYo*$hm1x7$n+i3-#c+S-7`B<)+80T9 zxvRR~8BH~RX9ZipM#W-nhSiz~wSa(!?py-8YYK6^(1BSq#snLd<=yCIZGdVF6Nf3P zMN<$Y)_)CsAed46OU@Q)m2u@##v`<-YqjPvR$7TFx2z;QijS`ZUIinFK@jDunZGtC zhzbcgZZubP3E71MogrNdXaygW;c~ITa*G*YPnSGG(>P8!i3|7;yw;PUt+Lx#yN;rT zl#t?^XU59Fo?P4HL_y^DVU?$PL0!9K{&~>?UCfrG4!WA)Sb^RtAn=_o?0AI6WQDkA z&ZoR&XXeH5;cD_hji)NXKUT7i;2h(gxI;4hWs6F5*4TMO=;v&63ofX%NxO^O-UI)j zT&3{Kyu&<2i5R)Z&Sh}|oiy?Koq))|O9l48NItY?%F#pkR`po#xa8C?Hyvb}QNrdy zkSt)7F!{q5s3BE4#65S!i{I+4=a_yL!J`1V7|o9CxB&Ra<{VS3H1b6@swf*CINuYeX9oHbS(?7rkgXwS0k4z;mUf&q*07fE`LgQJXEZRq&{bem|1yI1)< ziAtYyST-zdhK&}^h@y_;?lyZezu#$?#sLMD_jG^`5!5S!DT*Kt(kl+BHYQnP4>KEn z*$n7jOTd@h)wa`qe8n=?Z8V}}zPPY!1^C%w9TzkT3zoLk`gXVOPO<_Z*iLD$*7Zfe zmkWvMN>LG@nx%^4%P~mM?5^tHJC-cQvUD~0zyvAdZF39!0q85ThoRWV5Hi9*(;=6i zdUYpv`O6iB)1Q>DZlq^<0$q;)#kUKik+yd2?=9@85>;aXVnQ$$o7?iGHBh^hJ7^BB z!mgiJ({jA{B*SShMFTgMaLnq4D+2?^ zb5LjAuGB-w{4WE4a%Rx{FuDr5lLWkvavGWLt*~fYu+`3D;n=SCZ#AYkNAmFzByEmy zhC7}6Ur+Oxfie3FXKj;8&@|&|!-W1Kj$Zex_MwF^0$G%MNh=u%Dm5`O1N19;4}d1& zOOFLochRlt^V1oCZBBwB>ha2w8qmbmW{860eaO`XGO$w2i5?%_tH)Rb3fJ?2SpMs> z{r*>^t-PDA`Mlh{4^L-s>VMx5VwPK-8k-6Fk_Uj7p@2#kUFHnL)cza&#>_#I?`>ZA z??_iCU&Z5E`bOM>7rGoo%+f5OS|c)3c(w05memC<8qlt0>z)aWQ-s!D&6W_u=V9KN z|L8OB-EsKc!HjheE$q?%EOUZeRMM=l(v@jBBb_Vn@~cNEP|>dQ;NHom}>BUopF?H!<8o z)ch;@7@?D0EccK}`kBp-k_%&k&0SaPuV+gBWE zMDa6cf;{nr58iWZ?p(Ou9r`3e7~rn|QhE{?aJdkQOE9wrppG$wrDl;e>2s4mc(Z|u zEld_GVc3bu32 zkC=AlqR$nBB=o<+fv5XRl9y^yToFHjk243o%%5*QQ6ZR)F9=o`wd$H#QTVbI>%){I z+{-5JGXYJoSo_VLt6g@~f>7y3f#;-qw)H>rbP=tv@v>Y|WfnXF5(5$tsiR8t8Zqub zWw4W6K^HukT~f9z-bD~Sv2*2$3duBbd>3=&%NcMt1;DRVd&^IO_E+J8^vI~g;9`r< z5(LD*)bv0CnCEZ@estv7RvnlJ!>87O1pUU}`x&z&iPl`CbFHZ`2vVShk~Pl0(RTTg z6;^~AHqs|~*&BeiXyU|+okAkGa|zsvBh2(=|8f#$kXXw}SsK(SYBuyPI|&TqI%|Dg zqFdgE<%R+Q!6y5B3jh^BR52jTphSO*LinVm4fY-{?wl*tAOTN)^Hp9f=t)sExZf$KJFxukYlgE|K;T+s-926LgpJ1V%7v+W@UrwFvB< zOU>f~=wgS;w0ccQqP=r17sSAPskz5!1_5|e#QCI*V2Yi$=&wZ0~(8AyfC0FGrx)a8$n?%)j*UYbSYDS z&*o6>$R|munJeaaTgMIsUqg%cSJ2W-!Z4Q9+nguEQelIU|N1rP@q2~#@vu@?hna#v z0!T)ll*?z>to7Xs{+rf8J4Q<(i7~E=bmAbniH6$s(>Q+~NmHpqSW@`#2)Bur!oz>Z zqisSfUQmBHmdA@!u_6hFFKebh{@(H!eF=KA;Se1dw9UQA8-mhT4N4 zT4F)#dux}F3fpk43TCH5LTF3?gU5FKHtBPBB!3u}~ zP<9N9>Bhdw)j~Qpj{xEDNi#B!oF33Qm7(g}>&);Pia5vS>X7dp7+HCo4$xns|&DPf4{DY*7I;;pK^$LYxhB-xzcg9Gwl_o?u26L=QIe5-dkI z-zv1H$jQ7h{?ISj(hdk8{}||l3{z&e%}jS9yaE!1;5>$(X&*H z@fhTy^$Elv@{VsdQpJiD<2*!*4ck%@418OvA4BW0BgaHfS)_{<35z5t?J-goeOj&A z(?k%B1RsDDlc~>>nVwC*bDKH(f4ckbuqLlCUahT)2xw7R0$M72%aAP~pk<269zsMJ z0vbSeXv@!%k10;#y+tERl=dNUI6Kyu>!O8Aos3_nf`B^>g&dB?8vs&Hw!%Sf?(P0FO~ zbxu=Y$3~wS2oRuiL&BOonI6t|)B|$(VSt8$%832qeJn{>90kP3h(`rjw|<+&>y68N;6}M!p##~)oHjIl1j#hn_+FHQFe#{eN8&Zipu78FcEdC@;8*iQawK+$ny3>R2~z3z0TK3YyC@#q7|tvCbz z%(M`IMRc#gZC4Rw_Jw9-_+=!qx4bWsx~fFyN=FrJ!008NlwkB;$TuXj@^7wDZS8KxKgC8_(Tr!l_K;43)h)!CdK<7>y}J%kzfc$TZ3d4E(0ZWAZ(R$d*op z`QUhs;1m*RDxzNPKxXksGNm1Fkh=iNpBI6dZ`l+4TZB&z$N;Hwwy z*kxvxQVX)Nogxj7Zx+$l&9;&uWL)*xJFQf;34NE6)0B>Cixji`pzZ$hEqC39MCMiS zfl+|R6eu7k>cv`PdxtmYr`JlBbe3xRH_PE&hUlc1u|)jvYvZDeU3yv?(X2dG)RDWx z64SgkNKrP>k zJ@Y25!ciG91*5ElvFy7bdjW(H=eVRCBQ>}AVba-n+x_Xz;ei{Sk<^d=Qaf+HxgvC> z%s|;cIJvh5S&D0BzZ$7_YU2SN8VPo()Qao@kgEWsLzJmF{g(seR*CGhI`0@$rtHm? z(^B_C`H%F>PDvrXR&YW1CZ3mr`Y-EL(_lwJch|lEvKC+`;TrWwlz0Dqh(LFM8ogbh zmu!KBFY8HVJm+Vt818(3n#0f2i0t6BE?ufM24O}Zrx{$r-l~Z})CxI2KQu{%lJO(a z>@&mOFG?xRi2&Q!^B?p0(Q#OWsY4aGOzHs7j<=cQLmpQe`HwL>l{P_|Zi$z-dc|In z^(oP6{!)Mz3gw-He<}^%FmzX(FbG&ol5$1LWg0*Vz^_JyTXoEBemChE9lH#by-T@J z%gI0|(yr)wviofCao0|>Y+{F({}9L)1)DDdZv2({D@|80S6c1M^tlYbF(Lgn+9|c> zS~7lG`CF}tR7{qUJ8lkLB&pwkguGfRRB~d@kdNS>G5^mmd^S1qZUDkPx_SF5!6vx zGgXN93zOUrX)oE+zS%0pa9~1JqC}fG?6xRxdzY)gH{CN&IPcwUq{u#sjmQ`w;xiKp+q7T)&Cqzn(dOu?|>yV&jr$ph!j8vuBute>bE{0TM4E^B@lvOcrt5sN&P`!4cYu-r)~J%DoSZMXgx`@(n= zXO9oo-XLUf`xqaAB}R<*lT#c{9* z0D1>P9vP=M>K!Jo+fbmt2a`@0(mc@U!D5GmWL7qpG_itB$U;%&eVION$;e4YeaQll z>osbvajGjO9qU;(k`Wb7WA7ljCB2mMC5HN{#?3nH3t}-)x_uQ1oM$Wh*53TiUAz7> z{m2BuF-4_|NHI>VGLb5hXG;1gBF9F)NenD}R;HCK4Jksm(6WC-;QRg4ps@K4mpCYa zgD~o%vVHDw5%K-*$ZpsP2oQ$wiJFCXwRBlm#Z)9%OMH+(@n7cDuEm3PzW!m~``)o z00rol0kcIvb7+{%IZr5wgS?KvjbFAd$cHXz&wzr;u|}@vz^q?1DPD)-sei>PJ8B+6 zUH{x>E(^whgdbn;iW4=;dxocpKn+*WJszVB{=0{}Z|(dn8B~5-IB`2cy!HK{tFr~^ zovhlwc)4T11Ndy-1p65GajvG6mDjUk0))FnARpt3lUxD{zKRs`0gh)N_8WGnxbjMF zhJE__rASZ$*9KM(K&tpvFtP0z^LvNXAsVO#B>?kddv710GvIhA2_=(Cb5l$+%`|yM ze-pkvu2<*5@OG*r4vV=TJ_-yIIe)MLS~rxlEr{QWfD%p4>F7g9BKEyJ{^|VNQ}0f{ zI~x~yHjW)A?1w$2}KrxK$_ijCtpX2=E{j<4pM1&1VYv9zgLM z0NF0FN0l%r@GhuQh!ZvI*}GeO-X0x^o29UQa&O!AxD zkVhY0Bmhz0m7uzuS3pA#N-t-^fhrYHr>8hAzw!6^l5+#sPxKZps~2^rL(}aeKF)3G zkMt^tR&Z_{W^6@cbDNsst-iygJM^GoPj<7cAKvt%@1gX>isIzWzQ`hrPyEX>x5u3o z`G=&*O)uZ?kAu6&Xs?s=3)cl5##qg`6k z{+;O{3+nOV|8kyu8-PoS=$WF+935{lb=b(UtJd4_srg+th-@SXg*`PTTRpiZynmDZ z6S~G$SZ4N+uU|l{q;^z)^P%)>*_y8i7mKW*=oD1BfYJ9CL+Z~?GG#rU+^QcyM&6YZ zO^Cav#SSjGyA-4WH+hQ6p&%P?miAGl%uw&+gMrNgNxfo4VVMs)=i6LG23PX(T#`PV z@^;N`z`7s3&Af9Hz%$D-KL!AQ7yU6vQT&fP$1$1sUdaN@lae5FY;sx=1PWSY)81W& z_;Q-0FQwVPX*9fd_57xxo=N^paV~xDzvpiP7$qYgR79TX-!lS-RNyXqSGLa1CCo9> zCH^f2)pwp2L7cyeor82a^gIuwX@|EmeMTt$amf5(CvOd^3<#q;h80QTVCbYz4|W5p_?l;I zQy#5}yOyF8%zNw;>!bGZi94N*vooAiALlK-K_>yYZkL&P#)ExW%~zD)mKacoZl2~oBOtFi{HEhy@3os{GTGBYX+H$e~XnDg-Tl7ow#4JVv>X59l$=myo zURR4H@m@bIIGy>i^o9N>#o>VZ`p>(%;c7J?=OTCtM)eZ$vF**Kt=6umrBV= zYfvbM{Pa)pO69v6uZvq&=+5A*dB z$WP}d7E%;E6w_53`?E21u2R+jh-!YjHS|LQZ~<U-_{`KW}Kgl2)U%xUiXry*`a12Gvx`<=>kzmGu*gKJ4|0^#dr9U6Xf7lf$nd$a=O^}kAZm;JE3x|I)xV6jat)RZ_{jlklDJvz)76#ur+^ zcLFc{q(UO|eL!(4o_`Y-ya@zo0xht^(#d7SxGxwzbcAn5foalRp__+k5X3j*tn~^v%BeBq!zdDBVpa^r&e@&$mIO;B&L47 zg#Q}ft{OywAMUlpU(06e8CZ|55g~KjWV52#OO4I|#8c5FTL-#|6o4}=lqwla4!!?` zR-*8T^%!am;gcBtBJh4M#(m7(DGRPg2s9zum=%!~K8}m^OTD|j(mqdoRFuLQF|Q|k zG~n>0DDaZq20DLd`asdA(Q|~z88prhnZt9uRkC!kMYK^ruoUS@A2-vyd_KHy)xw;|gsc$iO( zYL4rUi#0yx(k+4p5Hfxlf{wrOU!SB1IMiLS z7hRBj+muP^k~ytyX40*`%c(hpzwJ`dc7XhAJCwhyW;Rt5GNXK}C+|`Bpa)y9Bc70W zIObls2DZ##;LUQmJ@A21XZQ!J)vk?7jjs+B!&FxW(=h0=T#F;! zYGA!sM~dhCMgILxk?PasYMJnOe(8$gN{iYhqYhFRV{JSET-DjD^R+IWvbL8nncf(T ziho49&o$#(lC!4*I2|E{F+D>2TyOjg=YsaGWXVwj7R_ z!Cjf)E><#miHCeLYcNk70I79=TUmx@$XhXkf-VfYapnEZ#k&5|Dtj83Yuy1>pI{^A@=8fvt?S~-wvk$jy7XEYT0*$)2{@+n zE7A6A(}}MY#M3Cfge`WeW(G;BVUQD>(Q%V5O|N?W>`{@KdG^Vp0dD=y_4U2mFutnAX@=1+8dzZ@*@E+qp13(~mLv)gZR zdaylCU&z+2RfDc5V4c2nUk;Y8FUicS`804y-qv9>n z0HhC_l(UvT%IVd{`O_@mkn;1Qxw4xwy*ou0vUGk5WJ!b5&yKKj$tNOFiOs20yx|K#g{djSYT z)7FY189cApY?KE3kn&;XToM2Ic9Pa?twBx?i&uaJdV~%cl=(O#noWHLeYBiUtq7N? zCrf`p;6V`er4`TDLM%`=%-EKITV2<^B(n#kblEXw&q5MrdjncoB6M|Jo7ZCl2uiEE?=-aBv_j(h3hQ+=G>$jlt@7zRxaUZrO z?e78HwgU10S{tjs&h391?tmHE>RR>h?n~ec{M+Pw>kIZ?ektmvauUx+f+xW3DA_5PxsniqQ z-w;o~^HJWtg5qMmhh{Hs*xB91m<=pe4{jDLB^I_h!oJ(->vNj(N1`|fAIGt1)i#h! zEf6o{yZTx4{P~SK@QLM7hVtgenBn3V0$Czkgmq^s0h-@j*Y-tCzD~`br!^&l!iP7)xtg2tcn=2!sov`#I>p zaaxT%@pH>#h@nXTyZ@c0$)>#KfXN}HumGe3O1is)`5!Y2MDTEM5c4_qzvmNedwieS zPT|md=ldb7{^6_$mOo2WgEbUm+ala8?;;EkGqN3Xn)!HrWOYJY%j2?x#jvmuHR^`= zVhjNtMI10!d%$d$EFQ$NTw1#h(?#B&?I&LI#keYqhDRgH#qz{hGDYiMGT^=&)&5K&~Jts>Y2}G81R^qKZjlS<)*Oenexu5l~Av* zNL`GYW%R$lqMfemtFai`OHS@Oz^%6NvBQ_^Q#rC^g_j}FiTR`MdCuJZqtVY$Van9^ z=g{rNPqchG9mL!@gAf{GXMEDi3VHiiJdE8m*QSb&QwNG%&Jxt|?Q@tV+_eG`QqQk8 z$au5+3S1#2X4Ne_^h~1D;mw|=OC*%p^cWVIqEeh z*7$NE&!~;1pVK6$(?w$lXV!{Tqg_;&a%y(_&5gOGO57`pVVP$rlJQNqQU9gL3_`vwKfHqu|R|yF=@acK05p(uxI0G_w#{n@HXn#yo^mV58*qC9Hn-nG97mN@@Z;5YE+K$!vV@6P;3X_#`crtsS2}i)< zdVh!SKKJSkU(PeoQh8$4ia1~+kY<#QK*DtS&b#68q-VTmxkg&CuGbF`bk{;04&dQS zjNK}?RH2m!TU!_{;?`RAujY*{vJQ&ceUpj82-eG9)G?}79HX!yDrivCUTslff)ydf z^fNJI0XaWGR{uq1gRLxD{c*)1=ks;PjTP2ccNweJp}{xQQL*_F32CDU466Zwiw*&U946oVTck;=Q2cLM};aKY?)IvsRLxLp4q{@+_v~xJ8M&Y zBUJ%AE>`f#ojlX*2}r9##BtYp4}5XF{GHZdFW0lB2wSvp1WInPNDVPrbF=rgr|i8= z4PhNMRETj1+uAX~&BUjo!9CdYxi9)!~pPeuBW_xUVR} zzTH-16fC{dYv*#q>un{fqo^f_IDIrTHuEevE2xR#=vZbNTJ9dAY_<1hcQyvQ-rZVH z(md#*Ycb4%8F{^rn7MGtriTTCW^%V`z*7}XN2LzeMUqAkL3=D*s{*(wBqf0jW|NhQ zqv9l-*9Er=qs0y6OhlZ3D0m+FQa@rSb|6**_Yh1I2F0}RV7$O}ioUU%5;W@-L~lzn zTcSAq$p3x!>;LQBSKHY@!?ST)aK=j7o$B)UZ@VHmnb`2WUW`Hnzen?Q{mDU&#dMPy~$Z9uNI$;rCmGd zjoWv;{n7nb&y(Dbcs3^zd$9MNxJGtmwOQmi)a`jA!HQw!Jc6?35Q`X^AZZVe^om^b z+3)UWTr0uj%F6k}W*_cdf030$y5>Nh6~Z^y^mYX!mhDk2+$|k>-6nuJx?(BBVfGQ@ zbdjJ0<*W-Tz21e_`RIVe6DxzD)EzrcBk1pVTE2PMXJWV7OW$Sr30jlY#MJ?5VGYv8 zazBpi$$Vrrnkxow;99ho0c%>Qcq5SzR5zI?TeU>QXjbA+|I>RKj#0o<(-Scjt~{YM`C(4vxpki|w(o z?ifuNUs+(^6UU_Gg;DpxhQaFdhC}WCCqGrPM1}~C^txF4=xKp&>{h5)I|h%Z`HENj zUQLwZbQ}lR@zWROxc!CoYYo=&X9u3$LnN0B@3YO3H02OuA&JM1q$kX}GsYoPkO6Kx zb{ylSKh>zt*VKnqI!^t-nvx9vXk-m-X`FAcsoq^eRzszkYW?6~|Kn#$dJj&SAC$fb+B z)hFChk*HN>_rW+_5{zGcAbhnva&xLBe6!~I5zl+V@@x1&Y!jcdK~iGU-j?XIN#a3A z)6rx$=ZiK3S&HJye3)V=A@^PdQ=8%0DKooOuY0qDp|RKlnSuH9J9fOf3~iSE>_cbK z`@`jb8r~7|#%jboA5^vX65{&PMlZoAFm`~9 zw6e1<6A!CkBpq?imR`l*HIf*m93B>o!Eap-SCdfmMbHhFcq3+|R` zpth)Y>pfr#73TqHwK0=KQ%{jF{xP5+}^1Hw?_xYwu+0ZtI?gw=?YFaB)5tRln9x;|ScOO;k z#Nav=i`#hqu}C4JOVQBWvdDj>_8?8ATPnwbMKT}E$ZsoLn$fE3$wEP$7is5j4;c~n zC~kDHnamu$J*4c9@jB0~p~;$u5+rnu6erISFUOh6@2JZcj%hu7vB4H+bCR03VAZ2I z$bXB+p3sL$-BoRqUlL2oB#FEfsw`}P8{|cX_!NZFm2w3~$Ldd`b`nM{oB7SjTE&2C(IXm;RRtXk&{taoZ7m=A8yEuCc(UbxI z`fBG?Oc8j2>RB^871$D`O4&ldzDflHqkafm4_Pt_>38(ay=E3BH%7A7UcxCF`qW`b zA*ujUfC z;Tb3u{MufWYL{rfrTNL|te;LZU#>o835>8aAc@xuHX+|dhBkLiqB<*YgmhGvw(FOA zUdc_(4-7cp#ZX?_^L-+f2xW{~6hf(BLG26;EwoYGb*sN=^VJF!=BR|<8%>zQ!X|uF zQOlhbcGQ5?5VbI94InJ1Nt?`A)*iLy6ZL-P_)9jfrnJ{g(FggI<7rWGrM4;k74?zS zW$ess8?8+n2KZxefpk=!N7st1h(4Q z=T}y<>(eMpjfVTimZdS=178ht%qM0-us1hIL*<_JrE5 z{j%KXju)3;p>(s{-OT8aE?8KZu6I520!3rO7EIgY+vj_uYjxK5;d|=pT4^h3&qeVm zc=%e13AJFl@gjbSfF&Ks^U&jZpy;LsQ8Y67pWcB)o42AASF0Hw9LX>kl`CE_>M=B{ z!eSc&8*XKJw zu|?Qf_R(9Tiqm7*smfwZrURaIW@T;F#T2KbpyRUvPrH$dn!&EXVi`QleX$O6j?G7NY^DkC?j7YEWS8LXs9{gC_st)~^A_At zq9(5Jx&WPF^oaPNcF4Mjw}R=E&igg>rInO^)0L9kVG#V4#CpVIi9x3d)+`4i;4|#P z$s_zGghV+!O3P;u@pw1~NN`l0A38?@CL`L^YDmG^yH-W007iexXt{9xbUm0jLXpa7 zC1d5mQ5wd&^^$7ZEUqN9jTlYFevBqFV2xWj3R#OuQfI2lgYsWmm=v0>x=VFSO=_zc zg7SrX*RgJHsDtbPuwA-o)m=QOjm1S|Y5Ds4svWc(7fL7G7Sf-_=0?B?xnJiZ zSwvb3)brxV$RI54+}5Pc3)*tTUBHX8j+e|^EOq#~q@In-3lRO?>Xqlt*mgFbmC!<7 z*1(K}pj?f`pLl03(58yvB%OLfPst6gO{5S;O@oGRBpkp~8+gx93#>-xl<~ZU(g@TI zE^Zxc0ODYLWy(n_fdGYu`4Bu#8iiVBBwcEqo>SagK=FlnMLF^1!z;LhhQbIJs?9AJ zgX%U^@ohXJmGfa$4X&Pb^&}0#+p)F>J>l2}YMd>4Dad7De(p?_b=({Y{Cl$`YA@Cj znx)Zlf{;5IYa#CLV?~`_Fj3I9e4w3yz>^x^XXd->xn~TH!io7Fk5lk2J?=Sp984ic%SHo)T-LP+`Kow@^(330e*(Y8k{1&r~+ zyo|@#Kx}nzu^~soix-hpuVK3}s#?su?;uvJ-eHtQdj(d2UsIo3;bn70&aSUdYnh2t zPfeC?N-c~=6V%X{84803DRHzVcrR9@KBd@;2bKCuKFW5S#P$&vif3A4D!<#UkPVn; zrPCpg1fL|wpJQco;+SDgL)|xXJ3dV?THGtXBtnh|^>exKoHq30be2~`?&EUaMK#5(5#f2^{3#M0qH_19$ zrxF?zA?cp4il~){W=S6?V#C8%1MMw#?EhJh?KI=wp!S_tSsjo&C9j9<{$WQyBe+z5 zx?Fv^;!onAcA#h`sRY&+JxY?ef diff --git a/img/radix_c.PNG b/img/radix_c.PNG new file mode 100644 index 0000000000000000000000000000000000000000..826f895254a8d2554f9d2ce83756a5e4b3f646fa GIT binary patch literal 20029 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 JF6*2UngH{*-@O0; literal 0 HcmV?d00001 diff --git a/img/radix_result.PNG b/img/radix_result.PNG new file mode 100644 index 0000000000000000000000000000000000000000..a9ab741c36e69cfa0bb8349bc4447325282c79d5 GIT binary patch literal 6930 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 literal 0 HcmV?d00001 diff --git a/img/scan.PNG b/img/scan.PNG new file mode 100644 index 0000000000000000000000000000000000000000..a967ae54a0a558b1236edcda9fc33b189f4e13a5 GIT binary patch literal 24311 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 {<~9^|6Z8uc?*?^cZ<&o29 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 Pke9cnyvY0A?zjFwkzlS` literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp index 740d0bf..4ea7af3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -15,7 +15,7 @@ #include #include "testing_helpers.hpp" -int SIZE = 1 << 4; // feel free to change the size of array +int SIZE = 1 << 20; // feel free to change the size of array int NPOT = SIZE - 3; // Non-Power-Of-Two StreamCompaction::Common::PerformanceTimer& timer(); @@ -225,6 +225,15 @@ int main(int argc, char* argv[]) { expectedCount = count; printArray(count, b, true); printCmpLenResult(count, expectedCount, b, c); + + memcpy(c, a, SIZE * sizeof(int)); + std::sort(c, c + NPOT); + zeroArray(SIZE, b); + printDesc("radix sort, not-power-of-two"); + StreamCompaction::Radix::sort(NPOT, b, a); + printElapsedTime(StreamCompaction::Radix::timer().getGpuElapsedTimeForPreviousOperation(), "(cuda Measured)"); + printArray(NPOT, b, true); + printCmpLenResult(NPOT, NPOT, b, c); free(a); diff --git a/src/radix.cpp b/src/radix.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 97db880..dfb4939 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -5,7 +5,7 @@ #include "cpu.h" #include "naive.h" -#define BLOCKSIZE 512 +#define BLOCKSIZE 256 #define SOLVE_BANK_CONFLICTS 1 #if BLOCKSIZE > 1024 diff --git a/stream_compaction/radix_.cu b/stream_compaction/radix_.cu deleted file mode 100644 index e23dbe2..0000000 --- a/stream_compaction/radix_.cu +++ /dev/null @@ -1,132 +0,0 @@ -/* -#include -#include -#include -#include -#include -#include "stream_compaction/common.h" -#include "stream_compaction/efficient.h" -#include "stream_compaction/radix.h" - -#define BLOCKSIZE 128 - -typedef int var_t; - -namespace StreamCompaction { - namespace Radix { - - template - T findMax(T *arr, T n) { - T max = 0; - for (int i = 0; i < n; ++i) { - if (arr[i] > max) { - max = arr[i]; - } - } - return max; - } - - __global__ void getB(const int n, const int t, int *idata, int *odata) { - int idx = threadIdx.x + (blockIdx.x * blockDim.x); - if (idx >= n) { - return; - } - - odata[idx] = ((idata[idx] & (1 << t)) ^ (1 << t)); - } - - __global__ void getE(const int n, int *idata, int *edata) { - int idx = threadIdx.x + (blockIdx.x * blockDim.x); - if (idx >= n) { - return; - } - - edata[idx] = (idata[idx] ^ 1); - } - - __global__ void getTF(const int n, int *edata, int *fdata, int *odata) { - int idx = threadIdx.x + (blockIdx.x * blockDim.x); - if (idx >= n) { - return; - } - - odata[idx] = edata[idx] + fdata[idx]; - } - - __global__ void getT(const int n, const int tf, int *fdata, int *odata) { - int idx = threadIdx.x + (blockIdx.x * blockDim.x); - if (idx >= n) { - return; - } - - odata[idx] = idx - fdata[idx] + tf; - } - - __global__ void getD(const int n, int *bdata, int * tdata, int * fdata, int *odata) { - int idx = threadIdx.x + (blockIdx.x * blockDim.x); - if (idx >= n) { - return; - } - - odata[idx] = (bdata[idx] ? tdata[idx] : fdata[idx]); - } - - __global__ void refill(const int n, int * d, int * idata, int *odata) { - int idx = threadIdx.x + (blockIdx.x * blockDim.x); - if (idx >= n) { - return; - } - - odata[d[idx]] = idata[idx]; - } - - void sort(int n, int *odata, int *idata) { - - int size; - int *dev_idata, *dev_odata; - int *dev_b, *dev_e, *dev_f, *dev_t, *dev_d; - - size = n * sizeof(int); - - cudaMalloc((void**)&dev_idata, size); - cudaMalloc((void**)&dev_odata, size); - cudaMalloc((void**)&dev_b, size); - cudaMalloc((void**)&dev_e, size); - cudaMalloc((void**)&dev_f, size); - cudaMalloc((void**)&dev_t, size); - cudaMalloc((void**)&dev_d, size); - - dim3 blocksPerGrid((n + BLOCKSIZE - 1) / BLOCKSIZE); - dim3 threadsPerBlock(BLOCKSIZE); - - var_t max = findMax(idata, n); - int ndigit = ilog2ceil(max); - - for (int i = 0; i < ndigit; i++) { - getB<<>>(n, i, dev_b, dev_idata); - - getE<<>>(n, dev_b, dev_e); - - thrust::device_ptr dev_thrust_e(dev_e); - thrust::device_ptr dev_thrust_f(dev_f); - thrust::exclusive_scan(dev_thrust_e, dev_thrust_e + n, dev_thrust_f); - - int tf, le; - cudaMemcpy(&tf, dev_f + n - 1, sizeof(int), cudaMemcpyDeviceToHost); - cudaMemcpy(&le, dev_e + n - 1, sizeof(int), cudaMemcpyDeviceToHost); - tf += le; - - getT << > >(n, tf, dev_f, dev_t); - - getD << > >(n, dev_b, dev_t, dev_f, dev_d); - - refill(n, dev_d, dev_idata, dev_odata); - std::swap(dev_idata, dev_odata); - } - - cudaMemcpy(odata, dev_idata, size, cudaMemcpyDeviceToHost); - - } - - } -}*/ \ No newline at end of file diff --git a/stream_compaction/radix_.h b/stream_compaction/radix_.h deleted file mode 100644 index e9840ab..0000000 --- a/stream_compaction/radix_.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include "stream_compaction/common.h" - -namespace StreamCompaction { - namespace Radix{ - StreamCompaction::Common::PerformanceTimer& timer(); - - void sort(int n, int *odata, int *idata); - -} -} \ No newline at end of file From 10b061c2f23f2321421f1184b3dcfc7b97d2e232 Mon Sep 17 00:00:00 2001 From: ziyuli Date: Mon, 18 Sep 2017 22:16:56 -0400 Subject: [PATCH 3/3] Update README --- README.md | 7 +++---- src/main.cpp | 5 +++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 32747f7..d0087b1 100644 --- a/README.md +++ b/README.md @@ -38,8 +38,6 @@ For the benchmark and result, please check **Performance** section #### Radix Sort One of the most significant application for GPU scan is radix sort which is a sorting algorithm for parallel processors. -![]() - To use radix sort function, please call the function below: ```c++ StreamCompaction::Radix::sort(int n, int *odata, int *idata); @@ -95,7 +93,8 @@ Based on large number (larger than 2^20) benchmark result. The optimize block si #### Compare all of these GPU Scan implementations (Naive, Work-Efficient, and Thrust) to the serial CPU version of Scan. Plot a graph of the comparison -For the benchmark and graph, please check **Performance** section - +For Thrust implementation, the highest occupancy in GPU is cudaMalloc and cudaMemcpy related function calls based on Nsight Timeline. However, there are three most significant functions in Thrust scan *accumlate_tiles*, *exculsive_scan_n* and *exclusive_downsweep* are not really use too much GPU time. +I believe the performance bottlenecks is memory bandwidth for Thrust scan. The computation time compare to memory I/O time is trivial. As for my implementation, the efficient method waste a huge amount of time on launching non-working threads. For efficient with optimization, the memory I/O become the most inefficient factor in whole system. By using shared memory can highly increase memory I/O efficiency and decrease memory latency to achieve maximum efficiency. +For the benchmark and graph, please check **Performance** section \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 4ea7af3..9b930b6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -56,6 +56,7 @@ int main(int argc, char* argv[]) { // initialize b using StreamCompaction::CPU::scan you implement // We use b for further comparison. Make sure your StreamCompaction::CPU::scan is correct. // At first all cases passed because b && c are all zeroes. + zeroArray(SIZE, b); printDesc("cpu scan, power-of-two"); StreamCompaction::CPU::scan(SIZE, b, a); @@ -124,7 +125,7 @@ int main(int argc, char* argv[]) { printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(NPOT, c, true); printCmpResult(NPOT, b, c); - + zeroArray(SIZE, c); printDesc("thrust scan, power-of-two"); @@ -139,7 +140,7 @@ int main(int argc, char* argv[]) { printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(NPOT, c, true); printCmpResult(NPOT, b, c); - + printf("\n"); printf("*****************************\n"); printf("** STREAM COMPACTION TESTS **\n");