From fabbb267435e145f2099a6c92b64bc40c5b3298a Mon Sep 17 00:00:00 2001 From: Zhuohao Lin <444053358@qq.com> Date: Sun, 18 Sep 2022 20:24:49 -0400 Subject: [PATCH] project2 is finished --- README.md | 104 ++++++++++++++++++++++++++-- img/OptimalBlockSize1.PNG | Bin 0 -> 17879 bytes img/OptimalBlockSize2.PNG | Bin 0 -> 23019 bytes img/Scan1.PNG | Bin 0 -> 36714 bytes img/Scan2.PNG | Bin 0 -> 36825 bytes img/StreamCompaction.PNG | Bin 0 -> 33330 bytes src/main.cpp | 2 +- stream_compaction/common.cu | 12 ++++ stream_compaction/cpu.cu | 44 +++++++++++- stream_compaction/efficient.cu | 120 ++++++++++++++++++++++++++++++++- stream_compaction/naive.cu | 53 +++++++++++++++ stream_compaction/thrust.cu | 7 +- 12 files changed, 331 insertions(+), 11 deletions(-) create mode 100644 img/OptimalBlockSize1.PNG create mode 100644 img/OptimalBlockSize2.PNG create mode 100644 img/Scan1.PNG create mode 100644 img/Scan2.PNG create mode 100644 img/StreamCompaction.PNG diff --git a/README.md b/README.md index 0e38ddb..5f12065 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,104 @@ CUDA Stream Compaction **University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 2** -* (TODO) YOUR NAME HERE - * (TODO) [LinkedIn](), [personal website](), [twitter](), etc. -* Tested on: (TODO) Windows 22, i7-2222 @ 2.22GHz 22GB, GTX 222 222MB (Moore 2222 Lab) +* Zhuohao Lin + * [LinkedIn](https://www.linkedin.com/in/zhuohao-lin-960b54194/) +* Tested on: Windows 10, i7-10875H @ 2.30GHz 16GB, NVIDIA Grforce RTX 2060 6GB (personal machine) + +# Overview +In this project, I implemented some widely used parallel algorithms such as work-efficient scan and stream compaction. I also implemented naive scan,CPU scan and CPU stream compaction for performance comparison. + +## Features +* CPU scan, CPU stream compaction with scan and without scan (for output and performance comparison) +* Naive scan in GPU: A simple algorithm for scan. +* Work-efficent scan in GPU: A more efficient algorithm for scan. I also made some optimization to reduce the threads usage in GPU. +* Stream Compaction in GPU: A algorithm to shrink the size of the data and keep useful data in order. + +# Output +The Output below is run with array size 223 (power-of-two arrays) and 223 - 3 (non-power-of-two arrays) +``` +**************** +** SCAN TESTS ** +**************** + [ 29 36 26 20 22 24 38 19 43 11 26 31 36 ... 43 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 11.7361ms (std::chrono Measured) + [ 0 29 65 91 111 133 157 195 214 257 268 294 325 ... 205475551 205475594 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 11.6701ms (std::chrono Measured) + [ 0 29 65 91 111 133 157 195 214 257 268 294 325 ... 205475522 205475524 ] + passed +==== naive scan, power-of-two ==== + elapsed time: 8.80413ms (CUDA Measured) + passed +==== naive scan, non-power-of-two ==== + elapsed time: 8.74237ms (CUDA Measured) + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 4.87853ms (CUDA Measured) + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 3.78675ms (CUDA Measured) + passed +==== thrust scan, power-of-two ==== + elapsed time: 0.464672ms (CUDA Measured) + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 0.476544ms (CUDA Measured) + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 3 0 2 2 0 0 0 3 3 1 2 1 0 ... 3 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 18.0229ms (std::chrono Measured) + [ 3 2 2 3 3 1 2 1 3 2 1 1 2 ... 1 3 ] + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 17.9753ms (std::chrono Measured) + [ 3 2 2 3 3 1 2 1 3 2 1 1 2 ... 2 1 ] + passed +==== cpu compact with scan ==== + elapsed time: 39.9532ms (std::chrono Measured) + [ 3 2 2 3 3 1 2 1 3 2 1 1 2 ... 1 3 ] + passed +==== work-efficient compact, power-of-two ==== + elapsed time: 5.8511ms (CUDA Measured) + passed +==== work-efficient compact, non-power-of-two ==== + elapsed time: 5.53261ms (CUDA Measured) + passed +``` + +# Performance Analysis + +## Optimal Block Size + +In order to find the optimal block size, I use the optimized work-efficient algorithm. I tested with different block sizes and measured the excution time. Shorter execution time means better performance. + +![](img/OptimalBlockSize1.PNG) +![](img/OptimalBlockSize2.PNG) + +According to the 2 graphs above, we can see that the performance improves as the block size increases. After reaching block size 128, increasing block size doesn't improve the performance anymore for either scan or stream compaction. Therefore, 128 is the optimal block size for both scan and stream compaction. + +## Performance of Different Scan Algorithms +![](img/Scan1.PNG) +![](img/Scan2.PNG) + +The two graphs above shows the performance of different implementations with different array sizes. With small array size, CPU scan has better performance. As array size becomes larger enough, all GPU scan methods outweigh CPU scan. + +Among GPU methods, Thrust implementation always has the best performance. Work-efficient method has poorer performance than naive on small arrays but significant better performance on large arrays. + +
+It's worth mentioning that the work-efficient scan algorithm is optimized on threads usage. Before optimization, the work-efficient scan has even worse performance than naive scan. This is because I used % (module operator) which is slow on GPU. Moreover, before optimization, most of threads are simply waiting for few threads to finish computation. By calculating the index of data which needs to be changed within every thread, I can free up most threads to make the scan more efficient. + +
+ +## Performance of Different Stream Compaction Algorithms +![](img/StreamCompaction.PNG) +From the graph, it's obvious that stream compaction on GPU using work-efficient scan has much better performance on large arrays than CPU approches. This is expected since stream compaction on GPU saves a lot of time with work-efficient scan. + -### (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/OptimalBlockSize1.PNG b/img/OptimalBlockSize1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..15c16e9b665d6f05756851813a07ed40ae2cc54f GIT binary patch literal 17879 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 literal 0 HcmV?d00001 diff --git a/img/OptimalBlockSize2.PNG b/img/OptimalBlockSize2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..d00e6194019746ec3cc98c888ce73f5036b6c349 GIT binary patch literal 23019 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 ZP8X>}HR?1YG?^X z%Fu!kiVY$lAc@ovqV&*_kU&C`@48{$_j}&GpJV^o-#+#a4i3Uy*0rv+&ULPHU5T_X zH`ur5@E#Zpw$I4$cPkidmn{soQ~X~)f=@I*_eq0aI|8f>F2l;Zk1)U=Ke%5qy99$( z#))j++ztK~zHewB0E3Akp`RV2cV&WMusC0%-!It&yDad8lbi<7(;?koz94%(6*CxV z<(j$_HESA$7RW)ePrKLzDJiE?l~Wf|oP$Ds6~EnCb=!z=(>~#p_#Km<^oXfr2oUQbL0BW zOVgQQ=f<131a1qvl{+0BywPF|EQLK>y=n!S41*sn-U9G0AtC_#3w3=1OzpuK}S%uE^=33YKoh&?CcIf1vGg#YK*VOjFf{)u?+�K|-(c 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 Y6^l#Y<{9 literal 0 HcmV?d00001 diff --git a/img/StreamCompaction.PNG b/img/StreamCompaction.PNG new file mode 100644 index 0000000000000000000000000000000000000000..b7157576d394ef87a9446f8eddde85dcac363f29 GIT binary patch literal 33330 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 literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp index 896ac2b..74bef51 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 8; // feel free to change the size of array +const int SIZE = 1 << 19; // feel free to change the size of array const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 2ed6d63..84b1cb2 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -1,4 +1,5 @@ #include "common.h" +#include void checkCUDAErrorFn(const char *msg, const char *file, int line) { cudaError_t err = cudaGetLastError(); @@ -24,6 +25,10 @@ namespace StreamCompaction { */ __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] ? 1 : 0; } /** @@ -33,6 +38,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]) + { + odata[indices[index]] = idata[index]; + } } } diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 719fa11..8f666a8 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -20,6 +20,12 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + // Exclusive scan + odata[0] = 0; + for (int i = 1; i < n; ++i) + { + odata[i] = odata[i - 1] + idata[i - 1]; + } timer().endCpuTimer(); } @@ -31,8 +37,17 @@ namespace StreamCompaction { int compactWithoutScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + int osize = 0; + for (int i = 0; i < n; ++i) + { + if (idata[i] != 0) + { + odata[osize] = idata[i]; + osize++; + } + } timer().endCpuTimer(); - return -1; + return osize; } /** @@ -41,10 +56,35 @@ namespace StreamCompaction { * @returns the number of elements remaining after compaction. */ int compactWithScan(int n, int *odata, const int *idata) { + int* tmp = new int[n]; + tmp[0] = 0; timer().startCpuTimer(); // TODO + // Check if corresponding elements meet criteria + for (int i = 0; i < n; ++i) + { + odata[i] = idata[i] ? 1 : 0; + } + + // Run exclusive scan + tmp[0] = 0; + for (int i = 1; i < n; ++i) + { + tmp[i] = odata[i - 1] + tmp[i - 1]; + } + int size = tmp[n - 1]; + + // Scatter + for (int i = 0; i < n - 1; ++i) + { + if (tmp[i] != tmp[i + 1]) + { + odata[tmp[i]] = idata[i]; + } + } timer().endCpuTimer(); - return -1; + delete[] tmp; + return size; } } } diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 2db346e..41cc267 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -2,6 +2,9 @@ #include #include "common.h" #include "efficient.h" +#include + +#define USE_OPTIMIZATION 1 namespace StreamCompaction { namespace Efficient { @@ -12,13 +15,98 @@ namespace StreamCompaction { return timer; } + __global__ void kernUpSweep(int n, int stride, int *odata) + { + int index = threadIdx.x + (blockIdx.x * blockDim.x); +#if USE_OPTIMIZATION + index = stride * index + stride - 1; +#endif + if (index >= n) return; + +#if USE_OPTIMIZATION + odata[index] += odata[index - stride / 2]; +#else + if ((index + 1) % stride == 0) + { + odata[index] += odata[index - stride / 2]; + } +#endif + + } + + __global__ void kernDownSweep(int n, int stride, int* odata) + { + int index = threadIdx.x + (blockIdx.x * blockDim.x); +#if USE_OPTIMIZATION + index = stride * index + stride - 1; +#endif + if (index >= n) return; + +#if USE_OPTIMIZATION + int leftChildVal = odata[index]; + odata[index] += odata[index - stride / 2]; + odata[index - stride / 2] = leftChildVal; +#else + if ((index + 1) % stride == 0) + { + int leftChildVal = odata[index]; + odata[index] += odata[index - stride / 2]; + odata[index - stride / 2] = leftChildVal; + } +#endif + + } + + void efficientScan(int n, int levelCount, int* dev_odata, int blockSize) + { + dim3 blockNum = (n + blockSize - 1) / blockSize; + int stride = 1; +#if USE_OPTIMIZATION + int sizeRequired = n; +#endif + // Up-Sweep + for (int d = 0; d < levelCount; ++d) + { +#if USE_OPTIMIZATION + sizeRequired /= 2; + blockNum = (sizeRequired + blockSize - 1) / blockSize; +#endif + stride *= 2; + kernUpSweep<<>>(n, stride, dev_odata); + } + + // Down-Sweep + cudaMemset(dev_odata + n - 1, 0, sizeof(int)); + for (int d = levelCount - 1; d >= 0; --d) + { +#if USE_OPTIMIZATION + sizeRequired *= 2; + blockNum = (sizeRequired + blockSize - 1) / blockSize; +#endif + kernDownSweep<<>>(n, stride, dev_odata); + stride /= 2; + } + } + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + int* dev_odata; + int levelCount = ilog2ceil(n); + int arraySize = 1 << levelCount; + cudaMalloc((void**)&dev_odata, arraySize * sizeof(int)); + cudaMemcpy(dev_odata, idata, n * sizeof(int), cudaMemcpyHostToDevice); + timer().startGpuTimer(); // TODO + int blockSize = 128; + efficientScan(arraySize, levelCount, dev_odata, blockSize); + timer().endGpuTimer(); + + cudaMemcpy(odata, dev_odata, n * sizeof(int), cudaMemcpyDeviceToHost); + cudaFree(dev_odata); } /** @@ -31,10 +119,40 @@ namespace StreamCompaction { * @returns The number of elements remaining after compaction. */ int compact(int n, int *odata, const int *idata) { + int *dev_idata; + int *dev_odata; + int *dev_bools; + int *dev_indices; + int levelCount = ilog2ceil(n); + int arraySize = 1 << levelCount; + cudaMalloc((void**)&dev_idata, n * sizeof(int)); + cudaMalloc((void**)&dev_odata, n * sizeof(int)); + cudaMalloc((void**)&dev_bools, n * sizeof(int)); + cudaMalloc((void**)&dev_indices, arraySize * sizeof(int)); + cudaMemcpy(dev_idata, idata, n * sizeof(int), cudaMemcpyHostToDevice); + timer().startGpuTimer(); // TODO + int blockSize = 128; + dim3 blockNum = (n + blockSize - 1) / blockSize; + Common::kernMapToBoolean<<>>(n, dev_bools, dev_idata); + + cudaMemcpy(dev_indices, dev_bools, n * sizeof(int), cudaMemcpyDeviceToDevice); + cudaMemset(dev_indices + n, 0, (arraySize - n) * sizeof(int)); + efficientScan(arraySize, levelCount, dev_indices, blockSize); + + Common::kernScatter<<>>(n, dev_odata, dev_idata, dev_bools, dev_indices); + timer().endGpuTimer(); - return -1; + cudaMemcpy(odata, dev_odata, n * sizeof(int), cudaMemcpyDeviceToHost); + int elementCount = 0; + cudaMemcpy(&elementCount, dev_indices + arraySize - 1, sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(dev_idata); + cudaFree(dev_odata); + cudaFree(dev_bools); + cudaFree(dev_indices); + return elementCount; } } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 4308876..50ded00 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -2,6 +2,7 @@ #include #include "common.h" #include "naive.h" +#include namespace StreamCompaction { namespace Naive { @@ -12,14 +13,66 @@ namespace StreamCompaction { return timer; } // TODO: __global__ + __global__ void kernNaiveScan(int n, int stride, int *idata, int *odata) + { + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= n) return; + + if (index >= stride) + { + odata[index] = idata[index - stride] + idata[index]; + } + else + { + odata[index] = idata[index]; + } + } + + __global__ void kernShiftRight(int n, int* idata, int* odata) + { + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= n) return; + + if (index == 0) + { + odata[index] = 0; + } + else + { + odata[index] = idata[index - 1]; + } + } /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + int *dev_idata; + int *dev_odata; + cudaMalloc((void**)&dev_idata, n * sizeof(int)); + cudaMalloc((void**)&dev_odata, n * sizeof(int)); + cudaMemcpy(dev_idata, idata, n * sizeof(int), cudaMemcpyHostToDevice); + timer().startGpuTimer(); // TODO + int blockSize = 128; + dim3 blockNum = (n + blockSize - 1) / blockSize; + for (int stride = 1; stride < 2 * n; stride *= 2) + { + kernNaiveScan<<>>(n, stride, dev_idata, dev_odata); + std::swap(dev_idata, dev_odata); + + } + // Convert from inclusive scan to exclusive scan + // No need to swap buffers here since they're swapped in for loop. + kernShiftRight<<>>(n, dev_idata, dev_odata); + timer().endGpuTimer(); + + cudaMemcpy(odata, dev_odata, n * sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(dev_idata); + cudaFree(dev_odata); } } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 1def45e..f00769e 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -18,11 +18,16 @@ namespace StreamCompaction { * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + thrust::device_vector dv_in(idata, idata + n); + thrust::device_vector dv_out(n); + timer().startGpuTimer(); // TODO use `thrust::exclusive_scan` // example: for device_vectors dv_in and dv_out: - // thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); + thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); timer().endGpuTimer(); + + thrust::copy(dv_out.begin(), dv_out.end(), odata); } } }