From 14eb0695c32ef7a06f7ff10932b339a42ea6707e Mon Sep 17 00:00:00 2001 From: Salaar Kohari Date: Thu, 13 Sep 2018 17:10:58 -0400 Subject: [PATCH 1/8] Added Part 1: CPU --- stream_compaction/cpu.cu | 42 ++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 05ce667..59ddd9e 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; } /** @@ -18,9 +18,12 @@ namespace StreamCompaction { * (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) { - timer().startCpuTimer(); - // TODO - timer().endCpuTimer(); + timer().startCpuTimer(); + odata[0] = idata[0]; + for (int i = 1; i < n; ++i) { + odata[i] = idata[i] + idata[i - 1]; + } + timer().endCpuTimer(); } /** @@ -30,9 +33,14 @@ namespace StreamCompaction { */ int compactWithoutScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // TODO + int count = 0; + for (int i = 0; i < n; ++i) { + if (idata[i] != 0) { + odata[count++] = idata[i]; + } + } timer().endCpuTimer(); - return -1; + return count; } /** @@ -42,7 +50,17 @@ namespace StreamCompaction { */ int compactWithScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // TODO + int mapped[n]; + for (int i = 0; i < n; ++i) { + mapped[i] = idata[i] != 0 ? 1 : 0; + } + int scanned[n]; + scan(n, scanned, mapped); + for (int i = 0; i < n; ++i) { + if (mapped[i] != 0) { + odata[scanned[i]] = idata[i]; + } + } timer().endCpuTimer(); return -1; } From eeb08750f765babdfcade0ad68138f71680d67fb Mon Sep 17 00:00:00 2001 From: Eric Chiu Date: Sat, 15 Sep 2018 16:29:59 -0400 Subject: [PATCH 2/8] Part 2 progress --- src/main.cpp | 2 + stream_compaction/CMakeLists.txt | 2 +- stream_compaction/cpu.cu | 106 +++++++++++++++---------------- stream_compaction/naive.cu | 34 ++++++++-- 4 files changed, 83 insertions(+), 61 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 1850161..6da530f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -67,6 +67,7 @@ int main(int argc, char* argv[]) { //printArray(SIZE, c, true); printCmpResult(NPOT, b, c); + /* zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); StreamCompaction::Efficient::scan(SIZE, c, a); @@ -146,6 +147,7 @@ int main(int argc, char* argv[]) { printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); + */ system("pause"); // stop Win32 console from closing on exit delete[] a; diff --git a/stream_compaction/CMakeLists.txt b/stream_compaction/CMakeLists.txt index cdbef77..c8709e7 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_50 ) diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 59ddd9e..c7de2e5 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -4,65 +4,65 @@ #include "common.h" namespace StreamCompaction { - namespace CPU { - using StreamCompaction::Common::PerformanceTimer; - PerformanceTimer& timer() - { - static PerformanceTimer timer; - return timer; - } - - /** - * CPU scan (prefix sum). - * 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) { - timer().startCpuTimer(); - odata[0] = idata[0]; - for (int i = 1; i < n; ++i) { - odata[i] = idata[i] + idata[i - 1]; + namespace CPU { + using StreamCompaction::Common::PerformanceTimer; + PerformanceTimer& timer() + { + static PerformanceTimer timer; + return timer; } - timer().endCpuTimer(); - } - /** - * CPU stream compaction without using the scan function. - * - * @returns the number of elements remaining after compaction. - */ - int compactWithoutScan(int n, int *odata, const int *idata) { - timer().startCpuTimer(); - int count = 0; - for (int i = 0; i < n; ++i) { - if (idata[i] != 0) { - odata[count++] = idata[i]; + /** + * CPU scan (prefix sum). + * 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) { + timer().startCpuTimer(); + odata[0] = idata[0]; + for (int i = 1; i < n; ++i) { + odata[i] = idata[i] + idata[i - 1]; } + timer().endCpuTimer(); } - timer().endCpuTimer(); - return count; - } - /** - * CPU stream compaction using scan and scatter, like the parallel version. - * - * @returns the number of elements remaining after compaction. - */ - int compactWithScan(int n, int *odata, const int *idata) { - timer().startCpuTimer(); - int mapped[n]; - for (int i = 0; i < n; ++i) { - mapped[i] = idata[i] != 0 ? 1 : 0; + /** + * CPU stream compaction without using the scan function. + * + * @returns the number of elements remaining after compaction. + */ + int compactWithoutScan(int n, int *odata, const int *idata) { + timer().startCpuTimer(); + int count = 0; + for (int i = 0; i < n; ++i) { + if (idata[i] != 0) { + odata[count++] = idata[i]; + } + } + timer().endCpuTimer(); + return count; } - int scanned[n]; - scan(n, scanned, mapped); - for (int i = 0; i < n; ++i) { - if (mapped[i] != 0) { - odata[scanned[i]] = idata[i]; + + /** + * CPU stream compaction using scan and scatter, like the parallel version. + * + * @returns the number of elements remaining after compaction. + */ + int compactWithScan(int n, int *odata, const int *idata) { + timer().startCpuTimer(); + int* mapped = new int[n]; + for (int i = 0; i < n; ++i) { + mapped[i] = idata[i] != 0 ? 1 : 0; + } + int* scanned = new int[n]; + scan(n, scanned, mapped); + for (int i = 0; i < n; ++i) { + if (mapped[i] != 0) { + odata[scanned[i]] = idata[i]; + } } + timer().endCpuTimer(); + return -1; } - timer().endCpuTimer(); - return -1; - } - } + } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 9218f8e..14973c7 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -5,20 +5,40 @@ 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__ + // Kernel for naive prefix scan + __global__ void kernNaiveScan(int n, int *odata, const int *idata, int ilog2) { + int k = (blockIdx.x * blockDim.x) + threadIdx.x; + if (k >= n) + return; + + for (int d = 1; d < n; d *= 2) { + if (k >= d) { + int idatakd = idata[k - d]; + int idatak = idata[k]; + odata[k] = idatakd + idatak; + } + else { + odata[k] = idata[k]; + } + } + } /** * 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) { timer().startGpuTimer(); - // TODO + int blockSize = ilog2ceil(n); + dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); + kernNaiveScan << > >(n, odata, idata, ilog2ceil(n)); timer().endGpuTimer(); } } From dc84d6d8a5395a8561fee8ca0c1d0f14802cf9b0 Mon Sep 17 00:00:00 2001 From: Salaar Kohari Date: Mon, 17 Sep 2018 17:38:26 -0400 Subject: [PATCH 3/8] Updated main.cpp --- src/main.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 6da530f..261248c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -58,7 +58,7 @@ int main(int argc, char* argv[]) { 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"); @@ -67,7 +67,6 @@ int main(int argc, char* argv[]) { //printArray(SIZE, c, true); printCmpResult(NPOT, b, c); - /* zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); StreamCompaction::Efficient::scan(SIZE, c, a); @@ -147,7 +146,6 @@ int main(int argc, char* argv[]) { printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); - */ system("pause"); // stop Win32 console from closing on exit delete[] a; From 763035c0ea215ab29683213e364acc42118560d0 Mon Sep 17 00:00:00 2001 From: Salaar Kohari Date: Mon, 17 Sep 2018 17:39:18 -0400 Subject: [PATCH 4/8] Finished scan and compact implementations --- stream_compaction/common.cu | 14 +++++- stream_compaction/cpu.cu | 18 ++++--- stream_compaction/efficient.cu | 90 ++++++++++++++++++++++++++++++---- stream_compaction/naive.cu | 41 ++++++++++------ stream_compaction/thrust.cu | 26 +++++++--- 5 files changed, 147 insertions(+), 42 deletions(-) diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 8fc0211..10ded61 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -23,7 +23,11 @@ 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 = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= n) + return; + + bools[index] = idata[index] > 0 ? 1 : 0; } /** @@ -32,7 +36,13 @@ 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) + return; + + if (bools[index] == 1) { + odata[indices[index]] = idata[index]; + } } } diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index c7de2e5..2eaf443 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -17,12 +17,16 @@ 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) { - timer().startCpuTimer(); - odata[0] = idata[0]; + void scanNoTimer(int n, int *odata, const int *idata) { + odata[0] = 0; for (int i = 1; i < n; ++i) { - odata[i] = idata[i] + idata[i - 1]; + odata[i] = idata[i - 1] + odata[i - 1]; } + } + + void scan(int n, int *odata, const int *idata) { + timer().startCpuTimer(); + scanNoTimer(n, odata, idata); timer().endCpuTimer(); } @@ -55,14 +59,14 @@ namespace StreamCompaction { mapped[i] = idata[i] != 0 ? 1 : 0; } int* scanned = new int[n]; - scan(n, scanned, mapped); + scanNoTimer(n, scanned, mapped); for (int i = 0; i < n; ++i) { - if (mapped[i] != 0) { + if (mapped[i] == 1) { odata[scanned[i]] = idata[i]; } } timer().endCpuTimer(); - return -1; + return scanned[n - 1]; } } } diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 36c5ef2..9ec8a74 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -5,20 +5,66 @@ namespace StreamCompaction { namespace Efficient { - using StreamCompaction::Common::PerformanceTimer; - PerformanceTimer& timer() - { - static PerformanceTimer timer; - return timer; + using StreamCompaction::Common::PerformanceTimer; + PerformanceTimer& timer() + { + static PerformanceTimer timer; + return timer; } + // Kernels for efficient prefix scan + __global__ void kernUpScan(int n, int *data, const int offset) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= n) + return; + + if (index % (offset * 2) != 0) + return; + + data[index + (offset * 2) - 1] += data[index + offset - 1]; + } + + __global__ void kernDownScan(int n, int *data, const int offset) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= n) + return; + + if (index % (offset * 2) != 0) + return; + + int temp = data[index + offset - 1]; + data[index + offset - 1] = data[index + (offset * 2) - 1]; + data[index + (offset * 2) - 1] += temp; + } + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ + void scanNoTimer(int n, int *odata, const int *idata) { + int *dev_data; + cudaMalloc((void**)&dev_data, n * sizeof(int)); + cudaMemcpy(dev_data, idata, n * sizeof(int), cudaMemcpyHostToDevice); + + const int blockSize = 256; + dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); + + for (int d = 0; d < ilog2ceil(n); ++d) { + kernUpScan << > > (n, dev_data, pow(2, d)); + } + + cudaMemset(dev_data + n - 1, 0, 1); + for (int d = ilog2ceil(n); d >= 0; --d) { + kernDownScan << > > (n, dev_data, pow(2, d)); + } + + cudaMemcpy(odata, dev_data, n * sizeof(int), cudaMemcpyDeviceToHost); + cudaFree(dev_data); + } + void scan(int n, int *odata, const int *idata) { - timer().startGpuTimer(); - // TODO - timer().endGpuTimer(); + timer().startGpuTimer(); + scanNoTimer(n, odata, idata); + timer().endGpuTimer(); } /** @@ -31,10 +77,34 @@ namespace StreamCompaction { * @returns The number of elements remaining after compaction. */ int compact(int n, int *odata, const int *idata) { + int *dev_idata, *dev_odata, *dev_mapped, *dev_scanned; + cudaMalloc((void**)&dev_idata, n * sizeof(int)); + cudaMalloc((void**)&dev_odata, n * sizeof(int)); + cudaMalloc((void**)&dev_mapped, n * sizeof(int)); + cudaMalloc((void**)&dev_scanned, n * sizeof(int)); + cudaMemcpy(dev_idata, idata, n * sizeof(int), cudaMemcpyHostToDevice); + + const int blockSize = 256; + dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); + timer().startGpuTimer(); - // TODO + Common::kernMapToBoolean << > > (n, dev_mapped, dev_idata); + scanNoTimer(n, dev_scanned, dev_mapped); + Common::kernScatter << > > (n, dev_odata, dev_idata, dev_mapped, dev_scanned); timer().endGpuTimer(); - return -1; + + int count, lastbool; + cudaMemcpy(&count, dev_scanned + n - 1, sizeof(int), cudaMemcpyDeviceToHost); + cudaMemcpy(&lastbool, dev_mapped + n - 1, sizeof(int), cudaMemcpyDeviceToHost); + count += lastbool; + + cudaMemcpy(odata, dev_odata, n * sizeof(int), cudaMemcpyDeviceToHost); + cudaFree(dev_idata); + cudaFree(dev_odata); + cudaFree(dev_mapped); + cudaFree(dev_scanned); + + return count; } } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 14973c7..907690e 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -14,20 +14,16 @@ namespace StreamCompaction { // TODO: __global__ // Kernel for naive prefix scan - __global__ void kernNaiveScan(int n, int *odata, const int *idata, int ilog2) { - int k = (blockIdx.x * blockDim.x) + threadIdx.x; - if (k >= n) + __global__ void kernNaiveScan(int n, int *odata, const int *idata, const int offset) { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= n) return; - for (int d = 1; d < n; d *= 2) { - if (k >= d) { - int idatakd = idata[k - d]; - int idatak = idata[k]; - odata[k] = idatakd + idatak; - } - else { - odata[k] = idata[k]; - } + if (index >= offset) { + odata[index] = idata[index - offset] + idata[index]; + } + else { + odata[index] = idata[index]; } } @@ -35,11 +31,26 @@ namespace StreamCompaction { * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { - timer().startGpuTimer(); - int blockSize = ilog2ceil(n); + int *dev_idata, *dev_odata; + cudaMalloc((void**)&dev_idata, n * sizeof(int)); + cudaMalloc((void**)&dev_odata, n * sizeof(int)); + cudaMemcpy(dev_idata, idata, n * sizeof(int), cudaMemcpyHostToDevice); + + timer().startGpuTimer(); + + const int blockSize = 256; dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); - kernNaiveScan << > >(n, odata, idata, ilog2ceil(n)); + + for (int d = 1; d <= ilog2ceil(n); ++d) { + kernNaiveScan << > > (n, dev_odata, dev_idata, pow(2, d - 1)); + std::swap(dev_odata, dev_idata); + } + timer().endGpuTimer(); + + cudaMemcpy(odata + 1, dev_idata, (n - 1) * sizeof(int), cudaMemcpyDeviceToHost); + cudaFree(dev_idata); + cudaFree(dev_odata); } } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 36b732d..8874e39 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -8,21 +8,31 @@ 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) { + int *dev_idata, *dev_odata; + cudaMalloc((void**)&dev_idata, n * sizeof(int)); + cudaMalloc((void**)&dev_odata, n * sizeof(int)); + cudaMemcpy(dev_idata, idata, n * sizeof(int), cudaMemcpyHostToDevice); + + thrust::device_ptr dev_ithrust(dev_idata); + thrust::device_ptr dev_othrust(dev_odata); + 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_ithrust, dev_ithrust + n, dev_othrust); timer().endGpuTimer(); + + cudaMemcpy(odata, dev_odata, n * sizeof(int), cudaMemcpyDeviceToHost); + cudaFree(dev_idata); + cudaFree(dev_odata); } } } From 6a11b8233bf9b7650d07d682f6f348c52e779622 Mon Sep 17 00:00:00 2001 From: Salaar Kohari Date: Mon, 17 Sep 2018 17:48:35 -0400 Subject: [PATCH 5/8] Updated block sizes --- stream_compaction/efficient.cu | 4 ++-- stream_compaction/naive.cu | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 9ec8a74..6e902de 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -45,7 +45,7 @@ namespace StreamCompaction { cudaMalloc((void**)&dev_data, n * sizeof(int)); cudaMemcpy(dev_data, idata, n * sizeof(int), cudaMemcpyHostToDevice); - const int blockSize = 256; + const int blockSize = ilog2ceil(n); dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); for (int d = 0; d < ilog2ceil(n); ++d) { @@ -84,7 +84,7 @@ namespace StreamCompaction { cudaMalloc((void**)&dev_scanned, n * sizeof(int)); cudaMemcpy(dev_idata, idata, n * sizeof(int), cudaMemcpyHostToDevice); - const int blockSize = 256; + const int blockSize = ilog2ceil(n); dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); timer().startGpuTimer(); diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 907690e..6d3fa08 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -38,7 +38,7 @@ namespace StreamCompaction { timer().startGpuTimer(); - const int blockSize = 256; + const int blockSize = ilog2ceil(n); dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); for (int d = 1; d <= ilog2ceil(n); ++d) { From 8372e01f9ec2ef49085f22a0329056557cbf9361 Mon Sep 17 00:00:00 2001 From: Eric Chiu Date: Tue, 18 Sep 2018 17:24:08 -0400 Subject: [PATCH 6/8] Updated README, images -Salaar --- Analysis.xlsx | Bin 0 -> 25489 bytes README.md | 29 +++++++++++++++++++++++------ img/compact.png | Bin 0 -> 23038 bytes img/scan.png | Bin 0 -> 25771 bytes img/scan2.png | Bin 0 -> 16928 bytes stream_compaction/efficient.cu | 24 +++++++++++++----------- stream_compaction/naive.cu | 2 +- 7 files changed, 37 insertions(+), 18 deletions(-) create mode 100644 Analysis.xlsx create mode 100644 img/compact.png create mode 100644 img/scan.png create mode 100644 img/scan2.png diff --git a/Analysis.xlsx b/Analysis.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c51e03e6300aced1340f8402abda4e31489dac1f GIT binary patch literal 25489 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℘_-5l{9PXHHI#hXnF3d+;Z&RmdEGtjnSnI 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 L#?iXg%8&MMMB8ly literal 0 HcmV?d00001 diff --git a/img/scan.png b/img/scan.png new file mode 100644 index 0000000000000000000000000000000000000000..d43e67c881651a08acd848568ba3b3b2b16a8cbd GIT binary patch literal 25771 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 RZZLxNpNf`pjncD-{{;voVIBYg literal 0 HcmV?d00001 diff --git a/img/scan2.png b/img/scan2.png new file mode 100644 index 0000000000000000000000000000000000000000..d2de674a7c26bd8f3e9b9ed6c6e1bb7a9e01d0ef GIT binary patch literal 16928 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 literal 0 HcmV?d00001 diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 6e902de..2ee22a4 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -13,28 +13,28 @@ namespace StreamCompaction { } // Kernels for efficient prefix scan - __global__ void kernUpScan(int n, int *data, const int offset) { + __global__ void kernUpScan(int n, int *data, const int offset, const int offset2) { int index = (blockIdx.x * blockDim.x) + threadIdx.x; if (index >= n) return; - if (index % (offset * 2) != 0) + if (index % offset2 != 0) return; - data[index + (offset * 2) - 1] += data[index + offset - 1]; + data[index + offset2 - 1] += data[index + offset - 1]; } - __global__ void kernDownScan(int n, int *data, const int offset) { + __global__ void kernDownScan(int n, int *data, const int offset, const int offset2) { int index = (blockIdx.x * blockDim.x) + threadIdx.x; if (index >= n) return; - if (index % (offset * 2) != 0) + if (index % offset2 != 0) return; int temp = data[index + offset - 1]; - data[index + offset - 1] = data[index + (offset * 2) - 1]; - data[index + (offset * 2) - 1] += temp; + data[index + offset - 1] = data[index + offset2 - 1]; + data[index + offset2 - 1] += temp; } /** @@ -45,16 +45,18 @@ namespace StreamCompaction { cudaMalloc((void**)&dev_data, n * sizeof(int)); cudaMemcpy(dev_data, idata, n * sizeof(int), cudaMemcpyHostToDevice); - const int blockSize = ilog2ceil(n); + const int blockSize = 256; dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); for (int d = 0; d < ilog2ceil(n); ++d) { - kernUpScan << > > (n, dev_data, pow(2, d)); + int offset = pow(2, d); + kernUpScan << > > (n, dev_data, offset, offset * 2); } cudaMemset(dev_data + n - 1, 0, 1); for (int d = ilog2ceil(n); d >= 0; --d) { - kernDownScan << > > (n, dev_data, pow(2, d)); + int offset = pow(2, d); + kernDownScan << > > (n, dev_data, offset, offset * 2); } cudaMemcpy(odata, dev_data, n * sizeof(int), cudaMemcpyDeviceToHost); @@ -84,7 +86,7 @@ namespace StreamCompaction { cudaMalloc((void**)&dev_scanned, n * sizeof(int)); cudaMemcpy(dev_idata, idata, n * sizeof(int), cudaMemcpyHostToDevice); - const int blockSize = ilog2ceil(n); + const int blockSize = 256; dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); timer().startGpuTimer(); diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 6d3fa08..e0f62bf 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -38,7 +38,7 @@ namespace StreamCompaction { timer().startGpuTimer(); - const int blockSize = ilog2ceil(n); + const int blockSize = 512; dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); for (int d = 1; d <= ilog2ceil(n); ++d) { From 9fcfe57e35aa43e5d59c54978674fa448317de77 Mon Sep 17 00:00:00 2001 From: Salaar Kohari Date: Tue, 18 Sep 2018 17:25:51 -0400 Subject: [PATCH 7/8] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 2be515c..4e4cbaf 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,13 @@ Stream compaction maps an array to 0s and 1s depending on if the value meets a c ### Analysis ![Scan, (2^x)-3 Array Size](img/scan.png) +Scan, (2^x)-3 Array Size ![Scan, 2^x Array Size](img/scan2.png) +Scan, 2^x Array Size ![Stream Compact](img/compact.png) +Stream Compact In the graphs above, scan and compact are compared for various array sizes and algorithm implementations. All numbers are based on the average of two runs, since random arrays cause variance in runtime. The graphs are split into power-of-2 array sizes and power-of-2 minus 3, since behavior of certain algorithms can cause the runtime to vary between these conditions. One thing to note was that the power-of-2 implementation of thrust took 4-5 seconds, so it was discluded from the results. This may have been due to thrust being slow the first time it is called. From db63c39bc3ede65177a51ba392c916352797ed87 Mon Sep 17 00:00:00 2001 From: Salaar Kohari Date: Tue, 18 Sep 2018 17:31:03 -0400 Subject: [PATCH 8/8] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4e4cbaf..dc55e09 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,6 @@ Stream Compact In the graphs above, scan and compact are compared for various array sizes and algorithm implementations. All numbers are based on the average of two runs, since random arrays cause variance in runtime. The graphs are split into power-of-2 array sizes and power-of-2 minus 3, since behavior of certain algorithms can cause the runtime to vary between these conditions. One thing to note was that the power-of-2 implementation of thrust took 4-5 seconds, so it was discluded from the results. This may have been due to thrust being slow the first time it is called. -CPU operations perform better at lower array size but becomes much slower at larger array sizes. This is because CPU has a faster clock and memory access for smaller array sizes, but this scales linearly with the size of the array as opposed to more logarithmically in the parallel approach. +CPU operations perform better at lower array size but becomes much slower at larger array sizes. This is because CPU has a faster clock and memory access for smaller array sizes, but this scales linearly with the size of the array as opposed to more logarithmically in the parallel approach. CPU also requires no memory transfer to the GPU which could be an additional bottleneck for low array sizes. In my implementation, the naive approach performs better than the efficient one. This is likely because I did not optimize my block size at each iteration, so many threads are wasted at each implementation. There is also modulus division happening in the kernel to check if it is a valid thread, which is computationally inefficient on the GPU. If these are optimized, the efficient implementation would likely perform better.