From 8f6cca71444b27bb5dd789be484b62d02fa0943c Mon Sep 17 00:00:00 2001 From: Janine Liu Date: Wed, 16 Sep 2020 14:49:09 -0400 Subject: [PATCH 1/8] Finish CPU implementations --- src/main.cpp | 4 +-- stream_compaction/cpu.cu | 55 ++++++++++++++++++++++++++++++++++---- stream_compaction/naive.cu | 35 ++++++++++++++++++++++-- 3 files changed, 85 insertions(+), 9 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 896ac2b..4117008 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -44,14 +44,14 @@ int main(int argc, char* argv[]) { printDesc("cpu scan, non-power-of-two"); StreamCompaction::CPU::scan(NPOT, c, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - printArray(NPOT, b, true); + //printArray(NPOT, c, true); printCmpResult(NPOT, b, c); zeroArray(SIZE, c); 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 diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 719fa11..14af4c3 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -19,7 +19,16 @@ namespace StreamCompaction { */ void scan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // TODO + for (int i = 0; i < n; i++) { + odata[i] = idata[i]; + } + + // exclusive scan + odata[0] = 0; + + for (int i = 0; i < n - 1; i++) { + odata[i + 1] = odata[i] + idata[i]; + } timer().endCpuTimer(); } @@ -30,9 +39,19 @@ namespace StreamCompaction { */ int compactWithoutScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // TODO + const int size = n; + // Map to temp array + + int oIndex = 0; + for (int i = 0; i < n; i++) { + if (idata[i] != 0) { + odata[oIndex] = idata[i]; + oIndex++; + } + } + timer().endCpuTimer(); - return -1; + return oIndex; } /** @@ -42,9 +61,35 @@ namespace StreamCompaction { */ int compactWithScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // TODO + const int size = n; + + // Map to temp array + int* tempArray = new int[size]; + for (int i = 0; i < n; i++) { + tempArray[i] = (idata[i] == 0) ? 0 : 1; + } + + // Exclusive scan + int* scannedArray = new int[size]; + for (int i = 0; i < n; i++) { + scannedArray[i] = tempArray[i]; + } + scannedArray[0] = 0; + for (int i = 0; i < n - 1; i++) { + scannedArray[i + 1] = scannedArray[i] + tempArray[i]; + } + + // Scatter + int count = 0; + for (int i = 0; i < n; i++) { + if (tempArray[i] == 1) { + odata[scannedArray[i]] = idata[i]; + count++; + } + } + timer().endCpuTimer(); - return -1; + return count; } } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 4308876..1583733 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -2,6 +2,11 @@ #include #include "common.h" #include "naive.h" +#include + +#define blockSize 128 + +#define checkCUDAErrorWithLine(msg) checkCUDAError(msg, __LINE__) namespace StreamCompaction { namespace Naive { @@ -11,14 +16,40 @@ namespace StreamCompaction { static PerformanceTimer timer; return timer; } - // TODO: __global__ + + __global__ void kernNaiveScan(int n, int *odata, int *idata, int log2n) { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) { + return; + } + + int pow2 = 1; + /*for (int d = 1; d < log2n; d++) { + if (index >= pow2) { + odata[index] = idata[index - pow2] + idata[index]; + } + else { + odata[index] = idata[index]; + } + __syncthreads(); + + pow2 *= 2; + }*/ + odata[index] = idata[index]; + } /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { timer().startGpuTimer(); - // TODO + int numBlocks = ceil(n / blockSize); + const int size = n; + int* idataCopy = new int[size]; + int i = idata[0]; + cudaMemcpy(idataCopy, idata, sizeof(int) * n, cudaMemcpyHostToHost); + int j = idataCopy[0]; + kernNaiveScan <<>> (n, odata, idataCopy, ilog2ceil(n)); timer().endGpuTimer(); } } From 6eaf88bf00941bea030b069436f4ea7e00271e17 Mon Sep 17 00:00:00 2001 From: Janine Liu Date: Fri, 18 Sep 2020 09:59:06 -0400 Subject: [PATCH 2/8] Finish work-efficient GPU scan --- src/main.cpp | 22 +++--- stream_compaction/efficient.cu | 118 ++++++++++++++++++++++++++++++++- stream_compaction/naive.cu | 68 +++++++++++++------ 3 files changed, 176 insertions(+), 32 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 4117008..bbf5d7d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,6 +18,7 @@ const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; int *c = new int[SIZE]; +int* d = new int[8]; int main(int argc, char* argv[]) { // Scan tests @@ -46,7 +47,7 @@ int main(int argc, char* argv[]) { printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); //printArray(NPOT, c, true); printCmpResult(NPOT, b, c); - + zeroArray(SIZE, c); printDesc("naive scan, power-of-two"); StreamCompaction::Naive::scan(SIZE, c, a); @@ -54,19 +55,23 @@ int main(int argc, char* argv[]) { printArray(SIZE, c, true); printCmpResult(SIZE, b, c); - /* 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); */ - zeroArray(SIZE, c); printDesc("naive scan, non-power-of-two"); StreamCompaction::Naive::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); + //printArray(NPOT, c, true); printCmpResult(NPOT, b, c); + /* For debugging purposes + for (int i = 0; i < 8; i++) { + d[i] = i; + } + printDesc("1 - 8 array"); + StreamCompaction::Efficient::scan(8, c, d); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + printArray(8, c, true); + */ + zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); StreamCompaction::Efficient::scan(SIZE, c, a); @@ -151,4 +156,5 @@ int main(int argc, char* argv[]) { delete[] a; delete[] b; delete[] c; + delete[] d; } diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 2db346e..26d5a89 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -3,6 +3,14 @@ #include "common.h" #include "efficient.h" +#define blockSize 128 +#define checkCUDAErrorWithLine(msg) checkCUDAError(msg, __LINE__) + +int* dev_data; +int* dev_scanData; +int* dev_tempData; +int* dev_oData; + namespace StreamCompaction { namespace Efficient { using StreamCompaction::Common::PerformanceTimer; @@ -12,13 +20,77 @@ namespace StreamCompaction { return timer; } + __global__ void kernStepUpSweep(int n, int *data, int pow2) { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) { + return; + } + + if (index % (2 * pow2) == 0) { + data[index + 2 * pow2 - 1] += data[index + pow2 - 1]; + } + + } + + __global__ void kernStepDownSweep(int n, int* data, int pow2) { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) { + return; + } + + if (index % (2 * pow2) == 0) { + int t = data[index + pow2 - 1]; + data[index + pow2 - 1] = data[index + 2 * pow2 - 1]; + data[index + 2 * pow2 - 1] += t; + } + } + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + int numBlocks = ceil((float)n / (float)blockSize); + int log2n = ilog2ceil(n); + const int size = (int)powf(2, log2n); + + cudaMalloc((void**)&dev_scanData, sizeof(int) * size); + cudaMemcpy(dev_scanData, idata, sizeof(int) * n, cudaMemcpyHostToDevice); timer().startGpuTimer(); - // TODO + for (int d = 0; d <= log2n - 1; d++) { + kernStepUpSweep <<>> (size, dev_scanData, (int)powf(2, d)); + } + + odata[size - 1] = 0; + cudaMemcpy(dev_scanData + size - 1, odata + size - 1, sizeof(int), cudaMemcpyHostToDevice); + + for (int d = log2n - 1; d >= 0; d--) { + kernStepDownSweep << > > (size, dev_scanData, (int)powf(2, d)); + } + timer().endGpuTimer(); + + cudaMemcpy(odata, dev_scanData, sizeof(int) * n, cudaMemcpyDeviceToHost); + + cudaFree(dev_scanData); + } + + __global__ void kernMakeTempArray(int n, int *tempData, int *data) { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) { + return; + } + tempData[index] = data[index] == 0 ? 0 : 1; + } + + __global__ void kernScatter(int n, int* odata, int* tempData, int* data, int* scanData) { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) { + return; + } + + if (tempData[index] != 0) { + odata[scanData[index]] = data[index]; + } } /** @@ -31,10 +103,50 @@ namespace StreamCompaction { * @returns The number of elements remaining after compaction. */ int compact(int n, int *odata, const int *idata) { + int numBlocks = ceil((float)n / (float)blockSize); + int log2n = ilog2ceil(n); + const int size = (int)powf(2, log2n); + + cudaMalloc((void**)&dev_data, sizeof(int) * size); + cudaMalloc((void**)&dev_scanData, sizeof(int) * n); + cudaMalloc((void**)&dev_tempData, sizeof(int) * n); + cudaMalloc((void**)&dev_oData, sizeof(int) * n); + + cudaMemcpy(dev_data, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + cudaMemcpy(dev_scanData, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + timer().startGpuTimer(); - // TODO + // Make temporary array + kernMakeTempArray << > > (n, dev_tempData, dev_data); + + // Scan + for (int d = 0; d <= log2n - 1; d++) { + kernStepUpSweep << > > (n, dev_scanData, (int)powf(2, d)); + } + + odata[n - 1] = 0; + + cudaMemcpy(dev_scanData + n - 1, odata + n - 1, sizeof(int), cudaMemcpyHostToDevice); + + for (int d = log2n - 1; d >= 0; d--) { + kernStepDownSweep << > > (n, dev_scanData, (int)powf(2, d)); + } + + kernScatter << > > (n, dev_tempData, dev_oData, dev_data, dev_scanData); + timer().endGpuTimer(); - return -1; + cudaFree(dev_data); + cudaFree(dev_tempData); + cudaFree(dev_scanData); + cudaFree(dev_oData); + + for (int i = 0; i < n; i++) { + if (odata[i] == 0) { + return i; + } + } + + return n; } } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 1583733..c96a25e 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -5,9 +5,11 @@ #include #define blockSize 128 - #define checkCUDAErrorWithLine(msg) checkCUDAError(msg, __LINE__) +int *dev_idata; +int* dev_odata; + namespace StreamCompaction { namespace Naive { using StreamCompaction::Common::PerformanceTimer; @@ -17,40 +19,64 @@ namespace StreamCompaction { return timer; } - __global__ void kernNaiveScan(int n, int *odata, int *idata, int log2n) { + __global__ void kernStepNaiveScan(int n, int *odata, int *idata, int pow2) { int index = blockIdx.x * blockDim.x + threadIdx.x; if (index >= n) { return; } - int pow2 = 1; - /*for (int d = 1; d < log2n; d++) { - if (index >= pow2) { - odata[index] = idata[index - pow2] + idata[index]; - } - else { - odata[index] = idata[index]; - } - __syncthreads(); + if (index >= pow2) { + odata[index] = idata[index - pow2] + idata[index]; + } + else { + odata[index] = idata[index]; + } + } + + __global__ void kernMakeExclusive(int n, int *odata, int *idata) { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) { + return; + } - pow2 *= 2; - }*/ - odata[index] = idata[index]; + if (index == 0) { + odata[index] = 0; + } + else { + odata[index] = idata[index - 1]; + } } /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { - timer().startGpuTimer(); - int numBlocks = ceil(n / blockSize); + int numBlocks = ceil((float)n / (float)blockSize); const int size = n; - int* idataCopy = new int[size]; - int i = idata[0]; - cudaMemcpy(idataCopy, idata, sizeof(int) * n, cudaMemcpyHostToHost); - int j = idataCopy[0]; - kernNaiveScan <<>> (n, odata, idataCopy, ilog2ceil(n)); + cudaMalloc((void**)&dev_idata, sizeof(int) * n); + cudaMalloc((void**)&dev_odata, sizeof(int) * n); + cudaMemcpy(dev_idata, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + + timer().startGpuTimer(); + int log2n = ilog2ceil(n); + for (int d = 1; d <= log2n; d++) { + kernStepNaiveScan << > > (n, dev_odata, dev_idata, (int) powf(2, d - 1)); + if (d < log2n) { + int* tempPtr = dev_odata; + dev_odata = dev_idata; + dev_idata = tempPtr; + } + } + + // The correct data will be in odata, now have to make exclusive and store + // in idata, contrary to the original name's intention + kernMakeExclusive << > > (n, dev_idata, dev_odata); timer().endGpuTimer(); + + cudaMemcpy(odata, dev_idata, sizeof(int) * n, cudaMemcpyDeviceToHost); + + cudaFree(dev_idata); + cudaFree(dev_odata); } } } From 7ffbdc8289caa9b19df6cf7e57901ed72c50e8bc Mon Sep 17 00:00:00 2001 From: Janine Liu Date: Sun, 20 Sep 2020 21:10:07 -0400 Subject: [PATCH 3/8] Save progress and check appearance of README --- README.md | 79 ++++++++++++++++++++++++++--- img/example_output.png | Bin 0 -> 124828 bytes src/main.cpp | 4 +- stream_compaction/common.cu | 15 +++++- stream_compaction/efficient.cu | 88 ++++++++++++++++----------------- stream_compaction/thrust.cu | 16 ++++-- 6 files changed, 143 insertions(+), 59 deletions(-) create mode 100644 img/example_output.png diff --git a/README.md b/README.md index 0e38ddb..88986e7 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,79 @@ 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) +* Janine Liu + * [LinkedIn](https://www.linkedin.com/in/liujanine/), [personal website](https://www.janineliu.com/). +* Tested on: Windows 10, i7-10750H CPU @ 2.60GHz 16GB, GeForce RTX 2070 8192 MB (personal computer) -### (TODO: Your README) +### GPU Stream Compaction -Include analysis, etc. (Remember, this is public, so don't put -anything here that you don't want to share with the world.) +This project involved implementing Scan and Compact algorithms that will be used for in later projects, comparing their performance on both the GPU and CPU with different array sizes. In detail, this project includes a CPU version of Scan and Compact (both serialized), a naive version of Scan, a work-efficient version of Scan, and a work-efficient version of Compact that used the work-efficient Scan's code. The Thrust version of Scan is also compared with the rest of these algorithms as an additional reference. + +## Performance Analysis Methods + +The CPU and GPU algorithms were timed during their execution, and their times are written to a formatted output that is printed to the terminal. An example of that output is as follows: + +``` +**************** +** SCAN TESTS ** +**************** + [ 18 44 40 43 2 39 23 12 8 5 11 16 31 ... 5 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 0.008ms (std::chrono Measured) + [ 0 18 62 102 145 147 186 209 221 229 234 245 261 ... 100690 100695 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 0.0069ms (std::chrono Measured) + passed +==== naive scan, power-of-two ==== + elapsed time: 0.04208ms (CUDA Measured) + [ 0 18 62 102 145 147 186 209 221 229 234 245 261 ... 100690 100695 ] + passed +==== naive scan, non-power-of-two ==== + elapsed time: 0.038656ms (CUDA Measured) + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 0.093504ms (CUDA Measured) + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 0.083968ms (CUDA Measured) + passed +==== thrust scan, power-of-two ==== + elapsed time: 0.04832ms (CUDA Measured) + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 0.04752ms (CUDA Measured) + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 0 2 2 3 2 3 1 2 0 1 3 2 1 ... 1 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 0.0082ms (std::chrono Measured) + [ 2 2 3 2 3 1 2 1 3 2 1 3 3 ... 2 1 ] + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 0.0082ms (std::chrono Measured) + [ 2 2 3 2 3 1 2 1 3 2 1 3 3 ... 1 1 ] + passed +==== cpu compact with scan ==== + elapsed time: 0.0287ms (std::chrono Measured) + [ 2 2 3 2 3 1 2 1 3 2 1 3 3 ... 2 1 ] + passed +==== work-efficient compact, power-of-two ==== + elapsed time: 0.124928ms (CUDA Measured) + [ 2 2 3 2 3 1 2 1 3 2 1 3 3 ... 2 1 ] + passed +==== work-efficient compact, non-power-of-two ==== + elapsed time: 0.122176ms (CUDA Measured) + passed +``` + +To collect data, I run the program five times in succession and record the timed values for the power of 2 arrays in each implementation. Each run, the program generates a new random array of values that all of the algorithms operate on. I varied the size of the arrays by powers of 2 + +## Runtime Analysis + +fluctuated too much to tell. difference between 32 and 64 + +Thurst Scan and work-efficient scan fluctuates on non power of two arrays. for insance, 1024 array size block size 128, Thrust 0.231424 <- non power of two case \ No newline at end of file diff --git a/img/example_output.png b/img/example_output.png new file mode 100644 index 0000000000000000000000000000000000000000..803f059f223b8c36185fcfa9d34d43f90b93a84b GIT binary patch literal 124828 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
*8Q;ZEoRq+|MxJQYMMHb<$fQgepIHmij% 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

GtQ1|CiFdL*$$?+0zgTi}32vhiAxu!Ogl-NvF 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 #include "testing_helpers.hpp" -const int SIZE = 1 << 8; // feel free to change the size of array +const int SIZE = 1 << 12; // 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]; @@ -142,7 +142,7 @@ int main(int argc, char* argv[]) { printDesc("work-efficient compact, power-of-two"); count = StreamCompaction::Efficient::compact(SIZE, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(count, c, true); + printArray(count, c, true); printCmpLenResult(count, expectedCount, b, c); zeroArray(SIZE, c); diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 2ed6d63..a9c94ca 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 ? 0 : 1; } /** @@ -32,7 +36,14 @@ 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 (idata[index] != 0) { + odata[bools[index]] = idata[index]; + } } } diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 26d5a89..7a1e551 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -8,7 +8,7 @@ int* dev_data; int* dev_scanData; -int* dev_tempData; +int* dev_boolData; int* dev_oData; namespace StreamCompaction { @@ -32,6 +32,21 @@ namespace StreamCompaction { } + __global__ void kernSetRootNode(int n, int* data) { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) { + return; + } + + data[n - 1] = 0; + } + + // if you copy the NPOT array into a POT GPU bfffer, and you pad any of the data + // that doesn't exist with zeroes, it makes result of the scan instead of the + // array being like. if you pad zeroes, the value gets repeated a bunch of times + + // could also try to adjust how many threads get run + __global__ void kernStepDownSweep(int n, int* data, int pow2) { int index = blockIdx.x * blockDim.x + threadIdx.x; if (index >= n) { @@ -48,49 +63,31 @@ namespace StreamCompaction { /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ + void scan(int n, int *odata, const int *idata) { int numBlocks = ceil((float)n / (float)blockSize); int log2n = ilog2ceil(n); const int size = (int)powf(2, log2n); - cudaMalloc((void**)&dev_scanData, sizeof(int) * size); - cudaMemcpy(dev_scanData, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + cudaMalloc((void**)&dev_data, sizeof(int) * size); + cudaMemcpy(dev_data, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + timer().startGpuTimer(); for (int d = 0; d <= log2n - 1; d++) { - kernStepUpSweep <<>> (size, dev_scanData, (int)powf(2, d)); + kernStepUpSweep <<>> (size, dev_data, (int)powf(2, d)); } - odata[size - 1] = 0; - cudaMemcpy(dev_scanData + size - 1, odata + size - 1, sizeof(int), cudaMemcpyHostToDevice); - + kernSetRootNode << <1, 1 >> > (size, dev_data); + for (int d = log2n - 1; d >= 0; d--) { - kernStepDownSweep << > > (size, dev_scanData, (int)powf(2, d)); + kernStepDownSweep << > > (size, dev_data, (int)powf(2, d)); } timer().endGpuTimer(); - cudaMemcpy(odata, dev_scanData, sizeof(int) * n, cudaMemcpyDeviceToHost); - - cudaFree(dev_scanData); - } - - __global__ void kernMakeTempArray(int n, int *tempData, int *data) { - int index = blockIdx.x * blockDim.x + threadIdx.x; - if (index >= n) { - return; - } - tempData[index] = data[index] == 0 ? 0 : 1; - } + cudaMemcpy(odata, dev_data, sizeof(int) * n, cudaMemcpyDeviceToHost); - __global__ void kernScatter(int n, int* odata, int* tempData, int* data, int* scanData) { - int index = blockIdx.x * blockDim.x + threadIdx.x; - if (index >= n) { - return; - } - - if (tempData[index] != 0) { - odata[scanData[index]] = data[index]; - } + cudaFree(dev_data); } /** @@ -108,45 +105,44 @@ namespace StreamCompaction { const int size = (int)powf(2, log2n); cudaMalloc((void**)&dev_data, sizeof(int) * size); - cudaMalloc((void**)&dev_scanData, sizeof(int) * n); - cudaMalloc((void**)&dev_tempData, sizeof(int) * n); + cudaMalloc((void**)&dev_boolData, sizeof(int) * size); cudaMalloc((void**)&dev_oData, sizeof(int) * n); cudaMemcpy(dev_data, idata, sizeof(int) * n, cudaMemcpyHostToDevice); - cudaMemcpy(dev_scanData, idata, sizeof(int) * n, cudaMemcpyHostToDevice); timer().startGpuTimer(); // Make temporary array - kernMakeTempArray << > > (n, dev_tempData, dev_data); + StreamCompaction::Common::kernMapToBoolean << > > (size, dev_boolData, dev_data); // Scan for (int d = 0; d <= log2n - 1; d++) { - kernStepUpSweep << > > (n, dev_scanData, (int)powf(2, d)); + kernStepUpSweep << > > (size, dev_boolData, (int)powf(2, d)); } - odata[n - 1] = 0; - - cudaMemcpy(dev_scanData + n - 1, odata + n - 1, sizeof(int), cudaMemcpyHostToDevice); + odata[size - 1] = 0; + cudaMemcpy(dev_boolData + size - 1, odata + size - 1, sizeof(int), cudaMemcpyHostToDevice); for (int d = log2n - 1; d >= 0; d--) { - kernStepDownSweep << > > (n, dev_scanData, (int)powf(2, d)); + kernStepDownSweep << > > (size, dev_boolData, (int)powf(2, d)); } - kernScatter << > > (n, dev_tempData, dev_oData, dev_data, dev_scanData); + StreamCompaction::Common::kernScatter << > > (n, dev_oData, dev_data, dev_boolData, nullptr); timer().endGpuTimer(); + + int* boolArray = new int[n]; + cudaMemcpy(odata, dev_oData, sizeof(int) * n, cudaMemcpyDeviceToHost); + cudaMemcpy(boolArray, dev_boolData, sizeof(int) * n, cudaMemcpyDeviceToHost); + cudaFree(dev_data); - cudaFree(dev_tempData); - cudaFree(dev_scanData); + cudaFree(dev_boolData); cudaFree(dev_oData); - for (int i = 0; i < n; i++) { - if (odata[i] == 0) { - return i; - } + if (idata[n - 1] == 0) { + return boolArray[n - 1]; } - return n; + return boolArray[n - 1] + 1; } } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 1def45e..f45c691 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -6,6 +6,9 @@ #include "common.h" #include "thrust.h" +int* dev_inData; +int* dev_outData; + namespace StreamCompaction { namespace Thrust { using StreamCompaction::Common::PerformanceTimer; @@ -18,11 +21,18 @@ namespace StreamCompaction { * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + + cudaMalloc((void**)&dev_inData, sizeof(int) * n); + cudaMalloc((void**)&dev_outData, sizeof(int) * n); + cudaMemcpy(dev_inData, idata, sizeof(int) * n, cudaMemcpyHostToDevice); 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::device_ptr dev_thrust_idata(dev_inData); + thrust::device_ptr dev_thrust_odata(dev_outData); + thrust::exclusive_scan(dev_thrust_idata, dev_thrust_idata + n, dev_thrust_odata); timer().endGpuTimer(); + cudaMemcpy(odata, dev_outData, sizeof(int) * n, cudaMemcpyDeviceToHost); + cudaFree(dev_inData); + cudaFree(dev_outData); } } } From 73ae80bafba9824a185744652fc2b22e3d25b20e Mon Sep 17 00:00:00 2001 From: Janine Liu Date: Sun, 20 Sep 2020 23:34:32 -0400 Subject: [PATCH 4/8] Save README progress --- README.md | 47 +++++++++++++++++++++++++++++---- img/compact_perf.png | Bin 0 -> 30332 bytes img/scan_cuda_analysis.png | Bin 0 -> 50048 bytes img/scan_perf.png | Bin 0 -> 32269 bytes src/main.cpp | 2 +- stream_compaction/efficient.cu | 2 +- stream_compaction/naive.cu | 2 +- 7 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 img/compact_perf.png create mode 100644 img/scan_cuda_analysis.png create mode 100644 img/scan_perf.png diff --git a/README.md b/README.md index 88986e7..525b971 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,15 @@ CUDA Stream Compaction ### GPU Stream Compaction -This project involved implementing Scan and Compact algorithms that will be used for in later projects, comparing their performance on both the GPU and CPU with different array sizes. In detail, this project includes a CPU version of Scan and Compact (both serialized), a naive version of Scan, a work-efficient version of Scan, and a work-efficient version of Compact that used the work-efficient Scan's code. The Thrust version of Scan is also compared with the rest of these algorithms as an additional reference. +This project involved implementing Scan and Compact algorithms that will be used for in later projects, comparing their performance on both the GPU and CPU with different array sizes. In detail, this project includes: +* a CPU version of Scan, +* a CPU version of Compact without using the Scan algorithm, +* a CPU version of Compact with Scan, +* a naive version of Scan, +* a work-efficient version of Scan, and +* a work-efficient version of Compact that used the work-efficient Scan's code. +All three CPU algorithms are serialized; no multi-threading was incorporated. The Thrust library's version of Scan is also compared with the rest of these algorithms as an additional reference. ## Performance Analysis Methods @@ -72,10 +79,40 @@ The CPU and GPU algorithms were timed during their execution, and their times ar passed ``` -To collect data, I run the program five times in succession and record the timed values for the power of 2 arrays in each implementation. Each run, the program generates a new random array of values that all of the algorithms operate on. I varied the size of the arrays by powers of 2 +To collect data, I ran the program five times in succession and record the time values displayed for the "power-of-two" arrays in each implementation. In each run, the program generates a new array of random values for all of the algorithms operate on, so the data input is consistent across timings. I varied the size of the arrays by powers of two, starting from 256. While I did not formally record values for the non power-of-two arrays, I observed on their values and noted when there were any outliers. -## Runtime Analysis +## Scan Runtime Analysis -fluctuated too much to tell. difference between 32 and 64 +The performance of the four scan functions is graphed below. -Thurst Scan and work-efficient scan fluctuates on non power of two arrays. for insance, 1024 array size block size 128, Thrust 0.231424 <- non power of two case \ No newline at end of file +![](img/scan_perf.png) + +Initially, the GPU implementations of Scan seemed much slower than the CPU implementation, since they were tested on an array size of 256 and the CPU's base speed is extremely fast. However, once the array size was increased exponentially, the performance of both GPU implementations slowly approached the CPU one in numerical speed, even surpassing it for an array of 32,768. Indeed, the CPU's performance experiences a 38,932% speed decrease from an array of 256 to the array of 32,768, while the Naive GPU Scan experiences a 199% decrease and the Work-Efficient one experiences a 343% decrease respectively. On the graph, the CPU has a linear trajectory, while both the Naive and Work-Efficient Scans have a log(n) trajectory; if more array sizes were tested, this predicts that both GPU implementations will be faster than the CPU's, where the larger the array size, the more efficient the GPU implementations are. + +Unfortunately, despite intentions and expectations, the Work-Efficient Scan is less efficient than the Naive Scan. It has a higher base speed, and the slope of its graph is higher than that of the Naive Scan's. The implementation of Work-Efficient Scan involves two `for` loops, one for the "up-sweep" of the initial array and one for the "down-sweep" on the result, and thus twice as many kernel calls. Commenting out one of these `for` loops causes Work-Efficient Scan to be slightly faster than Naive Scan (although wrong, of course), which implies that the presence of two `for` loops makes the implementation slow. I confirmed this when I looked at the kernels' runtime through the NSight Analysis interface: + +![](img/scan_cuda_analysis.png) + +The total kernel run-time of Work-Efficient Scan is about two times that of Naive Scan, so Work-Efficient Scan takes twice as much time. This is a problem with the lack of optimization in the kernel calls; the kernels are not efficient enough to balance out the fact that there are twice as many calls. + +Interestingly, the Thrust Scan's performance stays relatively the same no matter what. I could not find it on NSight's Timeline, even when it was the only function being called, so I cannot genuinely analyze its performance or hypothesize why it's so consistent. + +## Compact Runtime Analysis + +The performance of the three compact functions is graphed below. + +![](img/compact_perf.png) + + +## Outliers + +Thereurst Scan and work-efficient scan fluctuates on non power of two arrays. for insance, 1024 array size block size 128, Thrust 0.231424 <- non power of two case and 32768 for power of two case (bt fluctuations same magnitude, interestingly enough). 0.240832 also weird spike in work-efficient compact, 0.38688 at 16384 for power of two and 0.81392 at 32768 + +## Block Size Optimization + +The process to optimize block size was very informal; I ran the program a number of times and eyeballed the difference in values that resulted from different block sizes (though some changes were indiscernable). My testing values for the block size ranged from 32 to 512; these end values were inefficient and it did not make sense to continue testing in either extreme direction. + +* There was a notable difference in performance between block sizes 32 and 64; with an array size of 32,768 and a block size of 32, the Work-Efficient Scan was slower by 0.1ms than its speed with block size 64. +* It was difficult to sense a difference between block sizes 64 and 128. +* A block size of 256 seems to make work efficient scan faster, dropping by 0.2ms on avergae, but slightly taxes work compact 0.1-0.2ms. +* There is much more performance fluctuation with 512, causing the Work-Efficient Scan and Compact to lag abnormally. Therefore, it is unideal for our algorithms. diff --git a/img/compact_perf.png b/img/compact_perf.png new file mode 100644 index 0000000000000000000000000000000000000000..25c054e0eaa419fce397676f79129c17d257eb52 GIT binary patch literal 30332 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 literal 0 HcmV?d00001 diff --git a/img/scan_cuda_analysis.png b/img/scan_cuda_analysis.png new file mode 100644 index 0000000000000000000000000000000000000000..c7e958af3c1826a318037f2253f8d27ca89abf28 GIT binary patch literal 50048 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 z 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 literal 0 HcmV?d00001 diff --git a/img/scan_perf.png b/img/scan_perf.png new file mode 100644 index 0000000000000000000000000000000000000000..9b5b562d6bd73f925dcf22b9c00e0623218962d1 GIT binary patch literal 32269 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 literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp index f73c7c0..1e9bcd6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 12; // feel free to change the size of array +const int SIZE = 1 << 17; // feel free to change the size of array const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 7a1e551..4f3bed9 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -3,7 +3,7 @@ #include "common.h" #include "efficient.h" -#define blockSize 128 +#define blockSize 256 #define checkCUDAErrorWithLine(msg) checkCUDAError(msg, __LINE__) int* dev_data; diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index c96a25e..b9b6c71 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -4,7 +4,7 @@ #include "naive.h" #include -#define blockSize 128 +#define blockSize 256 #define checkCUDAErrorWithLine(msg) checkCUDAError(msg, __LINE__) int *dev_idata; From 258522f45f26089a24b134016a4005242b536c85 Mon Sep 17 00:00:00 2001 From: Janine Liu Date: Mon, 21 Sep 2020 02:56:20 -0400 Subject: [PATCH 5/8] Complete README --- README.md | 13 +++++++++++-- img/compact_perf.png | Bin 30332 -> 34276 bytes img/scan_perf.png | Bin 32269 -> 36640 bytes 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 525b971..58be491 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,9 @@ The performance of the four scan functions is graphed below. ![](img/scan_perf.png) -Initially, the GPU implementations of Scan seemed much slower than the CPU implementation, since they were tested on an array size of 256 and the CPU's base speed is extremely fast. However, once the array size was increased exponentially, the performance of both GPU implementations slowly approached the CPU one in numerical speed, even surpassing it for an array of 32,768. Indeed, the CPU's performance experiences a 38,932% speed decrease from an array of 256 to the array of 32,768, while the Naive GPU Scan experiences a 199% decrease and the Work-Efficient one experiences a 343% decrease respectively. On the graph, the CPU has a linear trajectory, while both the Naive and Work-Efficient Scans have a log(n) trajectory; if more array sizes were tested, this predicts that both GPU implementations will be faster than the CPU's, where the larger the array size, the more efficient the GPU implementations are. +* Initially, the GPU implementations of Scan seemed much slower than the CPU implementation, since they were tested on an array size of 256 and the CPU's base speed is extremely fast. However, once the array size was increased exponentially, the performance of both GPU implementations slowly approached the CPU one in numerical speed, even surpassing it for an array of 131,072. +* The CPU's performance experiences a **38,932%** speed decrease from an array of 256 to the array of 131,072, while the Naive GPU Scan experiences a **199%** decrease and the Work-Efficient one experiences a **343%** decrease respectively. +* On the graph, the CPU has a linear trajectory, while both the Naive and Work-Efficient Scans have a log(n) trajectory; if more array sizes were tested, this predicts that both GPU implementations will be faster than the CPU's, where the larger the array size, the more efficient the GPU implementations are. Unfortunately, despite intentions and expectations, the Work-Efficient Scan is less efficient than the Naive Scan. It has a higher base speed, and the slope of its graph is higher than that of the Naive Scan's. The implementation of Work-Efficient Scan involves two `for` loops, one for the "up-sweep" of the initial array and one for the "down-sweep" on the result, and thus twice as many kernel calls. Commenting out one of these `for` loops causes Work-Efficient Scan to be slightly faster than Naive Scan (although wrong, of course), which implies that the presence of two `for` loops makes the implementation slow. I confirmed this when I looked at the kernels' runtime through the NSight Analysis interface: @@ -103,10 +105,17 @@ The performance of the three compact functions is graphed below. ![](img/compact_perf.png) +These results align with the observations found in the Scan part of this project. + +* As with the Scan implementations, the GPU implementation at array size 256 is slower than the CPU implementation, but proves to be more efficient as the array size increases, performing faster than both CPU implementations with an array size of 131,072. +* During Compact without Scan on an array of 131,072 the CPU experiences a **45,400%** decrease in performance compared to its speed at array size 256, while Compact with Scan performs at **24539%** worse than its base speed. This contrasts the **124%** change in performance observed in the Work-Efficient Compact function. +* Aside from the fluctuation in the graph, the function of the Work-Efficient Compact follows a log(n) trajectory with a very small slope. This contrasts the linear trajectories of both CPU implementations, in a way that is similarly demnonstrated in Scan. + +As a whole, even though the base speeds of these work-efficient algorithms are high, they diverge less rapidly from these speeds than their CPU counterparts and outperform them when applied to larger sets of data. ## Outliers -Thereurst Scan and work-efficient scan fluctuates on non power of two arrays. for insance, 1024 array size block size 128, Thrust 0.231424 <- non power of two case and 32768 for power of two case (bt fluctuations same magnitude, interestingly enough). 0.240832 also weird spike in work-efficient compact, 0.38688 at 16384 for power of two and 0.81392 at 32768 +While I was collecting data, I observed some abnormal values throughout the program that appeared and disappeared with program refreshes. For some sizes of the randomly-generated array, the algorithms produce fluctuating values that interfere with the expected trajectory of data from their functions. A notable example happens with the cases of Thrust Scan: when I tested an array size of 1021 with block size 128 during my implementation process, the Thrust Scan showed a value of 0.231424, five times slower than its expected average speed. It showed something similar at array size 32,768, spiking again to some value between 0.20 and 0.25ms, equivalent in magnitude to the other lag spike. There was also some interference with the Work-Efficient Scan and Compact algorithms, especially the Work_Efficient Contact. The most out-of-place value I observed was a performance of 0.81392 ms at array size 32,768. Though this instability explains the fluctuation in the slopes of their graphs, I cannot think of an explanation for why this happens, because the size of the array stays constant (and subsequent trials will show expected results). ## Block Size Optimization diff --git a/img/compact_perf.png b/img/compact_perf.png index 25c054e0eaa419fce397676f79129c17d257eb52..111540a4a510cea90e8c448be460654123f28576 100644 GIT binary patch literal 34276 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 literal 30332 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 diff --git a/img/scan_perf.png b/img/scan_perf.png index 9b5b562d6bd73f925dcf22b9c00e0623218962d1..9f86fc2f24ab50d5c6dbbcc4fc6dc33d6b546ce8 100644 GIT binary patch literal 36640 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 DM9xU47nG&?AyIAn$W|FpR^&!j1Z~ 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 From a4d8e128c07f584076bfc8abbf488d47d28c7de2 Mon Sep 17 00:00:00 2001 From: Janine Liu Date: Mon, 21 Sep 2020 03:02:56 -0400 Subject: [PATCH 6/8] Finalize README --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 58be491..ba2501c 100644 --- a/README.md +++ b/README.md @@ -17,11 +17,11 @@ This project involved implementing Scan and Compact algorithms that will be used * a work-efficient version of Scan, and * a work-efficient version of Compact that used the work-efficient Scan's code. -All three CPU algorithms are serialized; no multi-threading was incorporated. The Thrust library's version of Scan is also compared with the rest of these algorithms as an additional reference. +All three CPU algorithms are serialized; no multi-threading was incorporated. The Thrust library's version of Scan was also compared with the rest of these algorithms as an additional reference. ## Performance Analysis Methods -The CPU and GPU algorithms were timed during their execution, and their times are written to a formatted output that is printed to the terminal. An example of that output is as follows: +The CPU and GPU algorithms were timed during their execution, and their times are formatted in an output printed to the terminal. An example of that output is as follows: ``` **************** @@ -88,10 +88,10 @@ The performance of the four scan functions is graphed below. ![](img/scan_perf.png) * Initially, the GPU implementations of Scan seemed much slower than the CPU implementation, since they were tested on an array size of 256 and the CPU's base speed is extremely fast. However, once the array size was increased exponentially, the performance of both GPU implementations slowly approached the CPU one in numerical speed, even surpassing it for an array of 131,072. -* The CPU's performance experiences a **38,932%** speed decrease from an array of 256 to the array of 131,072, while the Naive GPU Scan experiences a **199%** decrease and the Work-Efficient one experiences a **343%** decrease respectively. +* The CPU's performance experiences a **38,932%** speed decrease from an array of 256 to the array of 131,072, while the Naive GPU Scan experiences a **199%** decrease and the Work-Efficient Scan experiences a **343%** decrease respectively. * On the graph, the CPU has a linear trajectory, while both the Naive and Work-Efficient Scans have a log(n) trajectory; if more array sizes were tested, this predicts that both GPU implementations will be faster than the CPU's, where the larger the array size, the more efficient the GPU implementations are. -Unfortunately, despite intentions and expectations, the Work-Efficient Scan is less efficient than the Naive Scan. It has a higher base speed, and the slope of its graph is higher than that of the Naive Scan's. The implementation of Work-Efficient Scan involves two `for` loops, one for the "up-sweep" of the initial array and one for the "down-sweep" on the result, and thus twice as many kernel calls. Commenting out one of these `for` loops causes Work-Efficient Scan to be slightly faster than Naive Scan (although wrong, of course), which implies that the presence of two `for` loops makes the implementation slow. I confirmed this when I looked at the kernels' runtime through the NSight Analysis interface: +Unfortunately, the Work-Efficient Scan is less efficient than the Naive Scan. Besides its higher base speed, the slope of its graph is higher than that of the Naive Scan's. The implementation of Work-Efficient Scan involves two `for` loops, one for the "up-sweep" of the initial array and one for the "down-sweep" on the result, and thus twice as many kernel calls. Commenting out one of these `for` loops causes Work-Efficient Scan to be slightly faster than Naive Scan (although wrong, of course), which implies that the presence of two `for` loops makes the implementation slow. I confirmed this when I looked at the kernels' runtime through the NSight Analysis interface: ![](img/scan_cuda_analysis.png) @@ -115,7 +115,7 @@ As a whole, even though the base speeds of these work-efficient algorithms are h ## Outliers -While I was collecting data, I observed some abnormal values throughout the program that appeared and disappeared with program refreshes. For some sizes of the randomly-generated array, the algorithms produce fluctuating values that interfere with the expected trajectory of data from their functions. A notable example happens with the cases of Thrust Scan: when I tested an array size of 1021 with block size 128 during my implementation process, the Thrust Scan showed a value of 0.231424, five times slower than its expected average speed. It showed something similar at array size 32,768, spiking again to some value between 0.20 and 0.25ms, equivalent in magnitude to the other lag spike. There was also some interference with the Work-Efficient Scan and Compact algorithms, especially the Work_Efficient Contact. The most out-of-place value I observed was a performance of 0.81392 ms at array size 32,768. Though this instability explains the fluctuation in the slopes of their graphs, I cannot think of an explanation for why this happens, because the size of the array stays constant (and subsequent trials will show expected results). +While I was collecting data, I observed some abnormal values throughout the program that appeared and disappeared with program refreshes. For some sizes of the randomly-generated array, the algorithms produce fluctuating values that interfere with the expected trajectory of data from their functions. A notable example happens with the cases of Thrust Scan: when I tested an array size of 1021 with block size 128 during my implementation process, the Thrust Scan showed a value of **0.231424 ms**, **five times slower** than its expected average speed. It showed something similar at array size 32,768, spiking again to some value between 0.20 and 0.25ms, equivalent in magnitude to the other lag spike. There was also some interference with the Work-Efficient Scan and Compact algorithms, especially the Work-Efficient Compact. The most out-of-place value I observed was a performance of **0.81392 ms** at array size 32,768. Though this instability explains the fluctuation in the slopes of their graphs, I cannot think of an explanation for why this happens, because the size of the array stays constant (and subsequent trials will show more expected results). ## Block Size Optimization From 07ca7b3c3139aa8757be52d794904025700d0e28 Mon Sep 17 00:00:00 2001 From: Janine Liu Date: Tue, 22 Sep 2020 18:28:49 -0400 Subject: [PATCH 7/8] Implement Radix Sort --- src/main.cpp | 85 ++++++++++++++++++- stream_compaction/efficient.cu | 145 +++++++++++++++++++++++++++++++-- stream_compaction/efficient.h | 7 ++ stream_compaction/thrust.cu | 15 ++-- 4 files changed, 232 insertions(+), 20 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 1e9bcd6..536fa5b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,12 +13,13 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 17; // 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]; int *c = new int[SIZE]; -int* d = new int[8]; +int *d = new int[8]; +int* e = new int[SIZE]; int main(int argc, char* argv[]) { // Scan tests @@ -152,9 +153,89 @@ int main(int argc, char* argv[]) { //printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); + printf("\n"); + printf("*****************************\n"); + printf("** RADIX SORT TESTS **\n"); + printf("*****************************\n"); + + genArray(SIZE - 1, a, 100); // Leave a 0 at the end to test that edge case + a[SIZE - 1] = 0; + printArray(SIZE, a, true); + + printDesc("radix, power-of-two"); + StreamCompaction::Radix::radixSort(SIZE, c, a); + printArray(SIZE, c, true); + for (int i = 0; i < SIZE - 1; i++) { + if (c[i] > c[i + 1]) { + printf(" FAILED\n"); + break; + } + else if (i == SIZE - 2) { + printf(" passed\n"); + } + } + + printDesc("radix, non power-of-two"); + StreamCompaction::Radix::radixSort(NPOT, c, a); + for (int i = 0; i < NPOT - 1; i++) { + if (c[i] > c[i + 1]) { + printf(" FAILED\n"); + printArray(NPOT, c, true); + break; + } + else if (i == NPOT - 2) { + printf(" passed\n"); + } + } + + d[0] = 4, d[1] = 7, d[2] = 2, d[3] = 6, d[4] = 3, d[5] = 5, d[6] = 1, d[7] = 0; + printDesc("radix, unsorted array of 1 - 8"); + StreamCompaction::Radix::radixSort(8, c, d); + printArray(8, c, true); + for (int i = 0; i < 8 - 1; i++) { + if (c[i] > c[i + 1]) { + printf(" FAILED\n"); + break; + } + else if (i == 8 - 2) { + printf(" passed\n"); + } + } + + d[0] = 42, d[1] = 42, d[2] = 129, d[3] = 129, d[4] = 53, d[5] = 1, d[6] = 4, d[7] = 28; + printDesc("radix, array with duplicates"); + StreamCompaction::Radix::radixSort(8, c, d); + printArray(8, c, true); + for (int i = 0; i < 8 - 1; i++) { + if (c[i] > c[i + 1]) { + printf(" FAILED\n"); + break; + } + else if (i == 8 - 2) { + printf(" passed\n"); + } + } + + for (int i = 0; i < SIZE; i++) { + b[i] = SIZE - i; + } + + printDesc("radix, backwards sorted array"); + StreamCompaction::Radix::radixSort(SIZE, c, b); + for (int i = 0; i < SIZE - 1; i++) { + if (c[i] > c[i + 1]) { + printf(" FAILED\n"); + break; + } + else if (i == SIZE - 2) { + printf(" passed\n"); + } + } + system("pause"); // stop Win32 console from closing on exit delete[] a; delete[] b; delete[] c; delete[] d; + delete[] e; } diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 4f3bed9..5d6b4ca 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -6,10 +6,22 @@ #define blockSize 256 #define checkCUDAErrorWithLine(msg) checkCUDAError(msg, __LINE__) + +// General globals int* dev_data; +int* dev_oData; + +// Scan and Compact int* dev_scanData; int* dev_boolData; -int* dev_oData; + +// Radix sort +int* dev_bData; +int* dev_eData; +int* dev_fData; +int* dev_tData; +int* dev_dData; +int* dev_totalFalses; namespace StreamCompaction { namespace Efficient { @@ -41,12 +53,6 @@ namespace StreamCompaction { data[n - 1] = 0; } - // if you copy the NPOT array into a POT GPU bfffer, and you pad any of the data - // that doesn't exist with zeroes, it makes result of the scan instead of the - // array being like. if you pad zeroes, the value gets repeated a bunch of times - - // could also try to adjust how many threads get run - __global__ void kernStepDownSweep(int n, int* data, int pow2) { int index = blockIdx.x * blockDim.x + threadIdx.x; if (index >= n) { @@ -119,8 +125,7 @@ namespace StreamCompaction { kernStepUpSweep << > > (size, dev_boolData, (int)powf(2, d)); } - odata[size - 1] = 0; - cudaMemcpy(dev_boolData + size - 1, odata + size - 1, sizeof(int), cudaMemcpyHostToDevice); + kernSetRootNode << <1, 1 >> > (size, dev_boolData); for (int d = log2n - 1; d >= 0; d--) { kernStepDownSweep << > > (size, dev_boolData, (int)powf(2, d)); @@ -145,4 +150,126 @@ namespace StreamCompaction { return boolArray[n - 1] + 1; } } + + + namespace Radix { + using StreamCompaction::Common::PerformanceTimer; + PerformanceTimer& timer() + { + static PerformanceTimer timer; + return timer; + } + + // bit number goes from 1 to n + __global__ void kernComputeBArray(int n, int bitNumber, int* bdata, const int* idata) { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) { + return; + } + + int data = idata[index]; + int bit = (data & (1 << bitNumber - 1)) != 0; + bdata[index] = bit; + } + + __global__ void kernComputeEArray(int n, int* edata, int* fdata, const int* bdata) { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) { + return; + } + edata[index] = !(bdata[index]); + fdata[index] = edata[index]; + } + + __global__ void kernComputeTotalFalses(int n, int* out, int* edata, int* fdata) { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) { + return; + } + *out = edata[n - 1] + fdata[n - 1]; + } + + __global__ void kernComputeTArray(int n, int* tdata, int* edata, int* fdata, int* totalFalses) { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) { + return; + } + tdata[index] = index - fdata[index] + *totalFalses; + } + + __global__ void kernComputeDArray(int n, int* ddata, int* bdata, int* fdata, int* tdata) { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) { + return; + } + ddata[index] = bdata[index] ? tdata[index] : fdata[index]; + } + + __global__ void kernScatterRadix(int n, int* odata, int* ddata, const int* idata) { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) { + return; + } + + odata[ddata[index]] = idata[index]; + } + + void radixSort(int n, int* odata, const int* idata) { + int numBlocks = ceil((float)n / (float)blockSize); + int log2n = ilog2ceil(n); + const int size = (int)powf(2, log2n); + + cudaMalloc((void**)&dev_data, sizeof(int) * n); + cudaMalloc((void**)&dev_bData, sizeof(int) * n); + cudaMalloc((void**)&dev_eData, sizeof(int) * n); + cudaMalloc((void**)&dev_fData, sizeof(int) * size); + cudaMalloc((void**)&dev_tData, sizeof(int) * n); + cudaMalloc((void**)&dev_dData, sizeof(int) * n); + cudaMalloc((void**)&dev_totalFalses, sizeof(int)); + + + cudaMemcpy(dev_data, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + + // Find max element. + int maxElement = 0; + for (int i = 0; i < n; i++) { + if (idata[i] > maxElement) + maxElement = idata[i]; + } + + for (int bitNumber = 1; maxElement /((int) powf(2, bitNumber - 1)) > 0; bitNumber++) { + kernComputeBArray << > > (n, bitNumber, dev_bData, dev_data); + kernComputeEArray << > > (n, dev_eData, dev_fData, dev_bData); + + + // Compute f Array + for (int d = 0; d <= log2n - 1; d++) { + StreamCompaction::Efficient::kernStepUpSweep << > > (size, dev_fData, (int)powf(2, d)); + } + + StreamCompaction::Efficient::kernSetRootNode << <1, 1 >> > (size, dev_fData); + + for (int d = log2n - 1; d >= 0; d--) { + StreamCompaction::Efficient::kernStepDownSweep << > > (size, dev_fData, (int)powf(2, d)); + } + + kernComputeTotalFalses << <1, 1 >> > (n, dev_totalFalses, dev_eData, dev_fData); + kernComputeTArray << > > (n, dev_tData, dev_eData, dev_fData, dev_totalFalses); + kernComputeDArray << > > (n, dev_dData, dev_bData, dev_fData, dev_tData); + kernScatterRadix << > > (n, dev_data, dev_dData, dev_data); + } + + cudaMemcpy(odata, dev_data, sizeof(int) * n, cudaMemcpyDeviceToHost); + + cudaFree(dev_data); + cudaFree(dev_bData); + cudaFree(dev_eData); + cudaFree(dev_fData); + cudaFree(dev_tData); + cudaFree(dev_dData); + cudaFree(dev_totalFalses); + + } + } + } diff --git a/stream_compaction/efficient.h b/stream_compaction/efficient.h index 803cb4f..f004913 100644 --- a/stream_compaction/efficient.h +++ b/stream_compaction/efficient.h @@ -10,4 +10,11 @@ namespace StreamCompaction { int compact(int n, int *odata, const int *idata); } + + namespace Radix { + StreamCompaction::Common::PerformanceTimer& timer(); + + void radixSort(int n, int* odata, const int* idata); + } + } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index f45c691..c473f0a 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -22,17 +22,14 @@ namespace StreamCompaction { */ void scan(int n, int *odata, const int *idata) { - cudaMalloc((void**)&dev_inData, sizeof(int) * n); - cudaMalloc((void**)&dev_outData, sizeof(int) * n); - cudaMemcpy(dev_inData, idata, sizeof(int) * n, cudaMemcpyHostToDevice); timer().startGpuTimer(); - thrust::device_ptr dev_thrust_idata(dev_inData); - thrust::device_ptr dev_thrust_odata(dev_outData); - thrust::exclusive_scan(dev_thrust_idata, dev_thrust_idata + n, dev_thrust_odata); + thrust::host_vector host_v(n); + thrust::copy(idata, idata + n, host_v.begin()); + thrust::device_vector dev_v = host_v; + thrust::device_vector out_v(n); + thrust::exclusive_scan(dev_v.begin(), dev_v.end(), out_v.begin()); + thrust::copy(out_v.begin(), out_v.end(), odata); timer().endGpuTimer(); - cudaMemcpy(odata, dev_outData, sizeof(int) * n, cudaMemcpyDeviceToHost); - cudaFree(dev_inData); - cudaFree(dev_outData); } } } From 5e711abb7e4a8bc6566c80f4c09bf2cfa8ef55d8 Mon Sep 17 00:00:00 2001 From: Janine Liu Date: Tue, 22 Sep 2020 18:33:39 -0400 Subject: [PATCH 8/8] Update README to reflect extra credit --- README.md | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ba2501c..94fda1f 100644 --- a/README.md +++ b/README.md @@ -95,9 +95,9 @@ Unfortunately, the Work-Efficient Scan is less efficient than the Naive Scan. Be ![](img/scan_cuda_analysis.png) -The total kernel run-time of Work-Efficient Scan is about two times that of Naive Scan, so Work-Efficient Scan takes twice as much time. This is a problem with the lack of optimization in the kernel calls; the kernels are not efficient enough to balance out the fact that there are twice as many calls. +The total kernel run-time of Work-Efficient Scan is about two times that of Naive Scan, so Work-Efficient Scan takes twice as much time. This is a problem with the lack of optimization in the kernel calls; the kernels are not efficient enough to balance out the fact that there are twice as many calls. Indeed, many of the threads during each kernel call are being unused, and the array access is not contiguous in memory, contributing to the slowness of the algorithm. -Interestingly, the Thrust Scan's performance stays relatively the same no matter what. I could not find it on NSight's Timeline, even when it was the only function being called, so I cannot genuinely analyze its performance or hypothesize why it's so consistent. +Interestingly, the Thrust Scan's performance stays relatively constant no matter the size. I could not find it on NSight's Timeline, even when it was the only function being called, so I cannot genuinely analyze its performance or hypothesize why it's so consistent. ## Compact Runtime Analysis @@ -125,3 +125,27 @@ The process to optimize block size was very informal; I ran the program a number * It was difficult to sense a difference between block sizes 64 and 128. * A block size of 256 seems to make work efficient scan faster, dropping by 0.2ms on avergae, but slightly taxes work compact 0.1-0.2ms. * There is much more performance fluctuation with 512, causing the Work-Efficient Scan and Compact to lag abnormally. Therefore, it is unideal for our algorithms. + +## Radix Sort (Extra Credit) + +I implemented radix sort and wrote some test cases for it. Since radix sort draws upon the Scan algorithm for its implementation, its performance relies on the performance of the Work-Efficient algorithm, which is not at its most efficient currently. An example of my test case outputs is below: + +``` +***************************** +** RADIX SORT TESTS ** +***************************** + [ 20 88 42 96 80 14 7 35 81 54 67 80 32 ... 75 0 ] +==== radix, power-of-two ==== + [ 0 0 0 0 0 0 0 0 0 0 0 1 1 ... 99 99 ] + passed +==== radix, non power-of-two ==== + passed +==== radix, unsorted array of 1 - 8 ==== + [ 0 1 2 3 4 5 6 7 ] + passed +==== radix, array with duplicates ==== + [ 1 4 28 42 42 53 129 129 ] + passed +==== radix, backwards sorted array ==== + passed +``` \ No newline at end of file