From d180c1003ebd03081714e2fbcfe24b6b5ddb8568 Mon Sep 17 00:00:00 2001 From: lostink Date: Tue, 19 Sep 2017 16:17:30 -0400 Subject: [PATCH 1/7] Done. Done. --- INSTRUCTION.md | 1 - README.md | 84 +++++++++++++++++-- img/1.png | Bin 0 -> 17812 bytes img/2.png | Bin 0 -> 15538 bytes img/3.png | Bin 0 -> 13257 bytes img/4.png | Bin 0 -> 15312 bytes src/main.cpp | 18 ++-- stream_compaction/common.cu | 13 ++- stream_compaction/cpu.cu | 50 ++++++++---- stream_compaction/efficient.cu | 145 +++++++++++++++++++++++++-------- stream_compaction/naive.cu | 89 ++++++++++++++++++-- stream_compaction/thrust.cu | 24 ++++-- 12 files changed, 341 insertions(+), 83 deletions(-) create mode 100644 img/1.png create mode 100644 img/2.png create mode 100644 img/3.png create mode 100644 img/4.png diff --git a/INSTRUCTION.md b/INSTRUCTION.md index 792c530..8be3652 100644 --- a/INSTRUCTION.md +++ b/INSTRUCTION.md @@ -242,7 +242,6 @@ The title should be "Project 2: YOUR NAME". The template of the comment section of your pull request is attached below, you can do some copy and paste: * [Repo Link](https://link-to-your-repo) -* `Your PENNKEY` * (Briefly) Mentions features that you've completed. Especially those bells and whistles you want to highlight * Feature 0 * Feature 1 diff --git a/README.md b/README.md index b71c458..5266934 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,85 @@ CUDA Stream Compaction **University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 2** -* (TODO) YOUR NAME HERE -* Tested on: (TODO) Windows 22, i7-2222 @ 2.22GHz 22GB, GTX 222 222MB (Moore 2222 Lab) +* Name: Jiahao Liu +* Tested on: Windows 10, i7-3920XM CPU @ 2.90GHz 3.10 GHz 16GB, GTX 980m SLI 8192MB (personal computer) -### (TODO: Your README) +### Features implemented -Include analysis, etc. (Remember, this is public, so don't put -anything here that you don't want to share with the world.) +### Performance Analysis + +![](images/1.png) + +![](images/2.png) + +![](images/3.png) + +![](images/4.png) + + +### Running Result + +``` +**************** +** SCAN TESTS ** +**************** + [ 28 13 1 37 12 43 45 30 45 30 16 35 30 ... 33 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 0.001324ms (std::chrono Measured) + [ 0 28 41 42 79 91 134 179 209 254 284 300 335 ... 9519 9552 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 0.001655ms (std::chrono Measured) + [ 0 28 41 42 79 91 134 179 209 254 284 300 335 ... 9421 9449 ] + passed +==== naive scan, power-of-two ==== + elapsed time: 0.006976ms (CUDA Measured) + [ 0 28 41 42 79 91 134 179 209 254 284 300 335 ... 9519 9552 ] + passed +==== naive scan, non-power-of-two ==== + elapsed time: 0.00688ms (CUDA Measured) + [ 0 28 41 42 79 91 134 179 209 254 284 300 335 ... 0 0 ] + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 0ms (CUDA Measured) + [ 0 28 41 42 79 91 134 179 209 254 284 300 335 ... 9519 9552 ] + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 0ms (CUDA Measured) + [ 0 28 41 42 79 91 134 179 209 254 284 300 335 ... 9421 9449 ] + passed +==== thrust scan, power-of-two ==== + elapsed time: 0.025152ms (CUDA Measured) + [ 0 28 41 42 79 91 134 179 209 254 284 300 335 ... 9519 9552 ] + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 0.0216ms (CUDA Measured) + [ 0 28 41 42 79 91 134 179 209 254 284 300 335 ... 9421 9449 ] + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 0 1 3 3 1 2 2 1 2 0 2 3 3 ... 2 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 0.001655ms (std::chrono Measured) + [ 1 3 3 1 2 2 1 2 2 3 3 1 2 ... 3 2 ] + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 0.001655ms (std::chrono Measured) + [ 1 3 3 1 2 2 1 2 2 3 3 1 2 ... 3 1 ] + passed +==== cpu compact with scan ==== + elapsed time: 0.001655ms (std::chrono Measured) + [ 1 3 3 1 2 2 1 2 2 3 3 1 2 ... 3 2 ] + passed +==== work-efficient compact, power-of-two ==== + elapsed time: 0.474944ms (CUDA Measured) + [ 1 3 3 1 2 2 1 2 2 3 3 1 2 ... 3 2 ] + passed +==== work-efficient compact, non-power-of-two ==== + elapsed time: 0.416544ms (CUDA Measured) + [ 1 3 3 1 2 2 1 2 2 3 3 1 2 ... 3 1 ] + passed + +``` \ No newline at end of file diff --git a/img/1.png b/img/1.png new file mode 100644 index 0000000000000000000000000000000000000000..33c6fd9e2984fb90f8067297bc102ef7f0620bc8 GIT binary patch literal 17812 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 V_2eGOBXBVx5~4E5T*Qkv{{j7I;>`d6 literal 0 HcmV?d00001 diff --git a/img/4.png b/img/4.png new file mode 100644 index 0000000000000000000000000000000000000000..79161af50f0b42653216d0c1a95fc38b2ca1b6df GIT binary patch literal 15312 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 literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp index 7305641..be529f4 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 = 384; // feel free to change the size of array const int NPOT = SIZE - 3; // Non-Power-Of-Two int a[SIZE], b[SIZE], c[SIZE]; @@ -49,42 +49,42 @@ 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); zeroArray(SIZE, c); 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); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); + printArray(SIZE, c, true); printCmpResult(SIZE, b, c); zeroArray(SIZE, c); printDesc("work-efficient scan, non-power-of-two"); StreamCompaction::Efficient::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(NPOT, c, true); + printArray(NPOT, c, true); printCmpResult(NPOT, b, c); zeroArray(SIZE, c); 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"); @@ -129,14 +129,14 @@ int main(int argc, char* argv[]) { printDesc("work-efficient compact, power-of-two"); count = StreamCompaction::Efficient::compact(SIZE, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(count, c, true); + printArray(count, c, true); printCmpLenResult(count, expectedCount, b, c); zeroArray(SIZE, c); printDesc("work-efficient compact, non-power-of-two"); count = StreamCompaction::Efficient::compact(NPOT, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(count, c, true); + printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); system("pause"); // stop Win32 console from closing on exit diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 8fc0211..5c1e416 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -24,6 +24,11 @@ namespace StreamCompaction { */ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { // TODO + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) { + return; + } + bools[index] = idata[index] == 0 ? 0 : 1; } /** @@ -32,8 +37,12 @@ namespace StreamCompaction { */ __global__ void kernScatter(int n, int *odata, const int *idata, const int *bools, const int *indices) { - // TODO - } + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n || bools[index] == 0) { + return; + } + odata[indices[index]] = idata[index]; + } } } diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 05ce667..9b9e12c 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -1,15 +1,15 @@ #include #include "cpu.h" -#include "common.h" +#include "common.h" namespace StreamCompaction { namespace CPU { - using StreamCompaction::Common::PerformanceTimer; - PerformanceTimer& timer() - { - static PerformanceTimer timer; - return timer; + using StreamCompaction::Common::PerformanceTimer; + PerformanceTimer& timer() + { + static PerformanceTimer timer; + return timer; } /** @@ -20,6 +20,10 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + odata[0] = 0; + for (int i(1); i < n; ++i) { + odata[i] = odata[i - 1] + idata[i - 1]; + } timer().endCpuTimer(); } @@ -29,10 +33,14 @@ namespace StreamCompaction { * @returns the number of elements remaining after compaction. */ int compactWithoutScan(int n, int *odata, const int *idata) { - timer().startCpuTimer(); - // TODO - timer().endCpuTimer(); - return -1; + int compactSum = 0; + + for (int i(0); i < n; ++i) { + if (idata[i] == 0) continue; + odata[compactSum++] = idata[i]; + } + + return compactSum; } /** @@ -41,10 +49,24 @@ namespace StreamCompaction { * @returns the number of elements remaining after compaction. */ int compactWithScan(int n, int *odata, const int *idata) { - timer().startCpuTimer(); - // TODO - timer().endCpuTimer(); - return -1; + int *flag = new int[n]; + int m = 0; + + for (int i = 0; i < n; ++i) { + flag[i] = idata[i] == 0 ? 0 : 1; + } + + scan(n, odata, flag); + m = odata[n - 1]; + + for (int i = 0; i < n; ++i) { + if (flag[i] == 0) continue; + odata[odata[i]] = idata[i]; + } + + delete flag; + + return m; } } } diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 36c5ef2..227b368 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -2,39 +2,114 @@ #include #include "common.h" #include "efficient.h" - +#define BLOCK_SIZE 896 namespace StreamCompaction { - namespace Efficient { - using StreamCompaction::Common::PerformanceTimer; - PerformanceTimer& timer() - { - static PerformanceTimer timer; - return timer; - } - - /** - * Performs prefix-sum (aka scan) on idata, storing the result into odata. - */ - void scan(int n, int *odata, const int *idata) { - timer().startGpuTimer(); - // TODO - timer().endGpuTimer(); - } - - /** - * Performs stream compaction on idata, storing the result into odata. - * All zeroes are discarded. - * - * @param n The number of elements in idata. - * @param odata The array into which to store elements. - * @param idata The array of elements to compact. - * @returns The number of elements remaining after compaction. - */ - int compact(int n, int *odata, const int *idata) { - timer().startGpuTimer(); - // TODO - timer().endGpuTimer(); - return -1; - } - } -} + namespace Efficient { + using StreamCompaction::Common::PerformanceTimer; + PerformanceTimer& timer() + { + static PerformanceTimer timer; + return timer; + } + + /** + * Performs prefix-sum (aka scan) on idata, storing the result into odata. + */ + __global__ void upSweep(const int n, const int step, int *data) { + + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) { + return; + } + int rIndex = n - 1 - index; + if (index - step >= 0 && (rIndex % (step * 2) == 0)) { + data[index] = data[index] + data[index - step]; + } + __syncthreads(); + } + + __global__ void downSweep(const int n, const int step, int *data) { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) { + return; + } + int rIndex = n - 1 - index; + ///Only certain index is working. + if (index - step >= 0 && (rIndex % (step * 2) == 0) ) { + auto tmp = data[index]; + data[index] += data[index - step]; + data[index - step] = tmp; + } + __syncthreads(); + } + + void scanOnGPU(const int n, int *dev_data) { + dim3 blockCount = (n - 1) / BLOCK_SIZE + 1; + int step; + for (step = 1; step < n; step <<= 1) { + upSweep << > >(n, step, dev_data); + } + cudaMemset(&dev_data[n - 1], 0, sizeof(int)); + for (step >>= 1; step > 0; step >>= 1) { + downSweep << > >(n, step, dev_data); + } + } + + void scan(int n, int *odata, const int *idata) { + // TODO + int *dev_data; + cudaMalloc((void**)&dev_data, sizeof(int) * n); + cudaMemcpy((void*)dev_data, (const void*)idata, sizeof(int) * n, cudaMemcpyHostToDevice); + scanOnGPU(n, dev_data); + cudaMemcpy((void*)odata, (const void*)dev_data, sizeof(int) * n, 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. + */ + int compact(int n, int *odata, const int *idata) { + // TODO + int count = 0; + int *dev_data; + int *dev_dataCopy; + int *dev_bool; + int *dev_indices; + for (int i = 0; i < n; ++i) + count = count + (idata[i] != 0); + + // device memory allocation + timer().startGpuTimer(); + + cudaMalloc((void**)&dev_data, sizeof(int) * n); + cudaMalloc((void**)&dev_dataCopy, sizeof(int) * n); + cudaMalloc((void**)&dev_bool, sizeof(int) * n); + cudaMalloc((void**)&dev_indices, sizeof(int) * n); + // copy input data to device + cudaMemcpy((void*)dev_data, (const void*)idata, sizeof(int) * n, cudaMemcpyHostToDevice); + dim3 blockCount = (n - 1) / BLOCK_SIZE + 1; + Common::kernMapToBoolean << > >(n, dev_bool, dev_data); + cudaMemcpy((void*)dev_indices, (const void*)dev_bool, sizeof(int) * n, cudaMemcpyDeviceToDevice); + scanOnGPU(n, dev_indices); + cudaMemcpy((void*)dev_dataCopy, (const void*)dev_data, sizeof(int) * n, cudaMemcpyDeviceToDevice); + Common::kernScatter << > >(n, dev_data, dev_dataCopy, dev_bool, dev_indices); + // copy result to host + cudaMemcpy((void*)odata, (const void*)dev_data, sizeof(int) * n, cudaMemcpyDeviceToHost); + + timer().endGpuTimer(); + // free memory on device + cudaFree(dev_data); + cudaFree(dev_dataCopy); + cudaFree(dev_bool); + cudaFree(dev_indices); + + return count; + } + } +} \ No newline at end of file diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 9218f8e..05186b4 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -3,23 +3,96 @@ #include "common.h" #include "naive.h" +#define BLOCK_SIZE 896 namespace StreamCompaction { namespace Naive { - using StreamCompaction::Common::PerformanceTimer; - PerformanceTimer& timer() - { - static PerformanceTimer timer; - return timer; + using StreamCompaction::Common::PerformanceTimer; + PerformanceTimer& timer() + { + static PerformanceTimer timer; + return timer; } // TODO: __global__ + // TODO: __global__ + __global__ void work(const int n, int *idata, int *odata) { + extern __shared__ int temp[]; + int index = blockIdx.x * blockDim.x + threadIdx.x; + + if (index >= n) { + return; + } + /* + if (index >= n) { + return; + } + + if (index - step < 0) { + odata[index] = idata[index]; + } else { + odata[index] = idata[index] + idata[index - step]; + } + */ + + int input = 1, output = 0; + temp[index] = idata[index]; + __syncthreads(); + //33 43 45 + //0 33 43 45 + //0 33 76 88 + //0 33 76 121 + for (int step = 1; step < n; step <<= 1) { + input ^= 1; + output ^= 1; + if (index - step < 0) { + temp[output * n + index] = temp[input * n + index]; + } + else { + temp[output * n + index] = temp[input * n + index] + temp[input * n + index - step]; + } + __syncthreads(); + } + odata[index] = temp[(output*n) + index]; + } + + __global__ void moveToExclusive(const int n, int *idata, int *odata) { + + int index = blockIdx.x * blockDim.x + threadIdx.x; + + if (index >= n) { + return; + } + else if (index == 0) { + odata[index] = 0; + return; + } + + 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) { - timer().startGpuTimer(); - // TODO - timer().endGpuTimer(); +// timer().startGpuTimer(); + int *dev_input; + int *dev_output; + int input = 1; + int output = 0; + // device memory allocation + cudaMalloc((void**)&dev_input, sizeof(int) * n); + cudaMalloc((void**)&dev_output, sizeof(int) * n); + cudaMemcpy(dev_output, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + dim3 blockCount = (n - 1) / BLOCK_SIZE + 1; + moveToExclusive << > >(n, dev_output, dev_input); + //We want exclusive result. Not inclusive. + timer().startGpuTimer(); + work << > >(n, dev_input, dev_output); + timer().endGpuTimer(); + cudaDeviceSynchronize(); + cudaMemcpy(odata, dev_output, sizeof(int) * n, cudaMemcpyDeviceToHost); + cudaFree(dev_input); + cudaFree(dev_output); +// timer().endGpuTimer(); } } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 36b732d..523515b 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -8,21 +8,27 @@ namespace StreamCompaction { namespace Thrust { - using StreamCompaction::Common::PerformanceTimer; - PerformanceTimer& timer() - { - static PerformanceTimer timer; - return timer; + using StreamCompaction::Common::PerformanceTimer; + PerformanceTimer& timer() + { + static PerformanceTimer timer; + return timer; } /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { +// timer().startGpuTimer(); + int *dev_data; + cudaMalloc((void**)&dev_data, sizeof(int) * n); + cudaMemcpy((void*)dev_data, (const void*)idata, sizeof(int) * n, cudaMemcpyHostToDevice); + thrust::device_ptr dev_thrust_data(dev_data); timer().startGpuTimer(); - // TODO use `thrust::exclusive_scan` - // example: for device_vectors dv_in and dv_out: - // thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); - timer().endGpuTimer(); + thrust::exclusive_scan(dev_thrust_data, dev_thrust_data + n, dev_thrust_data); + timer().endGpuTimer(); + cudaMemcpy((void*)odata, (const void*)dev_data, sizeof(int) * n, cudaMemcpyDeviceToHost); + cudaFree(dev_data); +// timer().endGpuTimer(); } } } From a7e6da54fe4edc7a1b9ef63dafd16c46db0215b8 Mon Sep 17 00:00:00 2001 From: lostink Date: Tue, 19 Sep 2017 16:18:18 -0400 Subject: [PATCH 2/7] Readme changed Readme changed. --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5266934..800d541 100644 --- a/README.md +++ b/README.md @@ -11,13 +11,13 @@ CUDA Stream Compaction ### Performance Analysis -![](images/1.png) +![](img/1.png) -![](images/2.png) +![](img/2.png) -![](images/3.png) +![](img/3.png) -![](images/4.png) +![](img/4.png) ### Running Result From fa8fc802d140cd033c69dcae619b9789a1558ff5 Mon Sep 17 00:00:00 2001 From: lostink Date: Tue, 19 Sep 2017 16:23:07 -0400 Subject: [PATCH 3/7] Readme updated. done. --- README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 800d541..1a80960 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,21 @@ CUDA Stream Compaction * Name: Jiahao Liu * Tested on: Windows 10, i7-3920XM CPU @ 2.90GHz 3.10 GHz 16GB, GTX 980m SLI 8192MB (personal computer) -### Features implemented +### Project Description and features implemented +* Project Description + +This project is tend to compare running performance difference in computing prefix sum between CPU scan, naive GPU scan, efficient GPU scan and thrust scan. + +* Project implemented + +** CPU scan + +** Naive GPU scan with shared memory + +** Efficient GPU scan + +** Thrust scan ### Performance Analysis From f1d932e6e8e8e36ac131330b2ea36c9c048bbf33 Mon Sep 17 00:00:00 2001 From: lostink Date: Tue, 19 Sep 2017 16:24:00 -0400 Subject: [PATCH 4/7] Readme updated. Done. --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1a80960..b554db9 100644 --- a/README.md +++ b/README.md @@ -12,15 +12,15 @@ CUDA Stream Compaction This project is tend to compare running performance difference in computing prefix sum between CPU scan, naive GPU scan, efficient GPU scan and thrust scan. -* Project implemented +* Features implemented -** CPU scan +CPU scan -** Naive GPU scan with shared memory +Naive GPU scan with shared memory -** Efficient GPU scan +Efficient GPU scan -** Thrust scan +Thrust scan ### Performance Analysis From 80aa6c80e2c085cf6657ca292a0b90785ccdfa7e Mon Sep 17 00:00:00 2001 From: lostink Date: Tue, 19 Sep 2017 16:25:41 -0400 Subject: [PATCH 5/7] Readme updated. done. --- README.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index b554db9..fab9843 100644 --- a/README.md +++ b/README.md @@ -6,23 +6,25 @@ CUDA Stream Compaction * Name: Jiahao Liu * Tested on: Windows 10, i7-3920XM CPU @ 2.90GHz 3.10 GHz 16GB, GTX 980m SLI 8192MB (personal computer) -### Project Description and features implemented +Project Description and features implemented +====================== -* Project Description +### Project Description This project is tend to compare running performance difference in computing prefix sum between CPU scan, naive GPU scan, efficient GPU scan and thrust scan. -* Features implemented +### Features implemented -CPU scan +* CPU scan -Naive GPU scan with shared memory +* Naive GPU scan with shared memory -Efficient GPU scan +* Efficient GPU scan -Thrust scan +* Thrust scan -### Performance Analysis +Performance Analysis +====================== ![](img/1.png) From 3379b2b95a7594844dbb3d73329838b28126ddf4 Mon Sep 17 00:00:00 2001 From: lostink Date: Tue, 19 Sep 2017 20:47:06 -0400 Subject: [PATCH 6/7] Performance analysis done. --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index fab9843..3491851 100644 --- a/README.md +++ b/README.md @@ -26,14 +26,23 @@ This project is tend to compare running performance difference in computing pref Performance Analysis ====================== +After trying I found for all the block size the program has the same performance, so I just chose the largest power of two as my block size. + ![](img/1.png) ![](img/2.png) +When includes the time of copy data from host to device, thrust scan and naive scan runs no faster then the CPU scan. + ![](img/3.png) +Even with data copy, the efficient scan runs faster then the CPU scan. + ![](img/4.png) +Only includes the time for computing, we can see the graph above. Thrust scan may have some built-in operations that really cost time. Naive scan roughly has more memory access then efficient scan( n^2/2 vs 3*n) but fewer calculating and comparing operations. This means the battleneck is on the memory I/O. We cannot evaluate thrust since we don't even know what happens inside. + +There is a very interesting that power-of-two thrust scan really spent some time. Comparing what I know for access array on ram with power-of-two length, this maybe the consequence for access confliction due to the time cost of finding next memory unit on hardware. ### Running Result From 572adb01bf68fa195210b5c7082f60aa5467485c Mon Sep 17 00:00:00 2001 From: lostink Date: Tue, 19 Sep 2017 22:05:26 -0400 Subject: [PATCH 7/7] Image bug fixed. done. --- img/2.png | Bin 15538 -> 15651 bytes img/3.png | Bin 13257 -> 13368 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/img/2.png b/img/2.png index 26f623b82e7450ed57fed83547abb53b8a36706a..21c3ed6cd7bca446db01c4c2ac4bfca1cf9e7f1e 100644 GIT binary patch literal 15651 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 V_2eGOBXBVx5~4E5T*Qkv{{j7I;>`d6