From f1ff2ce14333a77dcb6eafbf82aa0efbb1808505 Mon Sep 17 00:00:00 2001 From: Gizem Dal Date: Sat, 19 Sep 2020 00:01:44 -0400 Subject: [PATCH 01/21] Part 1 almost done --- stream_compaction/cpu.cu | 48 +++++++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 719fa11..97d920f 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -19,7 +19,15 @@ namespace StreamCompaction { */ void scan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // TODO + for (int i = 0; i < n; ++i) { + int prefix_idx = i - 1; + if (prefix_idx < 0) { + odata[i] = 0; + } + else { + odata[i] = odata[i - 1] + idata[i - 1]; + } + } timer().endCpuTimer(); } @@ -30,9 +38,16 @@ namespace StreamCompaction { */ int compactWithoutScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // TODO + int count = 0; + for (int i = 0; i < n; ++i) { + int elem = idata[i]; + if (elem != 0) { + odata[count] = elem; + count++; + } + } timer().endCpuTimer(); - return -1; + return count; } /** @@ -42,9 +57,32 @@ namespace StreamCompaction { */ int compactWithScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // TODO + int* temp = new int[n]; // create temp array + // fill temp array with 0s and 1s + for (int i = 0; i < n; ++i) { + int elem = idata[i]; + if (elem != 0) { + temp[i] = 1; + } + else { + temp[i] = 0; + } + } + // run scan + int* scanned = new int[n] {0}; + StreamCompaction::CPU::scan(n, scanned, temp); + // scatter + int count = 0; + for (int i = 0; i < n; ++i) { + if (temp[i] == 1) { + odata[scanned[i]] = idata[i]; + count++; + } + } + delete[] scanned; + delete[] temp; timer().endCpuTimer(); - return -1; + return count; } } } From 8bf13beb3746c134a0de7726d72238f03ad13535 Mon Sep 17 00:00:00 2001 From: Gizem Dal Date: Sat, 19 Sep 2020 10:38:53 -0400 Subject: [PATCH 02/21] Part 1 fixed - started Part 2 --- stream_compaction/cpu.cu | 18 +++++++++++++++++- stream_compaction/cpu.h | 2 ++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 97d920f..1a57d3f 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -31,6 +31,22 @@ namespace StreamCompaction { timer().endCpuTimer(); } + /** + * CPU scan (prefix sum) as a helper method. + * For performance analysis, this is supposed to be a simple for loop. + */ + void scanImplementation(int n, int* odata, const int* idata) { + for (int i = 0; i < n; ++i) { + int prefix_idx = i - 1; + if (prefix_idx < 0) { + odata[i] = 0; + } + else { + odata[i] = odata[i - 1] + idata[i - 1]; + } + } + } + /** * CPU stream compaction without using the scan function. * @@ -70,7 +86,7 @@ namespace StreamCompaction { } // run scan int* scanned = new int[n] {0}; - StreamCompaction::CPU::scan(n, scanned, temp); + StreamCompaction::CPU::scanImplementation(n, scanned, temp); // scatter int count = 0; for (int i = 0; i < n; ++i) { diff --git a/stream_compaction/cpu.h b/stream_compaction/cpu.h index 873c047..1b913c9 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 scanImplementation(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); From 5d2cfb9c0b74206566a6985cc15136e7925d7ec4 Mon Sep 17 00:00:00 2001 From: Gizem Dal Date: Sun, 20 Sep 2020 10:49:46 -0400 Subject: [PATCH 03/21] Part 4 done --- stream_compaction/thrust.cu | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 1def45e..f11bb95 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -18,11 +18,14 @@ namespace StreamCompaction { * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + thrust::host_vector host_in(idata, idata + n); + thrust::host_vector host_out(odata, odata + n); + thrust::device_vector dev_in = host_in; + thrust::device_vector dev_out = host_out; 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(dev_in.begin(), dev_in.end(), dev_out.begin()); timer().endGpuTimer(); + thrust::copy(dev_out.begin(), dev_out.end(), odata); } } } From c85522b4a2a47e83ba4300cc7ce30bcc6d65c7e8 Mon Sep 17 00:00:00 2001 From: Gizem Dal Date: Sun, 20 Sep 2020 19:15:17 -0400 Subject: [PATCH 04/21] Part 2 done --- src/main.cpp | 6 ++--- stream_compaction/naive.cu | 53 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 896ac2b..2c47afa 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -51,14 +51,14 @@ 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 + /*For bug-finding only: Array of 1s to help find bugs in stream compaction or scan onesArray(SIZE, c); printDesc("1s array for finding bugs"); StreamCompaction::Naive::scan(SIZE, c, a); - printArray(SIZE, c, true); */ + printArray(SIZE, c, true);*/ zeroArray(SIZE, c); printDesc("naive scan, non-power-of-two"); diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 4308876..714fa1e 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -1,7 +1,12 @@ #include #include +#include #include "common.h" #include "naive.h" +#include "thrust.h" +#include + +#define blockSize 128 namespace StreamCompaction { namespace Naive { @@ -11,15 +16,59 @@ namespace StreamCompaction { static PerformanceTimer timer; return timer; } - // TODO: __global__ + + __global__ void kernNaiveScan(int n, int d, int* in1, int* in2, int* out) { + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= n) { + return; + } + int pow2 = int(powf(2, d - 1)); + if (index >= pow2) { + out[index] = in1[index - pow2] + in1[index]; + } + in2[index] = out[index]; + } + + __global__ void kernShiftArray(int n, int* in1, int* in2) { + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= n) { + return; + } + if (index == 0) in2[index] = 0; + else { + in2[index] = in1[index - 1]; + } + } /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + // first allocate buffers and define kernel parameters + int* input; + int* input_temp; + int* output; + dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); + cudaMalloc((void**)&input, n * sizeof(int)); + cudaMalloc((void**)&input_temp, n * sizeof(int)); + cudaMalloc((void**)&output, n * sizeof(int)); + cudaMemcpy(input, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + cudaMemcpy(input_temp, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + cudaMemcpy(output, odata, sizeof(int) * n, cudaMemcpyHostToDevice); timer().startGpuTimer(); - // TODO + // append identity to beginning and shift array + kernShiftArray <<< fullBlocksPerGrid, blockSize >> > (n, input, input_temp); + std::swap(input_temp, input); + // make ilog2ceil(n) kernel calls for scan + for (int d = 1; d <= ilog2ceil(n); ++d) { + kernNaiveScan<<>>(n, d, input, input_temp, output); + std::swap(input, input_temp); + } timer().endGpuTimer(); + cudaMemcpy(odata, input, sizeof(int) * n, cudaMemcpyDeviceToHost); + cudaFree(input); + cudaFree(input_temp); + cudaFree(output); } } } From 797c45c5b323457f99ed802261a579302ff6c884 Mon Sep 17 00:00:00 2001 From: Gizem Dal Date: Sun, 20 Sep 2020 21:24:28 -0400 Subject: [PATCH 05/21] Part 3.1 done --- stream_compaction/efficient.cu | 66 +++++++++++++++++++++++++++++++++- stream_compaction/efficient.h | 2 ++ stream_compaction/naive.cu | 5 +-- 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 2db346e..1cb71a2 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -1,7 +1,12 @@ #include #include +#include +#include #include "common.h" #include "efficient.h" +#include "thrust.h" + +#define blockSize 128 namespace StreamCompaction { namespace Efficient { @@ -12,13 +17,72 @@ namespace StreamCompaction { return timer; } + __global__ void kernUpSweep(int n, int d, int* in, int pow2_d, int pow2_d1) { + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= n) { + return; + } + if (index % pow2_d1 == 0) { + in[index + pow2_d1 - 1] += in[index + pow2_d - 1]; + } + } + + __global__ void kernDownSweep(int n, int d, int* in, int pow2_d, int pow2_d1) { + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= n) { + return; + } + if (index % pow2_d1 == 0) { + int left = in[index + pow2_d - 1]; + in[index + pow2_d - 1] = in[index + pow2_d1 - 1]; + in[index + pow2_d1 - 1] += left; + } + } + + /** + * Helper method to calculate nearest power of 2 greater than or equal to n + */ + int distanceFromPowTwo(int n) { + int pos = ceil(log2(n)); + return int(powf(2, pos)) - n; + } + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + int* input; + int numItems = n; + int zerosToPad = distanceFromPowTwo(n); + if (zerosToPad == 0) { + cudaMalloc((void**)&input, numItems * sizeof(int)); + cudaMemcpy(input, idata, sizeof(int) * numItems, cudaMemcpyHostToDevice); + } + else { + numItems += zerosToPad; + cudaMalloc((void**)&input, numItems * sizeof(int)); + cudaMemcpy(input + zerosToPad, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + } + dim3 fullBlocksPerGrid((numItems + blockSize - 1) / blockSize); + thrust::device_ptr dev_ptr(input); + thrust::fill(dev_ptr, dev_ptr + zerosToPad, 0); timer().startGpuTimer(); - // TODO + // up sweep + for (int d = 0; d <= ilog2ceil(numItems) - 1; ++d) { + int pow2_d = int(powf(2, d)); + int pow2_d1 = int(powf(2, d + 1)); + kernUpSweep << > > (numItems, d, input, pow2_d, pow2_d1); + } + // down sweep + dev_ptr[numItems - 1] = 0; + for (int d = ilog2ceil(numItems) - 1; d >= 0; --d) { + int pow2_d = int(powf(2, d)); + int pow2_d1 = int(powf(2, d + 1)); + kernDownSweep << > > (numItems, d, input, pow2_d, pow2_d1); + } timer().endGpuTimer(); + cudaMemcpy(odata, input + zerosToPad, sizeof(int) * n, cudaMemcpyDeviceToHost); + cudaFree(input); } /** diff --git a/stream_compaction/efficient.h b/stream_compaction/efficient.h index 803cb4f..cd68a4b 100644 --- a/stream_compaction/efficient.h +++ b/stream_compaction/efficient.h @@ -6,6 +6,8 @@ namespace StreamCompaction { namespace Efficient { StreamCompaction::Common::PerformanceTimer& timer(); + int distanceFromPowTwo(int n); + void scan(int n, int *odata, const int *idata); int compact(int n, int *odata, const int *idata); diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 714fa1e..38d6512 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -1,10 +1,7 @@ #include #include -#include #include "common.h" #include "naive.h" -#include "thrust.h" -#include #define blockSize 128 @@ -61,7 +58,7 @@ namespace StreamCompaction { std::swap(input_temp, input); // make ilog2ceil(n) kernel calls for scan for (int d = 1; d <= ilog2ceil(n); ++d) { - kernNaiveScan<<>>(n, d, input, input_temp, output); + kernNaiveScan <<< fullBlocksPerGrid, blockSize >> > (n, d, input, input_temp, output); std::swap(input, input_temp); } timer().endGpuTimer(); From 2b01f9ea5200724f161ffa1519353b83eee29f5c Mon Sep 17 00:00:00 2001 From: Gizem Dal Date: Mon, 21 Sep 2020 00:54:56 -0400 Subject: [PATCH 06/21] Implementation done - check for possible optimization --- stream_compaction/common.cu | 13 ++++- stream_compaction/cpu.cu | 2 +- stream_compaction/efficient.cu | 91 +++++++++++++++++++++++++++++----- stream_compaction/naive.cu | 20 ++++---- 4 files changed, 99 insertions(+), 27 deletions(-) diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 2ed6d63..7b4c201 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -23,7 +23,13 @@ namespace StreamCompaction { * which map to 0 will be removed, and elements which map to 1 will be kept. */ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { - // TODO + int index = threadIdx.x + (blockIdx.x * blockDim.x); + + if (index >= n) return; + if (idata[index] == 0) bools[index] = 0; + else { + bools[index] = 1; + } } /** @@ -32,7 +38,10 @@ namespace StreamCompaction { */ __global__ void kernScatter(int n, int *odata, const int *idata, const int *bools, const int *indices) { - // TODO + int index = threadIdx.x + (blockIdx.x * blockDim.x); + + if (index >= n) return; + if (bools[index] == 1) odata[indices[index]] = idata[index]; } } diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 1a57d3f..75dacf9 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -95,9 +95,9 @@ namespace StreamCompaction { count++; } } + timer().endCpuTimer(); delete[] scanned; delete[] temp; - timer().endCpuTimer(); return count; } } diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 1cb71a2..b6e53f7 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -1,7 +1,6 @@ #include #include #include -#include #include "common.h" #include "efficient.h" #include "thrust.h" @@ -19,9 +18,8 @@ namespace StreamCompaction { __global__ void kernUpSweep(int n, int d, int* in, int pow2_d, int pow2_d1) { int index = threadIdx.x + (blockIdx.x * blockDim.x); - if (index >= n) { - return; - } + + if (index >= n) return; if (index % pow2_d1 == 0) { in[index + pow2_d1 - 1] += in[index + pow2_d - 1]; } @@ -29,9 +27,8 @@ namespace StreamCompaction { __global__ void kernDownSweep(int n, int d, int* in, int pow2_d, int pow2_d1) { int index = threadIdx.x + (blockIdx.x * blockDim.x); - if (index >= n) { - return; - } + + if (index >= n) return; if (index % pow2_d1 == 0) { int left = in[index + pow2_d - 1]; in[index + pow2_d - 1] = in[index + pow2_d1 - 1]; @@ -40,7 +37,7 @@ namespace StreamCompaction { } /** - * Helper method to calculate nearest power of 2 greater than or equal to n + * Helper method to calculate the distance from the nearest power of 2 greater than or equal to n */ int distanceFromPowTwo(int n) { int pos = ceil(log2(n)); @@ -62,10 +59,9 @@ namespace StreamCompaction { numItems += zerosToPad; cudaMalloc((void**)&input, numItems * sizeof(int)); cudaMemcpy(input + zerosToPad, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + cudaMemset(input, 0, zerosToPad * sizeof(int)); } dim3 fullBlocksPerGrid((numItems + blockSize - 1) / blockSize); - thrust::device_ptr dev_ptr(input); - thrust::fill(dev_ptr, dev_ptr + zerosToPad, 0); timer().startGpuTimer(); // up sweep for (int d = 0; d <= ilog2ceil(numItems) - 1; ++d) { @@ -74,7 +70,7 @@ namespace StreamCompaction { kernUpSweep << > > (numItems, d, input, pow2_d, pow2_d1); } // down sweep - dev_ptr[numItems - 1] = 0; + cudaMemset(input + numItems - 1, 0, sizeof(int)); for (int d = ilog2ceil(numItems) - 1; d >= 0; --d) { int pow2_d = int(powf(2, d)); int pow2_d1 = int(powf(2, d + 1)); @@ -95,10 +91,79 @@ namespace StreamCompaction { * @returns The number of elements remaining after compaction. */ int compact(int n, int *odata, const int *idata) { + int* input; // input array + int* output; // output array + int* bools; // boolean array + int* scanned; // scan result + int* scannedNoPow2; // scan result - no power of 2 + cudaMalloc((void**)&input, n * sizeof(int)); + cudaMemcpy(input, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + cudaMalloc((void**)&output, n * sizeof(int)); + cudaMalloc((void**)&bools, n * sizeof(int)); + cudaMalloc((void**)&scannedNoPow2, n * sizeof(int)); + int zerosToPad = distanceFromPowTwo(n); + int numItems = n + zerosToPad; + bool needsPadding = (zerosToPad != 0); + cudaMalloc((void**)&scanned, numItems * sizeof(int)); + + dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); + timer().startGpuTimer(); - // TODO + StreamCompaction::Common::kernMapToBoolean << > > (n, bools, input); + // do scan here + if (!needsPadding) { + cudaMemcpy(scanned, bools, sizeof(int) * n, cudaMemcpyDeviceToDevice); + for (int d = 0; d <= ilog2ceil(n) - 1; ++d) { + int pow2_d = int(powf(2, d)); + int pow2_d1 = int(powf(2, d + 1)); + kernUpSweep << > > (n, d, scanned, pow2_d, pow2_d1); + } + // down sweep + cudaMemset(scanned + n - 1, 0, sizeof(int)); + for (int d = ilog2ceil(n) - 1; d >= 0; --d) { + int pow2_d = int(powf(2, d)); + int pow2_d1 = int(powf(2, d + 1)); + kernDownSweep << > > (n, d, scanned, pow2_d, pow2_d1); + } + StreamCompaction::Common::kernScatter << < fullBlocksPerGrid, blockSize >> > (n, output, input, bools, scanned); + } + else { + cudaMemcpy(scanned + zerosToPad, bools, sizeof(int) * n, cudaMemcpyDeviceToDevice); + cudaMemset(scanned, 0, zerosToPad * sizeof(int)); + dim3 fullBlocksPerGridScan((numItems + blockSize - 1) / blockSize); + for (int d = 0; d <= ilog2ceil(numItems) - 1; ++d) { + int pow2_d = int(powf(2, d)); + int pow2_d1 = int(powf(2, d + 1)); + kernUpSweep << > > (numItems, d, scanned, pow2_d, pow2_d1); + } + // down sweep + cudaMemset(scanned + numItems - 1, 0, sizeof(int)); + for (int d = ilog2ceil(numItems) - 1; d >= 0; --d) { + int pow2_d = int(powf(2, d)); + int pow2_d1 = int(powf(2, d + 1)); + kernDownSweep << > > (numItems, d, scanned, pow2_d, pow2_d1); + } + cudaMemcpy(scannedNoPow2, scanned + zerosToPad, sizeof(int) * n, cudaMemcpyDeviceToDevice); + StreamCompaction::Common::kernScatter << < fullBlocksPerGrid, blockSize >> > (n, output, input, bools, scannedNoPow2); + } timer().endGpuTimer(); - return -1; + cudaMemcpy(odata, output, sizeof(int) * n, cudaMemcpyDeviceToHost); + int count = 0; + thrust::device_ptr D(output); + for (int i = 0; i < n; ++i) { + if (D[i] != 0) { + count++; + } + else { + break; + } + } + cudaFree(input); + cudaFree(output); + cudaFree(bools); + cudaFree(scanned); + cudaFree(scannedNoPow2); + return count; } } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 38d6512..669c992 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -14,23 +14,20 @@ namespace StreamCompaction { return timer; } - __global__ void kernNaiveScan(int n, int d, int* in1, int* in2, int* out) { + __global__ void kernNaiveScan(int n, int d, int* in1, int* in2, int* out, int pow2_d) { int index = threadIdx.x + (blockIdx.x * blockDim.x); - if (index >= n) { - return; - } - int pow2 = int(powf(2, d - 1)); - if (index >= pow2) { - out[index] = in1[index - pow2] + in1[index]; + + if (index >= n) return; + if (index >= pow2_d) { + out[index] = in1[index - pow2_d] + in1[index]; } in2[index] = out[index]; } __global__ void kernShiftArray(int n, int* in1, int* in2) { int index = threadIdx.x + (blockIdx.x * blockDim.x); - if (index >= n) { - return; - } + + if (index >= n) return; if (index == 0) in2[index] = 0; else { in2[index] = in1[index - 1]; @@ -58,7 +55,8 @@ namespace StreamCompaction { std::swap(input_temp, input); // make ilog2ceil(n) kernel calls for scan for (int d = 1; d <= ilog2ceil(n); ++d) { - kernNaiveScan <<< fullBlocksPerGrid, blockSize >> > (n, d, input, input_temp, output); + int pow2 = int(powf(2, d - 1)); + kernNaiveScan <<< fullBlocksPerGrid, blockSize >> > (n, d, input, input_temp, output, pow2); std::swap(input, input_temp); } timer().endGpuTimer(); From 678ee91f8a42f7abff7f35fa027bbad80e18ba73 Mon Sep 17 00:00:00 2001 From: Gizem Dal Date: Mon, 21 Sep 2020 16:30:49 -0400 Subject: [PATCH 07/21] pow function fix --- src/main.cpp | 6 +++--- stream_compaction/efficient.cu | 26 +++++++++++++------------- stream_compaction/naive.cu | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 2c47afa..b8dea24 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -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 @@ -81,7 +81,7 @@ int main(int argc, char* argv[]) { //printArray(NPOT, c, true); printCmpResult(NPOT, b, c); - zeroArray(SIZE, c); + /*zeroArray(SIZE, c); printDesc("thrust scan, power-of-two"); StreamCompaction::Thrust::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); @@ -93,7 +93,7 @@ int main(int argc, char* argv[]) { StreamCompaction::Thrust::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(NPOT, c, true); - printCmpResult(NPOT, b, c); + printCmpResult(NPOT, b, c);*/ printf("\n"); printf("*****************************\n"); diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index b6e53f7..792b458 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -41,7 +41,7 @@ namespace StreamCompaction { */ int distanceFromPowTwo(int n) { int pos = ceil(log2(n)); - return int(powf(2, pos)) - n; + return int(1 << pos) - n; } /** @@ -65,15 +65,15 @@ namespace StreamCompaction { timer().startGpuTimer(); // up sweep for (int d = 0; d <= ilog2ceil(numItems) - 1; ++d) { - int pow2_d = int(powf(2, d)); - int pow2_d1 = int(powf(2, d + 1)); + int pow2_d = 1 << d; + int pow2_d1 = 1 << (d + 1); kernUpSweep << > > (numItems, d, input, pow2_d, pow2_d1); } // down sweep cudaMemset(input + numItems - 1, 0, sizeof(int)); for (int d = ilog2ceil(numItems) - 1; d >= 0; --d) { - int pow2_d = int(powf(2, d)); - int pow2_d1 = int(powf(2, d + 1)); + int pow2_d = 1 << d; + int pow2_d1 = 1 << (d + 1); kernDownSweep << > > (numItems, d, input, pow2_d, pow2_d1); } timer().endGpuTimer(); @@ -114,15 +114,15 @@ namespace StreamCompaction { if (!needsPadding) { cudaMemcpy(scanned, bools, sizeof(int) * n, cudaMemcpyDeviceToDevice); for (int d = 0; d <= ilog2ceil(n) - 1; ++d) { - int pow2_d = int(powf(2, d)); - int pow2_d1 = int(powf(2, d + 1)); + int pow2_d = 1 << d; + int pow2_d1 = 1 << (d + 1); kernUpSweep << > > (n, d, scanned, pow2_d, pow2_d1); } // down sweep cudaMemset(scanned + n - 1, 0, sizeof(int)); for (int d = ilog2ceil(n) - 1; d >= 0; --d) { - int pow2_d = int(powf(2, d)); - int pow2_d1 = int(powf(2, d + 1)); + int pow2_d = 1 << d; + int pow2_d1 = 1 << (d + 1); kernDownSweep << > > (n, d, scanned, pow2_d, pow2_d1); } StreamCompaction::Common::kernScatter << < fullBlocksPerGrid, blockSize >> > (n, output, input, bools, scanned); @@ -132,15 +132,15 @@ namespace StreamCompaction { cudaMemset(scanned, 0, zerosToPad * sizeof(int)); dim3 fullBlocksPerGridScan((numItems + blockSize - 1) / blockSize); for (int d = 0; d <= ilog2ceil(numItems) - 1; ++d) { - int pow2_d = int(powf(2, d)); - int pow2_d1 = int(powf(2, d + 1)); + int pow2_d = 1 << d; + int pow2_d1 = 1 << (d + 1); kernUpSweep << > > (numItems, d, scanned, pow2_d, pow2_d1); } // down sweep cudaMemset(scanned + numItems - 1, 0, sizeof(int)); for (int d = ilog2ceil(numItems) - 1; d >= 0; --d) { - int pow2_d = int(powf(2, d)); - int pow2_d1 = int(powf(2, d + 1)); + int pow2_d = 1 << d; + int pow2_d1 = 1 << (d + 1); kernDownSweep << > > (numItems, d, scanned, pow2_d, pow2_d1); } cudaMemcpy(scannedNoPow2, scanned + zerosToPad, sizeof(int) * n, cudaMemcpyDeviceToDevice); diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 669c992..8b57f89 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -55,7 +55,7 @@ namespace StreamCompaction { std::swap(input_temp, input); // make ilog2ceil(n) kernel calls for scan for (int d = 1; d <= ilog2ceil(n); ++d) { - int pow2 = int(powf(2, d - 1)); + int pow2 = 1 << (d - 1); kernNaiveScan <<< fullBlocksPerGrid, blockSize >> > (n, d, input, input_temp, output, pow2); std::swap(input, input_temp); } From 19c3b2c0711b18c4124ea247a42d8fce23769710 Mon Sep 17 00:00:00 2001 From: Gizem <35783718+gizemdal@users.noreply.github.com> Date: Mon, 21 Sep 2020 16:33:39 -0400 Subject: [PATCH 08/21] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0e38ddb..fcdf106 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,9 @@ 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) +* Name: Gizem Dal + * [LinkedIn](https://www.linkedin.com/in/gizemdal), [personal website](https://www.gizemdal.com/) +* Tested on: Predator G3-571 Intel(R) Core(TM) i7-7700HQ CPU @ 2.80 GHz 2.81 GHz - Personal computer (borrowed my friend's computer for the semester) ### (TODO: Your README) From 9acdf3803a651275dfedf7b7f00024bc1601cd34 Mon Sep 17 00:00:00 2001 From: Gizem <35783718+gizemdal@users.noreply.github.com> Date: Mon, 21 Sep 2020 17:26:56 -0400 Subject: [PATCH 09/21] Update README.md --- README.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fcdf106..23df1b5 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,60 @@ CUDA Stream Compaction * [LinkedIn](https://www.linkedin.com/in/gizemdal), [personal website](https://www.gizemdal.com/) * Tested on: Predator G3-571 Intel(R) Core(TM) i7-7700HQ CPU @ 2.80 GHz 2.81 GHz - Personal computer (borrowed my friend's computer for the semester) -### (TODO: Your README) +**Project Description** -Include analysis, etc. (Remember, this is public, so don't put -anything here that you don't want to share with the world.) +The main focus of this project is implementing GPU stream compaction and other parallel algorithms in CUDA which are widely used and important for accelerating path tracers and algorithmic thinking. I implemented a few different versions of the Scan (Prefix Sum) algorithm including CPU scan, naive GPU scan, work-efficient GPU scan and GPU Thrust library scan. Then, I used some of these scan implementations to implement stream compaction for CPU and GPU. All of these implementations are timed in order to show runtime comparisons between different approaches and do a comprehensive runtime analysis in the following section. +**Performance Analysis** + +(Insert a screenshot of console here) +*Screenshot of the console with runtime values for different CPU and GPU scan implementations with randomly generated input array size and thread block size set to 256* + +For the performance analysis +```**************** +** SCAN TESTS ** +**************** + [ 46 27 0 28 19 24 10 37 8 21 7 41 15 ... 30 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 0.001ms (std::chrono Measured) + [ 0 46 73 73 101 120 144 154 191 199 220 227 268 ... 5999 6029 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 0.0005ms (std::chrono Measured) + [ 0 46 73 73 101 120 144 154 191 199 220 227 268 ... 5953 5975 ] + passed +==== naive scan, power-of-two ==== + elapsed time: 0.019456ms (CUDA Measured) + passed +==== naive scan, non-power-of-two ==== + elapsed time: 0.019456ms (CUDA Measured) + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 0.104448ms (CUDA Measured) + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 0.120832ms (CUDA Measured) + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 0 3 0 0 1 0 0 3 2 1 1 3 3 ... 2 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 0.0009ms (std::chrono Measured) + [ 3 1 3 2 1 1 3 3 2 3 3 2 1 ... 3 2 ] + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 0.0008ms (std::chrono Measured) + [ 3 1 3 2 1 1 3 3 2 3 3 2 1 ... 2 1 ] + passed +==== cpu compact with scan ==== + elapsed time: 0.0033ms (std::chrono Measured) + [ 3 1 3 2 1 1 3 3 2 3 3 2 1 ... 3 2 ] + passed +==== work-efficient compact, power-of-two ==== + elapsed time: 0.041984ms (CUDA Measured) + passed +==== work-efficient compact, non-power-of-two ==== + elapsed time: 0.171008ms (CUDA Measured) + passed +``` From b2d41d7167afb1682181957eb3763a3dd50b1018 Mon Sep 17 00:00:00 2001 From: Gizem Dal Date: Mon, 21 Sep 2020 18:30:35 -0400 Subject: [PATCH 10/21] efficiency improvement --- src/main.cpp | 6 +-- stream_compaction/efficient.cu | 75 +++++++++++----------------------- 2 files changed, 26 insertions(+), 55 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index b8dea24..ee24b66 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 << 10; // 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]; @@ -81,7 +81,7 @@ int main(int argc, char* argv[]) { //printArray(NPOT, c, true); printCmpResult(NPOT, b, c); - /*zeroArray(SIZE, c); + zeroArray(SIZE, c); printDesc("thrust scan, power-of-two"); StreamCompaction::Thrust::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); @@ -93,7 +93,7 @@ int main(int argc, char* argv[]) { StreamCompaction::Thrust::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(NPOT, c, true); - printCmpResult(NPOT, b, c);*/ + printCmpResult(NPOT, b, c); printf("\n"); printf("*****************************\n"); diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 792b458..a7a3e6e 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -95,75 +95,46 @@ namespace StreamCompaction { int* output; // output array int* bools; // boolean array int* scanned; // scan result - int* scannedNoPow2; // scan result - no power of 2 - cudaMalloc((void**)&input, n * sizeof(int)); - cudaMemcpy(input, idata, sizeof(int) * n, cudaMemcpyHostToDevice); - cudaMalloc((void**)&output, n * sizeof(int)); - cudaMalloc((void**)&bools, n * sizeof(int)); - cudaMalloc((void**)&scannedNoPow2, n * sizeof(int)); int zerosToPad = distanceFromPowTwo(n); int numItems = n + zerosToPad; - bool needsPadding = (zerosToPad != 0); + cudaMalloc((void**)&input, numItems * sizeof(int)); + cudaMemcpy(input + zerosToPad, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + cudaMemset(input, 0, zerosToPad * sizeof(int)); + cudaMalloc((void**)&output, numItems * sizeof(int)); + cudaMalloc((void**)&bools, numItems * sizeof(int)); cudaMalloc((void**)&scanned, numItems * sizeof(int)); - dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); + dim3 fullBlocksPerGrid((numItems + blockSize - 1) / blockSize); timer().startGpuTimer(); - StreamCompaction::Common::kernMapToBoolean << > > (n, bools, input); + StreamCompaction::Common::kernMapToBoolean << > > (numItems, bools, input); // do scan here - if (!needsPadding) { - cudaMemcpy(scanned, bools, sizeof(int) * n, cudaMemcpyDeviceToDevice); - for (int d = 0; d <= ilog2ceil(n) - 1; ++d) { - int pow2_d = 1 << d; - int pow2_d1 = 1 << (d + 1); - kernUpSweep << > > (n, d, scanned, pow2_d, pow2_d1); - } - // down sweep - cudaMemset(scanned + n - 1, 0, sizeof(int)); - for (int d = ilog2ceil(n) - 1; d >= 0; --d) { - int pow2_d = 1 << d; - int pow2_d1 = 1 << (d + 1); - kernDownSweep << > > (n, d, scanned, pow2_d, pow2_d1); - } - StreamCompaction::Common::kernScatter << < fullBlocksPerGrid, blockSize >> > (n, output, input, bools, scanned); + cudaMemcpy(scanned, bools, sizeof(int) * numItems, cudaMemcpyDeviceToDevice); + for (int d = 0; d <= ilog2ceil(numItems) - 1; ++d) { + int pow2_d = 1 << d; + int pow2_d1 = 1 << (d + 1); + kernUpSweep << > > (numItems, d, scanned, pow2_d, pow2_d1); } - else { - cudaMemcpy(scanned + zerosToPad, bools, sizeof(int) * n, cudaMemcpyDeviceToDevice); - cudaMemset(scanned, 0, zerosToPad * sizeof(int)); - dim3 fullBlocksPerGridScan((numItems + blockSize - 1) / blockSize); - for (int d = 0; d <= ilog2ceil(numItems) - 1; ++d) { - int pow2_d = 1 << d; - int pow2_d1 = 1 << (d + 1); - kernUpSweep << > > (numItems, d, scanned, pow2_d, pow2_d1); - } - // down sweep - cudaMemset(scanned + numItems - 1, 0, sizeof(int)); - for (int d = ilog2ceil(numItems) - 1; d >= 0; --d) { - int pow2_d = 1 << d; - int pow2_d1 = 1 << (d + 1); - kernDownSweep << > > (numItems, d, scanned, pow2_d, pow2_d1); - } - cudaMemcpy(scannedNoPow2, scanned + zerosToPad, sizeof(int) * n, cudaMemcpyDeviceToDevice); - StreamCompaction::Common::kernScatter << < fullBlocksPerGrid, blockSize >> > (n, output, input, bools, scannedNoPow2); + // down sweep + cudaMemset(scanned + numItems - 1, 0, sizeof(int)); + for (int d = ilog2ceil(numItems) - 1; d >= 0; --d) { + int pow2_d = 1 << d; + int pow2_d1 = 1 << (d + 1); + kernDownSweep << > > (numItems, d, scanned, pow2_d, pow2_d1); } + StreamCompaction::Common::kernScatter << < fullBlocksPerGrid, blockSize >> > (numItems, output, input, bools, scanned); timer().endGpuTimer(); cudaMemcpy(odata, output, sizeof(int) * n, cudaMemcpyDeviceToHost); - int count = 0; - thrust::device_ptr D(output); + int result = 0; for (int i = 0; i < n; ++i) { - if (D[i] != 0) { - count++; - } - else { - break; - } + if (odata[i] == 0) continue; + result++; } cudaFree(input); cudaFree(output); cudaFree(bools); cudaFree(scanned); - cudaFree(scannedNoPow2); - return count; + return result; } } } From 0b730da7af4c703245fc064a2c48f05bd0920ea5 Mon Sep 17 00:00:00 2001 From: Gizem <35783718+gizemdal@users.noreply.github.com> Date: Mon, 21 Sep 2020 19:29:38 -0400 Subject: [PATCH 11/21] Update README.md --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 23df1b5..5daaf57 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,8 @@ The main focus of this project is implementing GPU stream compaction and other p **Performance Analysis** -(Insert a screenshot of console here) -*Screenshot of the console with runtime values for different CPU and GPU scan implementations with randomly generated input array size and thread block size set to 256* +Both CPU and GPU timing functions are warapped up as a performance timer class in order to measure the time cost conveniently. We use *std::chrono* to provide CPU high-precision timing and CUDA event to measure the CUDA performance. In order to measure the performance of the implementation itself, I **have not** included the cost of initial and final memory operations on the GPU such as cudaMalloc() or cudaMemcpy(). -For the performance analysis ```**************** ** SCAN TESTS ** **************** From 60d9cca4f4bf7fef44a4f342ff95ff28f52c946f Mon Sep 17 00:00:00 2001 From: Gizem Dal Date: Mon, 21 Sep 2020 20:21:31 -0400 Subject: [PATCH 12/21] Add analysis images --- img/arraysizeNPOT.png | Bin 0 -> 39775 bytes img/arraysizePOT.png | Bin 0 -> 45891 bytes img/optimal_blocksize.png | Bin 0 -> 30831 bytes src/main.cpp | 19 ++++++++++++++++--- 4 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 img/arraysizeNPOT.png create mode 100644 img/arraysizePOT.png create mode 100644 img/optimal_blocksize.png diff --git a/img/arraysizeNPOT.png b/img/arraysizeNPOT.png new file mode 100644 index 0000000000000000000000000000000000000000..53fd7efdd0d6dd641b43bef5badf85b81a6dbffa GIT binary patch literal 39775 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 literal 0 HcmV?d00001 diff --git a/img/arraysizePOT.png b/img/arraysizePOT.png new file mode 100644 index 0000000000000000000000000000000000000000..09bf9773b193b32ae818c62426c8b564d8c85132 GIT binary patch literal 45891 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 Yf2HWI2$`&Uo) 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 RCQ|sES1v*>l%IEd_#b(EwUYn< literal 0 HcmV?d00001 diff --git a/img/optimal_blocksize.png b/img/optimal_blocksize.png new file mode 100644 index 0000000000000000000000000000000000000000..7fa883e53abb4cd5fae225f7451c9ff2fca98644 GIT binary patch literal 30831 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'fFVtgcn+Z=4xqQqB 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 WQU|_`SbgZ|YjV-z0^!`P$NvUzg0-ap literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp index ee24b66..f4edf2c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 10; // feel free to change the size of array +const int SIZE = 1 << 25; // 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]; @@ -35,13 +35,26 @@ int main(int argc, char* argv[]) { // 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"); + printDesc("cpu scan, power-of-two (First run)"); StreamCompaction::CPU::scan(SIZE, b, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(SIZE, b, true); + zeroArray(SIZE, b); + printDesc("cpu scan, power-of-two (Second run)"); + StreamCompaction::CPU::scan(SIZE, b, a); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + printArray(SIZE, b, true); + + zeroArray(SIZE, c); + printDesc("cpu scan, non-power-of-two (First run)"); + StreamCompaction::CPU::scan(NPOT, c, a); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + printArray(NPOT, b, true); + printCmpResult(NPOT, b, c); + zeroArray(SIZE, c); - printDesc("cpu scan, non-power-of-two"); + printDesc("cpu scan, non-power-of-two (Second run)"); StreamCompaction::CPU::scan(NPOT, c, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(NPOT, b, true); From 3dad5b9760a05242f20975b546c713c1aed5bbea Mon Sep 17 00:00:00 2001 From: Gizem <35783718+gizemdal@users.noreply.github.com> Date: Mon, 21 Sep 2020 21:02:47 -0400 Subject: [PATCH 13/21] Update README.md --- README.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5daaf57..ac48d81 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,24 @@ CUDA Stream Compaction **Project Description** -The main focus of this project is implementing GPU stream compaction and other parallel algorithms in CUDA which are widely used and important for accelerating path tracers and algorithmic thinking. I implemented a few different versions of the Scan (Prefix Sum) algorithm including CPU scan, naive GPU scan, work-efficient GPU scan and GPU Thrust library scan. Then, I used some of these scan implementations to implement stream compaction for CPU and GPU. All of these implementations are timed in order to show runtime comparisons between different approaches and do a comprehensive runtime analysis in the following section. +The main focus of this project is implementing GPU stream compaction and other parallel algorithms in CUDA which are widely used and important for accelerating path tracers and algorithmic thinking. I implemented a few different versions of the Scan (Prefix Sum) algorithm including CPU scan, naive GPU scan, work-efficient GPU scan and GPU Thrust library scan. Then, I used some of these scan implementations to implement stream compaction for CPU and GPU. All of these implementations are timed in order to show runtime comparisons between different approaches and do a comprehensive performance analysis in the following section. **Performance Analysis** -Both CPU and GPU timing functions are warapped up as a performance timer class in order to measure the time cost conveniently. We use *std::chrono* to provide CPU high-precision timing and CUDA event to measure the CUDA performance. In order to measure the performance of the implementation itself, I **have not** included the cost of initial and final memory operations on the GPU such as cudaMalloc() or cudaMemcpy(). +Both CPU and GPU timing functions are warapped up as a performance timer class in order to measure the time cost conveniently. We use *std::chrono* to provide CPU high-precision timing and CUDA event to measure the CUDA performance. In order to measure the performance of the implementation itself, I **have not** included the cost of initial and final memory operations on the GPU such as cudaMalloc() or cudaMemcpy() while timing the runtime. + +As the first step of the performance analysis, let's compare the performance of different scan implementations. In order to achieve this, I passed different block sizes to be used on the GPU while keeping the input size constant. I defined two input arrays with randomly generated integers where one array has a size of 2^20 (thus an exact power of 2) while the other array's size is 2^20 - 3. I will refer to the first array as **POT (Power Of Two)** and the second array as **NPOT (Non-Power Of Two)** for the rest of the analysis. + +![Block size versus Runtime](img/optimal_blocksize.png) +*Timed performances of CPU, GPU naive, GPU work-efficient & GPU thrust scan functions with different block sizes* + +As expected, changing the block size doesn't have a notable impact on the CPU scan. If we observe the time costs from naive and work-efficient GPU implementations we can see that using a block size of 32 makes the GPU scan functions significantly inefficient with large inputs. + +Block sizes greater than or equal to 64 have fluctuating time costs for the naive GPU scan for both POT and NPOT inputs. With the current array size, using a block size of 512 gives the most optimal outcome for this particular scan implementation. Although we don't have the same time cost for POT and NPOT inputs at block sizes 64, 128, 256 and 1024, the difference is somewhat negligible. + +If we observe the results from the work-efficient implementation, we can say that using 128 blocks is the most optimal with the current input size. Once we hit the optimal result at blockSize=128, increasing the block size to be greater than 128 results in inefficiency. With the optimal block size, this implementation runs faster than CPU and naive GPU scan with both POT or NPOT inputs. + +The GPU thrust scan performs the fastest with very little fluctuation between different block sizes. Increasing the block size doesn't seem to have a significant impact on thrust scan performance, in fact it can potentially result in a very slightly less efficient result with POT inputs. ```**************** ** SCAN TESTS ** From f365b0e1ecc3d49c6f8759cf50eadab036fc8f93 Mon Sep 17 00:00:00 2001 From: Gizem <35783718+gizemdal@users.noreply.github.com> Date: Mon, 21 Sep 2020 22:20:09 -0400 Subject: [PATCH 14/21] Update README.md --- README.md | 92 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 65 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index ac48d81..1b2897f 100644 --- a/README.md +++ b/README.md @@ -9,69 +9,107 @@ CUDA Stream Compaction **Project Description** -The main focus of this project is implementing GPU stream compaction and other parallel algorithms in CUDA which are widely used and important for accelerating path tracers and algorithmic thinking. I implemented a few different versions of the Scan (Prefix Sum) algorithm including CPU scan, naive GPU scan, work-efficient GPU scan and GPU Thrust library scan. Then, I used some of these scan implementations to implement stream compaction for CPU and GPU. All of these implementations are timed in order to show runtime comparisons between different approaches and do a comprehensive performance analysis in the following section. +The main focus of this project is implementing GPU stream compaction and other parallel algorithms in CUDA which are widely used and important for accelerating path tracers and algorithmic thinking. I implemented a few different versions of the Scan (Prefix Sum) algorithm including CPU scan, naive GPU scan, work-efficient GPU scan and GPU Thrust library scan. Then, I used some of these scan implementations to implement stream compaction for CPU and GPU. All of these implementations are timed in order to show runtime comparisons between different approaches and do a comprehensive performance analysis. + +**Project Tasks** + +* **CPU Algorithms** + * CPU Scan + * CPU Stream Compaction (without Scan) + * CPU Stream Compaction (with Scan) +* **GPU Algorithms** + * Naive Scan + * Work-Efficient Scan + * Work-Efficient Stream Compaction + * Thrust Scan **Performance Analysis** Both CPU and GPU timing functions are warapped up as a performance timer class in order to measure the time cost conveniently. We use *std::chrono* to provide CPU high-precision timing and CUDA event to measure the CUDA performance. In order to measure the performance of the implementation itself, I **have not** included the cost of initial and final memory operations on the GPU such as cudaMalloc() or cudaMemcpy() while timing the runtime. -As the first step of the performance analysis, let's compare the performance of different scan implementations. In order to achieve this, I passed different block sizes to be used on the GPU while keeping the input size constant. I defined two input arrays with randomly generated integers where one array has a size of 2^20 (thus an exact power of 2) while the other array's size is 2^20 - 3. I will refer to the first array as **POT (Power Of Two)** and the second array as **NPOT (Non-Power Of Two)** for the rest of the analysis. +As the first step of the performance analysis, let's compare the performance of different scan implementations. In order to achieve this, I passed different block sizes to be used on the GPU while keeping the input size constant. I defined one input array with randomly generated integers except I read two different amounts of items: 2^20 (thus an exact power of 2) and 2^20 - 3 (thus 3 integers less). I will refer to the first size as **POT (Power Of Two)** and the second size as **NPOT (Non-Power Of Two)** for the rest of the analysis. ![Block size versus Runtime](img/optimal_blocksize.png) *Timed performances of CPU, GPU naive, GPU work-efficient & GPU thrust scan functions with different block sizes* -As expected, changing the block size doesn't have a notable impact on the CPU scan. If we observe the time costs from naive and work-efficient GPU implementations we can see that using a block size of 32 makes the GPU scan functions significantly inefficient with large inputs. +As expected, changing the block size doesn't have a notable impact on the CPU scan. However, there is a significant performance gap between CPU scan calls with POT and NPOT. Since I'm running the CPU scan with POT before the CPU scan with NPOT, it's possible that the array could be stored in cache after the first test, which would result in making the second test unintentionally run faster. + +Using a block size of 32 makes the naive and work efficient GPU scan functions significantly inefficient with large inputs. Block sizes greater than or equal to 64 have fluctuating time costs for the naive GPU scan for both POT and NPOT. With the current array size, using a block size of 512 gives the most optimal outcome for this particular scan implementation. Although we don't have the same time cost for POT and NPOT inputs at block sizes 64, 128, 256 and 1024, the difference is somewhat negligible. If we observe the results from the work-efficient implementation, we can say that using 128 blocks is the most optimal with the current input size. Once we hit the optimal result at blockSize=128, increasing the block size to be greater than 128 results in inefficiency. With the optimal block size, this implementation runs faster than CPU and naive GPU scan with both POT or NPOT inputs. + +The GPU thrust scan performs the fastest by a significant difference with very little fluctuation between different block sizes. It's possible that thrust scan could be using some methods to reduce memory latency. Increasing the block size doesn't seem to have a notable impact on thrust scan performance, in fact it can sometimes result in a very slightly less efficient result with POT inputs. + +As the next step of the analysis, I measured the performance of all the scan implementations with different input sizes while maintaining the block size at 128. I split the data into two categories: POT and NPOT. + +**Array Size (POT) versus Measured Performance** + +![Array size vs Performance](img/arraysizePOT.png) -Block sizes greater than or equal to 64 have fluctuating time costs for the naive GPU scan for both POT and NPOT inputs. With the current array size, using a block size of 512 gives the most optimal outcome for this particular scan implementation. Although we don't have the same time cost for POT and NPOT inputs at block sizes 64, 128, 256 and 1024, the difference is somewhat negligible. +**Array Size (NPOT) versus Measured Performance** -If we observe the results from the work-efficient implementation, we can say that using 128 blocks is the most optimal with the current input size. Once we hit the optimal result at blockSize=128, increasing the block size to be greater than 128 results in inefficiency. With the optimal block size, this implementation runs faster than CPU and naive GPU scan with both POT or NPOT inputs. +![Array size vs Performance](img/arraysizeNPOT.png) -The GPU thrust scan performs the fastest with very little fluctuation between different block sizes. Increasing the block size doesn't seem to have a significant impact on thrust scan performance, in fact it can potentially result in a very slightly less efficient result with POT inputs. +CPU implementation works the fastest with small inputs, however its runtime scales up very quickly once the input size gets closer to 1 million. The CPU scan is facing the same phenomenon between POT and NPOT inputs as the previous section. We don't observe the work-efficient and Thrust scan implementations to be faster than naive implementation until we hit much larger input sizes where we benefit more from parallelism. Although the work-efficient approach runs significantly faster than the naive approach once the 1 million mark is hit, it still gets inefficient very quickly while the thrust implementation remains significantly fast in comparison. This could be due to a bottleneck in work-efficient implementation memory I/O which could be resolved by using shared instead of global memory. -```**************** +To provide an insight on how the performance is measured, I included a sample performance test outputs below. These tests use a block size of 128 and input size of 2^18. + +``` +**************** ** SCAN TESTS ** **************** - [ 46 27 0 28 19 24 10 37 8 21 7 41 15 ... 30 0 ] -==== cpu scan, power-of-two ==== - elapsed time: 0.001ms (std::chrono Measured) - [ 0 46 73 73 101 120 144 154 191 199 220 227 268 ... 5999 6029 ] -==== cpu scan, non-power-of-two ==== - elapsed time: 0.0005ms (std::chrono Measured) - [ 0 46 73 73 101 120 144 154 191 199 220 227 268 ... 5953 5975 ] + [ 3 28 39 7 17 30 13 2 29 5 29 6 44 ... 1 0 ] +==== cpu scan, power-of-two (First run) ==== + elapsed time: 1.1686ms (std::chrono Measured) + [ 0 3 31 70 77 94 124 137 139 168 173 202 208 ... 6421970 6421971 ] +==== cpu scan, power-of-two (Second run) ==== + elapsed time: 1.1714ms (std::chrono Measured) + [ 0 3 31 70 77 94 124 137 139 168 173 202 208 ... 6421970 6421971 ] +==== cpu scan, non-power-of-two (First run) ==== + elapsed time: 0.4859ms (std::chrono Measured) + [ 0 3 31 70 77 94 124 137 139 168 173 202 208 ... 6421921 6421944 ] + passed +==== cpu scan, non-power-of-two (Second run) ==== + elapsed time: 0.4544ms (std::chrono Measured) + [ 0 3 31 70 77 94 124 137 139 168 173 202 208 ... 6421921 6421944 ] passed ==== naive scan, power-of-two ==== - elapsed time: 0.019456ms (CUDA Measured) + elapsed time: 0.415968ms (CUDA Measured) passed ==== naive scan, non-power-of-two ==== - elapsed time: 0.019456ms (CUDA Measured) + elapsed time: 0.421344ms (CUDA Measured) passed ==== work-efficient scan, power-of-two ==== - elapsed time: 0.104448ms (CUDA Measured) + elapsed time: 0.527264ms (CUDA Measured) passed ==== work-efficient scan, non-power-of-two ==== - elapsed time: 0.120832ms (CUDA Measured) + elapsed time: 0.503168ms (CUDA Measured) + passed +==== thrust scan, power-of-two ==== + elapsed time: 0.306752ms (CUDA Measured) + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 0.299136ms (CUDA Measured) passed ***************************** ** STREAM COMPACTION TESTS ** ***************************** - [ 0 3 0 0 1 0 0 3 2 1 1 3 3 ... 2 0 ] + [ 1 2 1 3 1 2 1 0 1 1 1 0 2 ... 3 0 ] ==== cpu compact without scan, power-of-two ==== - elapsed time: 0.0009ms (std::chrono Measured) - [ 3 1 3 2 1 1 3 3 2 3 3 2 1 ... 3 2 ] + elapsed time: 0.8395ms (std::chrono Measured) + [ 1 2 1 3 1 2 1 1 1 1 2 3 2 ... 1 3 ] passed ==== cpu compact without scan, non-power-of-two ==== - elapsed time: 0.0008ms (std::chrono Measured) - [ 3 1 3 2 1 1 3 3 2 3 3 2 1 ... 2 1 ] + elapsed time: 0.7936ms (std::chrono Measured) + [ 1 2 1 3 1 2 1 1 1 1 2 3 2 ... 1 3 ] passed ==== cpu compact with scan ==== - elapsed time: 0.0033ms (std::chrono Measured) - [ 3 1 3 2 1 1 3 3 2 3 3 2 1 ... 3 2 ] + elapsed time: 2.1656ms (std::chrono Measured) + [ 1 2 1 3 1 2 1 1 1 1 2 3 2 ... 1 3 ] passed ==== work-efficient compact, power-of-two ==== - elapsed time: 0.041984ms (CUDA Measured) + elapsed time: 0.43952ms (CUDA Measured) passed ==== work-efficient compact, non-power-of-two ==== - elapsed time: 0.171008ms (CUDA Measured) + elapsed time: 0.443168ms (CUDA Measured) passed ``` From afe9fc4fed7ee23122560fedfd117e9e702dadfa Mon Sep 17 00:00:00 2001 From: Gizem Dal Date: Mon, 21 Sep 2020 22:22:48 -0400 Subject: [PATCH 15/21] POT graph fix --- img/arraysizePOT.png | Bin 45891 -> 47550 bytes src/main.cpp | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/img/arraysizePOT.png b/img/arraysizePOT.png index 09bf9773b193b32ae818c62426c8b564d8c85132..3bd46d166ecfe8a4300b230e47f53a760660b728 100644 GIT binary patch literal 47550 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 Yf2HWI2$`&Uo) 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 RCQ|sES1v*>l%IEd_#b(EwUYn< diff --git a/src/main.cpp b/src/main.cpp index f4edf2c..a33136f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 25; // feel free to change the size of array +const int SIZE = 1 << 18; // 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]; From eabf1cbf7dcaa4874c3da7c37cf4ff0d285a3dee Mon Sep 17 00:00:00 2001 From: Gizem Dal Date: Mon, 21 Sep 2020 22:24:23 -0400 Subject: [PATCH 16/21] POT image fix --- img/{arraysizePOT.png => arraysizePOT2.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename img/{arraysizePOT.png => arraysizePOT2.png} (100%) diff --git a/img/arraysizePOT.png b/img/arraysizePOT2.png similarity index 100% rename from img/arraysizePOT.png rename to img/arraysizePOT2.png From aa96254761ae7eb54dbe6c96d04a17084f0cb43b Mon Sep 17 00:00:00 2001 From: Gizem <35783718+gizemdal@users.noreply.github.com> Date: Mon, 21 Sep 2020 22:24:45 -0400 Subject: [PATCH 17/21] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1b2897f..7e7fbae 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ As the next step of the analysis, I measured the performance of all the scan imp **Array Size (POT) versus Measured Performance** -![Array size vs Performance](img/arraysizePOT.png) +![Array size vs Performance](img/arraysizePOT2.png) **Array Size (NPOT) versus Measured Performance** From c5531733800a9be27598d0fb411fa44964fc4d11 Mon Sep 17 00:00:00 2001 From: Gizem Dal Date: Tue, 22 Sep 2020 11:59:09 -0400 Subject: [PATCH 18/21] Fix graph images --- img/compactiongraph.png | Bin 0 -> 56239 bytes img/scangraph.png | Bin 0 -> 61242 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/compactiongraph.png create mode 100644 img/scangraph.png diff --git a/img/compactiongraph.png b/img/compactiongraph.png new file mode 100644 index 0000000000000000000000000000000000000000..6f4b05109756df7c0b0b689c4b041cfe5a71224f GIT binary patch literal 56239 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�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 Date: Tue, 22 Sep 2020 12:12:56 -0400 Subject: [PATCH 19/21] Update README.md --- README.md | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 7e7fbae..822e3dd 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ The main focus of this project is implementing GPU stream compaction and other p Both CPU and GPU timing functions are warapped up as a performance timer class in order to measure the time cost conveniently. We use *std::chrono* to provide CPU high-precision timing and CUDA event to measure the CUDA performance. In order to measure the performance of the implementation itself, I **have not** included the cost of initial and final memory operations on the GPU such as cudaMalloc() or cudaMemcpy() while timing the runtime. -As the first step of the performance analysis, let's compare the performance of different scan implementations. In order to achieve this, I passed different block sizes to be used on the GPU while keeping the input size constant. I defined one input array with randomly generated integers except I read two different amounts of items: 2^20 (thus an exact power of 2) and 2^20 - 3 (thus 3 integers less). I will refer to the first size as **POT (Power Of Two)** and the second size as **NPOT (Non-Power Of Two)** for the rest of the analysis. +As the first step of the performance analysis, let's compare the performance of different scan implementations. In order to achieve this, I passed different block sizes to be used on the GPU while keeping the input size constant. I defined one input array with randomly generated integers except I read two different amounts of items: 2^20 (thus an exact power of 2) and 2^20 - 3 (thus 3 integers less). I will refer to the first size as **POT (Power Of Two)** and the second size as **NPOT (Non-Power Of Two)**. ![Block size versus Runtime](img/optimal_blocksize.png) *Timed performances of CPU, GPU naive, GPU work-efficient & GPU thrust scan functions with different block sizes* @@ -38,17 +38,33 @@ Using a block size of 32 makes the naive and work efficient GPU scan functions s The GPU thrust scan performs the fastest by a significant difference with very little fluctuation between different block sizes. It's possible that thrust scan could be using some methods to reduce memory latency. Increasing the block size doesn't seem to have a notable impact on thrust scan performance, in fact it can sometimes result in a very slightly less efficient result with POT inputs. -As the next step of the analysis, I measured the performance of all the scan implementations with different input sizes while maintaining the block size at 128. I split the data into two categories: POT and NPOT. +As the next step of the analysis, I measured the performance of all the scan and stream compaction implementations with different input sizes while maintaining the block size at 128. -**Array Size (POT) versus Measured Performance** +**Array Size versus Scan Measured Performance** -![Array size vs Performance](img/arraysizePOT2.png) +![Array size vs Scan Performance](img/scangraph.png) -**Array Size (NPOT) versus Measured Performance** +**Array Size versus Stream Compaction Measured Performance** -![Array size vs Performance](img/arraysizeNPOT.png) +![Array size vs Compaction Performance](img/compactiongraph.png) -CPU implementation works the fastest with small inputs, however its runtime scales up very quickly once the input size gets closer to 1 million. The CPU scan is facing the same phenomenon between POT and NPOT inputs as the previous section. We don't observe the work-efficient and Thrust scan implementations to be faster than naive implementation until we hit much larger input sizes where we benefit more from parallelism. Although the work-efficient approach runs significantly faster than the naive approach once the 1 million mark is hit, it still gets inefficient very quickly while the thrust implementation remains significantly fast in comparison. This could be due to a bottleneck in work-efficient implementation memory I/O which could be resolved by using shared instead of global memory. +I also measured the performances with very large input sizes (greater than 1 million). Since it is difficult to represent this data with a graph, I have included a table below for both scan and stream compaction performances. + +**Array Size versus Scan Measured Performance** + +Method | CPU | Naive | Work Efficient | Thrust +:---: | :---: | :---: | :---: | :---: +Array size = 2^20 | 5.2834 ms | 1.813 ms | 1.628 ms | 0.26 ms +Array size = 2^15 | 152.3 ms | 75.14 ms | 50 ms | 2.18 ms + +**Array Size versus Stream Compaction Measured Performance** + +Method | CPU (with scan) | Work Efficient +:---: | :---: | :---: +Array size = 2^20 | 8.75 ms | 1.85 ms +Array size = 2^15 | 256.065 ms | 53.5 ms + +CPU implementations works the fastest with small inputs, however their runtimes scales up very quickly once the input size gets closer to 1 million. We don't observe the work-efficient and Thrust scan implementations to be faster than naive implementation until we hit much larger input sizes where we benefit more from parallelism. Although the work-efficient approach runs significantly faster than the naive approach once the 1 million mark is hit, it still gets inefficient very quickly while the thrust implementation remains significantly fast in comparison. This could be due to a bottleneck in work-efficient implementation memory I/O which could be resolved by using shared instead of global memory. To provide an insight on how the performance is measured, I included a sample performance test outputs below. These tests use a block size of 128 and input size of 2^18. From 6fc1cb8e6bbe01da67c6a6237464bb37c9e82af3 Mon Sep 17 00:00:00 2001 From: Gizem <35783718+gizemdal@users.noreply.github.com> Date: Tue, 22 Sep 2020 15:31:58 -0400 Subject: [PATCH 20/21] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 822e3dd..7cf7aa2 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ The main focus of this project is implementing GPU stream compaction and other p **Performance Analysis** -Both CPU and GPU timing functions are warapped up as a performance timer class in order to measure the time cost conveniently. We use *std::chrono* to provide CPU high-precision timing and CUDA event to measure the CUDA performance. In order to measure the performance of the implementation itself, I **have not** included the cost of initial and final memory operations on the GPU such as cudaMalloc() or cudaMemcpy() while timing the runtime. +Both CPU and GPU timing functions are wrapped up as a performance timer class in order to measure the time cost conveniently. We use *std::chrono* to provide CPU high-precision timing and CUDA event to measure the CUDA performance. In order to measure the performance of the implementation itself, I **have not** included the cost of initial and final memory operations on the GPU such as cudaMalloc() or cudaMemcpy() while timing the runtime. As the first step of the performance analysis, let's compare the performance of different scan implementations. In order to achieve this, I passed different block sizes to be used on the GPU while keeping the input size constant. I defined one input array with randomly generated integers except I read two different amounts of items: 2^20 (thus an exact power of 2) and 2^20 - 3 (thus 3 integers less). I will refer to the first size as **POT (Power Of Two)** and the second size as **NPOT (Non-Power Of Two)**. From 17159606075b1b9feb449192093d8333b72987fe Mon Sep 17 00:00:00 2001 From: Gizem <35783718+gizemdal@users.noreply.github.com> Date: Tue, 22 Sep 2020 15:40:12 -0400 Subject: [PATCH 21/21] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7cf7aa2..fc2836f 100644 --- a/README.md +++ b/README.md @@ -55,14 +55,14 @@ I also measured the performances with very large input sizes (greater than 1 mil Method | CPU | Naive | Work Efficient | Thrust :---: | :---: | :---: | :---: | :---: Array size = 2^20 | 5.2834 ms | 1.813 ms | 1.628 ms | 0.26 ms -Array size = 2^15 | 152.3 ms | 75.14 ms | 50 ms | 2.18 ms +Array size = 2^25 | 152.3 ms | 75.14 ms | 50 ms | 2.18 ms **Array Size versus Stream Compaction Measured Performance** Method | CPU (with scan) | Work Efficient :---: | :---: | :---: Array size = 2^20 | 8.75 ms | 1.85 ms -Array size = 2^15 | 256.065 ms | 53.5 ms +Array size = 2^25 | 256.065 ms | 53.5 ms CPU implementations works the fastest with small inputs, however their runtimes scales up very quickly once the input size gets closer to 1 million. We don't observe the work-efficient and Thrust scan implementations to be faster than naive implementation until we hit much larger input sizes where we benefit more from parallelism. Although the work-efficient approach runs significantly faster than the naive approach once the 1 million mark is hit, it still gets inefficient very quickly while the thrust implementation remains significantly fast in comparison. This could be due to a bottleneck in work-efficient implementation memory I/O which could be resolved by using shared instead of global memory.