From cc48ade841a7d6c0c0389ebfa3b066828f398416 Mon Sep 17 00:00:00 2001 From: Chocobo Date: Sun, 16 Sep 2018 16:42:28 -0400 Subject: [PATCH 1/9] done --- src/main.cpp | 26 ++--- stream_compaction/CMakeLists.txt | 2 +- stream_compaction/common.cu | 12 +++ stream_compaction/cpu.cu | 41 +++++++- stream_compaction/cpu.h | 2 +- stream_compaction/efficient.cu | 175 ++++++++++++++++++++++++++++++- stream_compaction/efficient.h | 4 +- stream_compaction/naive.cu | 86 +++++++++++++++ stream_compaction/thrust.cu | 4 + 9 files changed, 329 insertions(+), 23 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 1850161..04b3c48 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 << 22; // 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]; @@ -36,13 +36,13 @@ int main(int argc, char* argv[]) { // 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); + StreamCompaction::CPU::scan(SIZE, b, a,true); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(SIZE, b, true); zeroArray(SIZE, c); printDesc("cpu scan, non-power-of-two"); - StreamCompaction::CPU::scan(NPOT, c, a); + StreamCompaction::CPU::scan(NPOT, c, a ,true); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(NPOT, b, true); printCmpResult(NPOT, b, c); @@ -51,7 +51,7 @@ int main(int argc, char* argv[]) { printDesc("naive scan, power-of-two"); StreamCompaction::Naive::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); + printArray(SIZE, c, true); printCmpResult(SIZE, b, c); /* For bug-finding only: Array of 1s to help find bugs in stream compaction or scan @@ -64,35 +64,35 @@ int main(int argc, char* argv[]) { printDesc("naive scan, non-power-of-two"); StreamCompaction::Naive::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); + printArray(SIZE, c, true); printCmpResult(NPOT, b, c); zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); - StreamCompaction::Efficient::scan(SIZE, c, a); + StreamCompaction::Efficient::realscan(SIZE, c, a,true); 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); + StreamCompaction::Efficient::realscan(NPOT, c, a,true); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(NPOT, c, true); + printArray(NPOT, c, true); printCmpResult(NPOT, b, c); zeroArray(SIZE, c); printDesc("thrust scan, power-of-two"); StreamCompaction::Thrust::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); + printArray(SIZE, c, true); printCmpResult(SIZE, b, c); zeroArray(SIZE, c); printDesc("thrust scan, non-power-of-two"); StreamCompaction::Thrust::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(NPOT, c, true); + printArray(NPOT, c, true); printCmpResult(NPOT, b, c); printf("\n"); @@ -137,14 +137,14 @@ int main(int argc, char* argv[]) { printDesc("work-efficient compact, power-of-two"); count = StreamCompaction::Efficient::compact(SIZE, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(count, c, true); + printArray(count, c, true); printCmpLenResult(count, expectedCount, b, c); zeroArray(SIZE, c); printDesc("work-efficient compact, non-power-of-two"); count = StreamCompaction::Efficient::compact(NPOT, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(count, c, true); + printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); system("pause"); // stop Win32 console from closing on exit diff --git a/stream_compaction/CMakeLists.txt b/stream_compaction/CMakeLists.txt index cdbef77..48e2f35 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_60 ) diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 8fc0211..f285957 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -24,6 +24,12 @@ namespace StreamCompaction { */ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { // TODO + int idx = blockIdx.x*blockDim.x + threadIdx.x; + if (idx < n) + { + if (idata[idx]) + bools[idx] = 1; + } } /** @@ -33,6 +39,12 @@ namespace StreamCompaction { __global__ void kernScatter(int n, int *odata, const int *idata, const int *bools, const int *indices) { // TODO + int idx = blockIdx.x*blockDim.x + threadIdx.x; + if (idx < n) + { + if (bools[idx]) + odata[indices[idx]] = idata[idx]; + } } } diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 05ce667..bea019f 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -17,9 +17,17 @@ namespace StreamCompaction { * 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) { + void scan(int n, int *odata, const int *idata, bool istimer) { + if (istimer) timer().startCpuTimer(); // TODO + odata[0] = 0; + odata[1] = idata[0]; + for (int i = 2; i < n; ++i) + { + odata[i] = odata[i - 1] + idata[i-1]; + } + if (istimer) timer().endCpuTimer(); } @@ -31,10 +39,21 @@ namespace StreamCompaction { int compactWithoutScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + int idx = 0; + for (int i = 0; i < n; ++i) + { + if (idata[i] == 0) continue; + else + { + odata[idx] = idata[i]; + idx++; + } + } timer().endCpuTimer(); - return -1; + return idx; } + /** * CPU stream compaction using scan and scatter, like the parallel version. * @@ -43,8 +62,24 @@ namespace StreamCompaction { int compactWithScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + //map + int *checker = new int[n]; + for (int i = 0; i < n; ++i) + { + if (idata[i]) checker[i] = 1; + else checker[i] = 0; + } + //scan + scan(n, odata, checker,false); + //scatter + int num = odata[n - 1] ; + for (int i = 0; i < n; ++i) + { + if (idata[i]) odata[odata[i]] = idata[i]; + } + delete []checker; timer().endCpuTimer(); - return -1; + return num; } } } diff --git a/stream_compaction/cpu.h b/stream_compaction/cpu.h index 236ce11..df9b6c5 100644 --- a/stream_compaction/cpu.h +++ b/stream_compaction/cpu.h @@ -6,7 +6,7 @@ namespace StreamCompaction { namespace CPU { StreamCompaction::Common::PerformanceTimer& timer(); - void scan(int n, int *odata, const int *idata); + void scan(int n, int *odata, const int *idata , bool istimer); int compactWithoutScan(int n, int *odata, const int *idata); diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 36c5ef2..b99b26f 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -11,16 +11,134 @@ namespace StreamCompaction { static PerformanceTimer timer; return timer; } + int blocksize = 1024; + dim3 blocknum; + __global__ void GPUUpsweepreal(int n, int d, int *idata) + { + int idx = blockDim.x*blockIdx.x + threadIdx.x; + int para = (1 << (d + 1)); + int para1 = 1 << d; + if (idx < n) + { + idata[idx*para + para - 1] += idata[idx*para + para1 - 1]; + } + } + + __global__ void GPUUpsweep(int n, int d, int *idata) + { + int idx = blockDim.x*blockIdx.x + threadIdx.x; + int para = 1 << (d + 1); + int para1 = 1 << d; + if (idx < n) + { + if (idx >= 0 && idx%para == 0) + { + idata[idx + para - 1] += idata[idx + para1 - 1]; + } + } + } + + + __global__ void GPUdownsweepreal(int n, int d, int *idata) + { + int idx= blockDim.x*blockIdx.x + threadIdx.x; + int para = 1 << (d + 1); + int para1 = 1 << d; + if (idx < n) + { + int t = idata[idx*para + para1 - 1]; + idata[idx*para + para1 - 1] = idata[idx*para + para - 1]; + idata[idx*para + para - 1] += t; + } + } + + __global__ void GPUdownsweep(int n, int d, int *idata) + { + int idx = blockDim.x*blockIdx.x + threadIdx.x; + int para = 1 << (d + 1); + int para1 = 1 << d; + if (idx < n) + { + if (idx >= 0 && idx%para == 0) + { + int t = idata[idx + para1 - 1]; + idata[idx + para1 - 1] = idata[idx + para - 1]; + idata[idx + para - 1] += t; + } + } + + } /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ - void scan(int n, int *odata, const int *idata) { + void scan(int n, int *odata, const int *idata, bool istimer) { + int dmax = ilog2ceil(n); + int adjustlen = 1 << dmax; + int *dev_arr; + + cudaMalloc((void**)& dev_arr, adjustlen* sizeof(int)); + checkCUDAError("cudaMalloc dev_arr failed!"); + + cudaMemcpy(dev_arr, idata, adjustlen * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("cudaMemcpy failed!"); + + if(istimer) timer().startGpuTimer(); + + for (int d = 0; d < dmax; d++) + { + blocknum = (adjustlen + blocksize - 1) / blocksize; + GPUUpsweep << > > (adjustlen, d, dev_arr); + } + cudaMemset(dev_arr + adjustlen - 1, 0, sizeof(int)); + for (int d = dmax - 1; d >= 0; d--) + { + blocknum = (adjustlen + blocksize - 1) / blocksize; + GPUdownsweep << > > (adjustlen, d, dev_arr); + } // TODO + if (istimer) timer().endGpuTimer(); + cudaMemcpy(odata, dev_arr, n * sizeof(int), cudaMemcpyDeviceToHost); + cudaFree(dev_arr); } + void realscan(int n, int *odata, const int *idata, bool istimer) { + int dmax = ilog2ceil(n); + int adjustlen = 1 << dmax; + int *dev_arr; + + cudaMalloc((void**)& dev_arr, adjustlen * sizeof(int)); + checkCUDAError("cudaMalloc dev_arr failed!"); + + cudaMemcpy(dev_arr, idata, adjustlen * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("cudaMemcpy failed!"); + + if (istimer) + timer().startGpuTimer(); + + for (int d = 0; d < dmax; d++) + { + int interval = (1 << (d + 1)); + blocknum = (adjustlen/interval + blocksize ) / blocksize; + GPUUpsweepreal << > > (adjustlen/interval, d, dev_arr); + } + + cudaMemset(dev_arr + adjustlen - 1, 0, sizeof(int)); + for (int d = dmax - 1; d >= 0; d--) + { + int interval = (1 << (d + 1)); + blocknum = (adjustlen/interval + blocksize ) / blocksize; + GPUdownsweepreal << > > (adjustlen/interval, d, dev_arr); + } + // TODO + if (istimer) + timer().endGpuTimer(); + cudaMemcpy(odata, dev_arr, n * sizeof(int), cudaMemcpyDeviceToHost); + cudaFree(dev_arr); + } + /** * Performs stream compaction on idata, storing the result into odata. * All zeroes are discarded. @@ -31,10 +149,59 @@ namespace StreamCompaction { * @returns The number of elements remaining after compaction. */ int compact(int n, int *odata, const int *idata) { - timer().startGpuTimer(); + int *dev_idata, *dev_odata, *dev_checker, *dev_indices;; + + + + + cudaMalloc((void**)&dev_idata, n * sizeof(int)); + checkCUDAError("cudaMalloc dev_idata failed!"); + + cudaMalloc((void**)&dev_odata, n * sizeof(int)); + checkCUDAError("cudaMalloc dev_odata failed!"); + + cudaMalloc((void**)&dev_checker, n * sizeof(int)); + checkCUDAError("cudaMalloc dev_checker failed!"); + + cudaMalloc((void**)&dev_indices, n * sizeof(int)); + checkCUDAError("cudaMalloc dev_indices failed!"); + + cudaMemcpy(dev_idata,idata, n * sizeof(int), cudaMemcpyHostToDevice); + + //timer().startGpuTimer(); + + blocknum = (n + blocksize ) / blocksize; + Common::kernMapToBoolean << > > (n, dev_checker, dev_idata); + + + int *checker = new int[n];int *indices = new int[n]; + cudaMemcpy(checker, dev_checker, n * sizeof(int), cudaMemcpyDeviceToHost); + + realscan(n, indices, checker,true); + + cudaMemcpy(dev_indices, indices, n * sizeof(int), cudaMemcpyHostToDevice); + + int finalct = checker[n - 1] ? 1 : 0; + + int count = indices[n - 1]+finalct; + + blocknum = (n + blocksize) / blocksize; + Common::kernScatter << > > (n, dev_odata, dev_idata, dev_checker, dev_indices); + //timer().endGpuTimer(); + cudaMemcpy(odata, dev_odata, n * sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(dev_idata); + cudaFree(dev_odata); + cudaFree(dev_checker); + cudaFree(dev_indices); + + delete[]indices; + delete[]checker; + // TODO - timer().endGpuTimer(); - return -1; + + return count; + } } } diff --git a/stream_compaction/efficient.h b/stream_compaction/efficient.h index 803cb4f..8154826 100644 --- a/stream_compaction/efficient.h +++ b/stream_compaction/efficient.h @@ -6,7 +6,9 @@ namespace StreamCompaction { namespace Efficient { StreamCompaction::Common::PerformanceTimer& timer(); - void scan(int n, int *odata, const int *idata); + void scan(int n, int *odata, const int *idata , bool istimer); + + void realscan(int n, int *odata, const int *idata, bool istimer); int compact(int n, int *odata, const int *idata); } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 9218f8e..c62c623 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -3,6 +3,7 @@ #include "common.h" #include "naive.h" + namespace StreamCompaction { namespace Naive { using StreamCompaction::Common::PerformanceTimer; @@ -13,13 +14,98 @@ namespace StreamCompaction { } // TODO: __global__ + __device__ int ilog2Device(int x) { + int lg = 0; + while (x >>= 1) { + ++lg; + } + return lg; + } + + __device__ int ilog2ceilDevice(int x) { + return x == 1 ? 0 : ilog2Device(x - 1) + 1; + } + + __global__ void plusp(int n, int *idata, int *odata ,int d) + { + int idx = blockDim.x*blockIdx.x + threadIdx.x; + if (idx < n) + { + if (idx >= (1 << (d - 1))) + { + odata[idx] = idata[idx-(1 << (d - 1))] + idata[idx]; + + } + + else + { + odata[idx] = idata[idx]; + } + __syncthreads(); + } + + } + __global__ void resetidata(int n, int *idata, int *odata) + { + int idx = blockDim.x*blockIdx.x + threadIdx.x; + if (idx < n) + { + idata[idx] = odata[idx]; + + } + + } + + __global__ void toExclusive(int n, int *idata, int *odata) + { + int idx = blockDim.x*blockIdx.x + threadIdx.x; + if (idx < n) + { + odata[0] = 0; + if (idx > 0) + { + odata[idx] = idata[idx - 1]; + } + + } + + } + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + if (n <= 0)return; + odata[0] = 0; + int blocksize = 1024; + dim3 blocknum = (n + blocksize - 1) / blocksize; + int *dev_idata, *dev_odata; + cudaMalloc((void**) & dev_idata, n * sizeof(int)); + checkCUDAError("cudaMalloc dev_idata failed!"); + + cudaMalloc((void**)& dev_odata, n * sizeof(int)); + checkCUDAError("cudaMalloc dev_odata failed!"); + + cudaMemcpy(dev_idata, idata, n * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("cudaMemcpy failed!"); + timer().startGpuTimer(); // TODO + int dmax = ilog2ceil(n); + for (int d = 1; d <= dmax; ++d) + { + plusp << > > (n, dev_idata, dev_odata,d); + resetidata << > > (n, dev_idata, dev_odata); + } + toExclusive << < blocknum, blocksize >> > (n, dev_idata, dev_odata); timer().endGpuTimer(); + + cudaMemcpy(odata, dev_odata, n * sizeof(int), cudaMemcpyDeviceToHost); + checkCUDAError("cudaMemcpy failed!"); + + cudaFree(dev_idata); + cudaFree(dev_odata); } + } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 36b732d..d12ab3f 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -18,11 +18,15 @@ 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 dev_idata(idata, idata + n); + thrust::device_vector dev_odata(odata, odata + n); timer().startGpuTimer(); + thrust::exclusive_scan(dev_idata.begin(), dev_idata.end(), dev_odata.begin()); // 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(); + thrust::copy(dev_odata.begin(), dev_odata.end(), odata); } } } From b6150a47fb04cd2c0a04230974f5b1d3d456f741 Mon Sep 17 00:00:00 2001 From: Lan lou <31492651+LanLou123@users.noreply.github.com> Date: Sun, 16 Sep 2018 17:14:38 -0400 Subject: [PATCH 2/9] Add files via upload --- blocksizechart.JPG | Bin 0 -> 25924 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 blocksizechart.JPG diff --git a/blocksizechart.JPG b/blocksizechart.JPG new file mode 100644 index 0000000000000000000000000000000000000000..914b3191d891b7b7cc19a64a6eb87b01fad837ac GIT binary patch literal 25924 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 Date: Sun, 16 Sep 2018 17:53:09 -0400 Subject: [PATCH 3/9] Add files via upload --- arraysize.JPG | Bin 0 -> 29445 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 arraysize.JPG diff --git a/arraysize.JPG b/arraysize.JPG new file mode 100644 index 0000000000000000000000000000000000000000..30c53de76e093c0a798c308f2b2448d811c1802b GIT binary patch literal 29445 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

gx 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 KCHX**eg7Xpgn_95 literal 0 HcmV?d00001 From a876a25750c316b7c4fe546c024d5be769c3fc30 Mon Sep 17 00:00:00 2001 From: Lan lou <31492651+LanLou123@users.noreply.github.com> Date: Sun, 16 Sep 2018 17:54:07 -0400 Subject: [PATCH 4/9] part of readme --- README.md | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 103 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 0e38ddb..089cccd 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,109 @@ 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) +* Lan Lou +* Tested on: Windows 10, i7-6700HQ @ 2.6GHz 16GB, GTX 1070 8GB (Personal Laptop) -### (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.) +## Questions: +- *Roughly optimize the block sizes of each of your implementations for minimal run time on your GPU.* +blocksize/ops' time(ms)| naive scan(ms)| efficient scan(ms) +-----|-----|---- +128 | 1.911 | 0.541 +256 | 1.908 | 0.533 +512 | 1.92 | 0.545 +1024 | 1.915 | 0.559 + +- the diagram bellow explicitly shows how variation of block size impact on both the naive and the optimized solutions for scanning, although it's not very apparent, I think block size == 256 is best suited for me, in terms of my own machine condition, algorithms, etc... + +![](https://github.com/LanLou123/Project2-Stream-Compaction/raw/master/blocksizechart.JPG) + +- *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 (with array size on the independent axis).* + +Array Size(2^(n))/ops' time(ms)| Naïve | Work Efficient(optimized)| Work Efficient(not optimized) | Thrust +----|----|----|----|---- +3 | 0.032 | 0.029 | 0.093 | 0.085 +6 | 0.049 | 0.046 |0.058| 0.065 +9 | 0.076 | 0.075 | 0.068 |0.249 +12 | 0.09 | 0.137 | 0.135| 0.255 +15 | 0.128 | 0.131 | 0.118| 0.263 +18 | 0.306 | 0.471 | 0.167 |0.36 +21 | 3.89 | 2.311 | 1.008 |0.37 +24 | 35.408 | 19.495 |7.925| 0.932 +27 | 317.784 | 141.549 |61.03| 5.704 + +- the corresponding graph are: + +![](https://github.com/LanLou123/Project2-Stream-Compaction/raw/master/arraysize.JPG) + + +## Results + +### I got this result using the following settings: + +- ```blocksize``` = 1024 +- ```SIZE``` (in main.cpp) = 1 << 25 + +``` +**************** +** SCAN TESTS ** +**************** + [ 18 25 1 39 31 37 5 10 42 11 4 11 12 ... 37 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 221.761ms (std::chrono Measured) + [ 0 18 43 44 83 114 151 156 166 208 219 223 234 ... 821806793 821806830 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 77.1578ms (std::chrono Measured) + [ 0 18 43 44 83 114 151 156 166 208 219 223 234 ... 821806711 821806713 ] + passed +==== naive scan, power-of-two ==== + elapsed time: 73.3082ms (CUDA Measured) + [ 0 18 43 44 83 114 151 156 166 208 219 223 234 ... 821806793 821806830 ] + passed +==== naive scan, non-power-of-two ==== + elapsed time: 75.7463ms (CUDA Measured) + [ 0 18 43 44 83 114 151 156 166 208 219 223 234 ... 0 0 ] + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 15.5116ms (CUDA Measured) + [ 0 18 43 44 83 114 151 156 166 208 219 223 234 ... 821806793 821806830 ] + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 15.3897ms (CUDA Measured) + [ 0 18 43 44 83 114 151 156 166 208 219 223 234 ... 821806711 821806713 ] + passed +==== thrust scan, power-of-two ==== + elapsed time: 1.63021ms (CUDA Measured) + [ 0 18 43 44 83 114 151 156 166 208 219 223 234 ... 821806793 821806830 ] + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 1.63738ms (CUDA Measured) + [ 0 18 43 44 83 114 151 156 166 208 219 223 234 ... 821806711 821806713 ] + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 0 0 3 1 2 3 0 0 3 1 0 2 2 ... 1 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 121.362ms (std::chrono Measured) + [ 3 1 2 3 3 1 2 2 1 1 2 2 1 ... 3 1 ] + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 121.729ms (std::chrono Measured) + [ 3 1 2 3 3 1 2 2 1 1 2 2 1 ... 2 3 ] + passed +==== cpu compact with scan ==== + elapsed time: 293.673ms (std::chrono Measured) + [ 3 1 2 3 3 1 2 2 1 1 2 2 1 ... 3 1 ] + passed +==== work-efficient compact, power-of-two ==== + elapsed time: 15.202ms (CUDA Measured) + [ 3 1 2 3 3 1 2 2 1 1 2 2 1 ... 3 1 ] + passed +==== work-efficient compact, non-power-of-two ==== + elapsed time: 15.2422ms (CUDA Measured) + [ 3 1 2 3 3 1 2 2 1 1 2 2 1 ... 2 3 ] + passed +``` From d8176c5a189f97ad8b63abfb2634c42be2b26246 Mon Sep 17 00:00:00 2001 From: Lan lou <31492651+LanLou123@users.noreply.github.com> Date: Sun, 16 Sep 2018 18:05:13 -0400 Subject: [PATCH 5/9] made a mistake ~ --- arraysize.JPG | Bin 29445 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 arraysize.JPG diff --git a/arraysize.JPG b/arraysize.JPG deleted file mode 100644 index 30c53de76e093c0a798c308f2b2448d811c1802b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29445 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

gx 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 KCHX**eg7Xpgn_95 From 83f9f966498a2726b3ec24de34d33c9c6b5194a8 Mon Sep 17 00:00:00 2001 From: Lan lou <31492651+LanLou123@users.noreply.github.com> Date: Sun, 16 Sep 2018 18:06:38 -0400 Subject: [PATCH 6/9] this is right --- arraysize.JPG | Bin 0 -> 28782 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 arraysize.JPG diff --git a/arraysize.JPG b/arraysize.JPG new file mode 100644 index 0000000000000000000000000000000000000000..15aaa20525a52d716557f32bb8534f69d2cc7623 GIT binary patch literal 28782 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 literal 0 HcmV?d00001 From 18b4ae7f4db60b9687f0246a0030604947e10872 Mon Sep 17 00:00:00 2001 From: Lan lou <31492651+LanLou123@users.noreply.github.com> Date: Sun, 16 Sep 2018 18:07:06 -0400 Subject: [PATCH 7/9] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 089cccd..7297dd9 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Array Size(2^(n))/ops' time(ms)| Naïve | Work Efficient(optimized)| Work Effici 24 | 35.408 | 19.495 |7.925| 0.932 27 | 317.784 | 141.549 |61.03| 5.704 -- the corresponding graph are: +- the corresponding graph is: ![](https://github.com/LanLou123/Project2-Stream-Compaction/raw/master/arraysize.JPG) From 12573a0f53ddf65d62cf923d300d09c936919f8f Mon Sep 17 00:00:00 2001 From: Lan lou <31492651+LanLou123@users.noreply.github.com> Date: Sun, 16 Sep 2018 18:07:30 -0400 Subject: [PATCH 8/9] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7297dd9..82d588a 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ blocksize/ops' time(ms)| naive scan(ms)| efficient scan(ms) - *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 (with array size on the independent axis).* -Array Size(2^(n))/ops' time(ms)| Naïve | Work Efficient(optimized)| Work Efficient(not optimized) | Thrust +Array Size(2^(n))/ops' time(ms)| Naïve | Work Efficient(not optimized)| Work Efficient(optimized) | Thrust ----|----|----|----|---- 3 | 0.032 | 0.029 | 0.093 | 0.085 6 | 0.049 | 0.046 |0.058| 0.065 From f08ad4bc6cc0dddc0b5a3ba0b5b1bf8f3276d833 Mon Sep 17 00:00:00 2001 From: Lan lou <31492651+LanLou123@users.noreply.github.com> Date: Mon, 17 Sep 2018 10:17:54 -0400 Subject: [PATCH 9/9] Update README.md --- README.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/README.md b/README.md index 82d588a..0533ccf 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,38 @@ CUDA Stream Compaction * Lan Lou * Tested on: Windows 10, i7-6700HQ @ 2.6GHz 16GB, GTX 1070 8GB (Personal Laptop) +## Project Features: + +- CPU scan: This is the most basic way of doing a prefix sum(looping & adding in cpu). +- Naive scan : what differentiate naive from simple cpu is that this approach happens on gpu, and also we change into using the follwing algorithm shown in the pseudo code: +```for d = 1 to log2n + for all k in parallel + if (k >= 2d-1) + x[k] = x[k – 2d-1] + x[k]; +``` +which ensure that parallel can be applied. + +- Efficient GPU scan : by changing the original naive algorithm into two steps:upsweep and downsweep, we can shorten the amount of operations times it took significantly, the following two shows the pseudo code of up and down sweep: + +#### upsweep: +``` +for d = 0 to log2n - 1 + for all k = 0 to n – 1 by 2d+1 in parallel + x[k + 2d+1 – 1] += x[k + 2d – 1]; +``` + +#### downsweep: +``` +x[n - 1] = 0 +for d = log2n – 1 to 0 + for all k = 0 to n – 1 by 2d+1 in parallel + t = x[k + 2d – 1]; + x[k + 2d – 1] = x[k + 2d+1 – 1]; + x[k + 2d+1 – 1] += t; +``` +- Efficient scan(optimized)(Extra points) : when finished the former efficient, I discovered that it wasn't even faster than cpu methods, so I went for the optimized version as extra points: the reason for this to happen is that we haven't made full use of all threads in a upsweep or downsweep kernal, since it has braching in it, we will always have some "non-functional" threads,therefore, I decided that instead of judging inside the kernal about if the current loop's thread is a multiple of ```2^(d+1)```, we bring this outside into the scan functions, in it ,we will first caculate the block num for each loop to be ```blocknum = (adjustlen/interval + blocksize ) / blocksize;``` by dividing the array total length with ```interval = 2^(d-1)```, and also, inside the kernal, we will mutiply the index of threads with ```2^(d-1)``` to make sure it's a multiple of it, as for the others , they will stay the same. + +- compact for cpu & efficient: this part algorithm is simmilar for both, as first step, you turn the array into a buffer only containing 1 and 0 through judging if it's 0 or not, then, you do scanning using corresponding method each, after that, we will treat the caculated buffer as outter layer indices to fill into the output buffer, and only taking into acount the inner indices that is having value 1 according to the boolean buffer. ## Questions: - *Roughly optimize the block sizes of each of your implementations for minimal run time on your GPU.* @@ -39,6 +71,12 @@ Array Size(2^(n))/ops' time(ms)| Naïve | Work Efficient(not optimized)| Work Ef ![](https://github.com/LanLou123/Project2-Stream-Compaction/raw/master/arraysize.JPG) +- frome the graph we can tell the efficiency of those GPU method arraged in order are: thrust>efficient(optimized)>efficient(not optimized)>naive. + +- *Write a brief explanation of the phenomena you see here.* + +some performence issues encountered by efficient gpu as i mentioned before is because of invalid use of thread which lead to a lot of wasting, as for the others, one thing that I noticed is that the program will crash when I set the array size to be 2^30,since it's same for all methods, I guess it's the memory IO that's causing this bottleneck. + ## Results