From b6005ea4cc93899095c20e48dbe9b5714e269011 Mon Sep 17 00:00:00 2001 From: fakeljl <694118974@qq.com> Date: Thu, 17 Sep 2020 22:37:24 -0400 Subject: [PATCH 01/10] Add cpu and naive scan --- src/main.cpp | 1 + stream_compaction/cpu.cu | 44 ++++++++++++++++++++++++++-- stream_compaction/naive.cu | 60 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 101 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 896ac2b..87a818e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,6 +28,7 @@ int main(int argc, char* argv[]) { printf("****************\n"); genArray(SIZE - 1, a, 50); // Leave a 0 at the end to test that edge case + //onesArray(SIZE, a); a[SIZE - 1] = 0; printArray(SIZE, a, true); diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 719fa11..c137c0d 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -20,6 +20,11 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + int sum = 0; // identity + for (int i = 0; i < n; i++) { + odata[i] = sum; + sum += idata[i]; + } timer().endCpuTimer(); } @@ -31,8 +36,14 @@ namespace StreamCompaction { int compactWithoutScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + int p = 0; + for (int i = 0; i < n; i++) { + if (idata[i] != 0) { // remove 0 + odata[p++] = idata[i]; + } + } timer().endCpuTimer(); - return -1; + return p; } /** @@ -43,8 +54,37 @@ namespace StreamCompaction { int compactWithScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + if (n < 1) { + return 0; + } + int* e = new int[n]; + for (int i = 0; i < n; i++) { + e[i] = idata[i] != 0; + } + + // scan + int* prefix = new int[n]; + int sum = 0; + for (int i = 0; i < n; i++) { + prefix[i] = sum; + sum += e[i]; + } + + // scatter + for (int i = 0; i < n - 1; i++) { + if (prefix[i] != prefix[i + 1]) { + odata[prefix[i]] = idata[i]; + } + } + int len = prefix[n - 1]; + if (e[n - 1] == 1) { + len++; + odata[prefix[n - 1]] = idata[n - 1]; + } + delete[] e; + delete[] prefix; timer().endCpuTimer(); - return -1; + return len; } } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 4308876..18da9e8 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -13,13 +13,69 @@ namespace StreamCompaction { } // TODO: __global__ + __global__ void kernNaiveScan(int n, int offset, + int* odata, const int* idata) { + int index = threadIdx.x + blockIdx.x * blockDim.x; + if (index >= offset && index < n) { + odata[index] = idata[index - offset] + idata[index]; + } + else if (index < offset) { + odata[index] = idata[index]; + } + } + + __global__ void kernRightShift(int n, int* odata, int* idata) { + int index = threadIdx.x + blockIdx.x * blockDim.x; + if (index == 0) { + odata[index] = 0; + } + else if (index < n) { + 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) { + void scan(int n, int *odata, const int *idata) { // TODO + // Two ping pong buffers + int* dev_data1 = nullptr; + int* dev_data2 = nullptr; + + // Allocate memory on device + cudaMalloc((void**)&dev_data1, n * sizeof(int)); + checkCUDAError("cudaMalloc dev_data1 failed!"); + cudaMalloc((void**)&dev_data2, n * sizeof(int)); + checkCUDAError("cudaMalloc dev_data2 failed!"); + + // Copy data from host to device + cudaMemcpy(dev_data1, idata, n * sizeof(int), cudaMemcpyHostToDevice); + timer().startGpuTimer(); - // TODO + + if (n > 0) { + dim3 threadsPerBlock(128); + int d = ilog2ceil(n); + int offset = 1; + dim3 blocks(n / threadsPerBlock.x + 1); + for (int i = 1; i <= d; i++) { + kernNaiveScan << > > (n, offset, dev_data2, dev_data1); + std::swap(dev_data1, dev_data2); + offset <<= 1; + } + + // Right shift to get the exclusive prefix sum + kernRightShift << > > (n, dev_data2, dev_data1); + } + timer().endGpuTimer(); + + // Copy data back from device to host + cudaMemcpy(odata, dev_data2, n * sizeof(int), cudaMemcpyDeviceToHost); + + // Free device memory + cudaFree(dev_data1); + cudaFree(dev_data2); } } } From 375e1e4b819e3d7d038f9fac898065d2ca0a9426 Mon Sep 17 00:00:00 2001 From: fakeljl <694118974@qq.com> Date: Fri, 18 Sep 2020 17:06:42 -0400 Subject: [PATCH 02/10] Add work efficient scan --- src/main.cpp | 2 +- stream_compaction/efficient.cu | 73 +++++++++++++++++++++++++++++++++- stream_compaction/naive.cu | 6 ++- stream_compaction/naive.h | 5 +++ 4 files changed, 81 insertions(+), 5 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 87a818e..33d7f59 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 << 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]; diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 2db346e..ccba471 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -12,13 +12,82 @@ namespace StreamCompaction { return timer; } + __global__ void kernEfficientUpSweep(int n, int offset, int* data) { + int index = threadIdx.x + blockIdx.x * blockDim.x; + index = (index + 1) * offset * 2 - 1; + if (index >= n) { + return; + } + data[index] += data[index - offset]; + } + + __global__ void kernEfficientDownSweep(int n, int offset, int* data) { + int index = threadIdx.x + blockIdx.x * blockDim.x; + index = (index + 1) * 2 * offset - 1; + if (index >= n) { + return; + } + int temp = data[index - offset]; + data[index - offset] = data[index]; + data[index] += temp; + } + /** * 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) { // TODO + if (n < 1) { + return; + } + int d = ilog2ceil(n); + int full = 1 << d; + int* dev_data = nullptr; + + // Allocate memory on device + cudaMalloc((void**)&dev_data, full * sizeof(int)); + checkCUDAError("cudaMalloc dev_data failed!"); + + // Set additional memory values to zero + cudaMemset(dev_data + n, 0, (full - n) * sizeof(int)); + checkCUDAError("cudaMemset dev_data failed!"); + + // Copy data from host to device + cudaMemcpy(dev_data, idata, n * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("cudaMemcpy to device failed!"); + timer().startGpuTimer(); - // TODO + + dim3 threadsPerBlock(128); + + // Up-Sweep + int offset = 1; + for (int i = 0; i < d; i++) { + int nodeNumber = 1 << (d - i - 1); + dim3 blocks(nodeNumber / threadsPerBlock.x + 1); + kernEfficientUpSweep << > > + (full, offset, dev_data); + offset <<= 1; + } + + // Down-Sweep + cudaMemset(dev_data + full - 1, 0, sizeof(int)); + for (int i = 0; i < d; i++) { + offset >>= 1; + int nodeNumber = 1 << i; + dim3 blocks(nodeNumber / threadsPerBlock.x + 1); + kernEfficientDownSweep << > > + (full, offset, dev_data); + } + + timer().endGpuTimer(); + + // Copy data back to host + cudaMemcpy(odata, dev_data, n * sizeof(int), cudaMemcpyDeviceToHost); + checkCUDAError("memcpy back failed!"); + + // Free device memory + cudaFree(dev_data); } /** diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 18da9e8..57df169 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -59,13 +59,15 @@ namespace StreamCompaction { int offset = 1; dim3 blocks(n / threadsPerBlock.x + 1); for (int i = 1; i <= d; i++) { - kernNaiveScan << > > (n, offset, dev_data2, dev_data1); + kernNaiveScan << > > + (n, offset, dev_data2, dev_data1); std::swap(dev_data1, dev_data2); offset <<= 1; } // Right shift to get the exclusive prefix sum - kernRightShift << > > (n, dev_data2, dev_data1); + kernRightShift << > > + (n, dev_data2, dev_data1); } timer().endGpuTimer(); diff --git a/stream_compaction/naive.h b/stream_compaction/naive.h index 37dcb06..6690a8b 100644 --- a/stream_compaction/naive.h +++ b/stream_compaction/naive.h @@ -6,6 +6,11 @@ namespace StreamCompaction { namespace Naive { StreamCompaction::Common::PerformanceTimer& timer(); + __global__ void kernNaiveScan(int n, int offset, + int* odata, const int* idata); + + __global__ void kernRightShift(int n, int* odata, int* idata); + void scan(int n, int *odata, const int *idata); } } From d4b4eed9a404039ef448800a2e476fc24e23ae32 Mon Sep 17 00:00:00 2001 From: fakeljl <694118974@qq.com> Date: Fri, 18 Sep 2020 17:31:56 -0400 Subject: [PATCH 03/10] Fix a bug --- src/main.cpp | 2 +- stream_compaction/efficient.cu | 28 ++++++++++++++++------------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 33d7f59..87a818e 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 << 8; // 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 ccba471..19a3ecb 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -12,21 +12,25 @@ namespace StreamCompaction { return timer; } - __global__ void kernEfficientUpSweep(int n, int offset, int* data) { + __global__ void kernEfficientUpSweep(int n, int offset, + int numNode, int* data) { int index = threadIdx.x + blockIdx.x * blockDim.x; - index = (index + 1) * offset * 2 - 1; - if (index >= n) { + if (index >= numNode) { return; } + index = (index + 1) * offset * 2 - 1; + data[index] += data[index - offset]; } - __global__ void kernEfficientDownSweep(int n, int offset, int* data) { + __global__ void kernEfficientDownSweep(int n, int offset, + int numNode, int* data) { int index = threadIdx.x + blockIdx.x * blockDim.x; - index = (index + 1) * 2 * offset - 1; - if (index >= n) { + if (index >= numNode) { return; } + index = (index + 1) * 2 * offset - 1; + int temp = data[index - offset]; data[index - offset] = data[index]; data[index] += temp; @@ -62,10 +66,10 @@ namespace StreamCompaction { // Up-Sweep int offset = 1; for (int i = 0; i < d; i++) { - int nodeNumber = 1 << (d - i - 1); - dim3 blocks(nodeNumber / threadsPerBlock.x + 1); + int numNode = 1 << (d - i - 1); + dim3 blocks(numNode / threadsPerBlock.x + 1); kernEfficientUpSweep << > > - (full, offset, dev_data); + (full, offset, numNode, dev_data); offset <<= 1; } @@ -73,10 +77,10 @@ namespace StreamCompaction { cudaMemset(dev_data + full - 1, 0, sizeof(int)); for (int i = 0; i < d; i++) { offset >>= 1; - int nodeNumber = 1 << i; - dim3 blocks(nodeNumber / threadsPerBlock.x + 1); + int numNode = 1 << i; + dim3 blocks(numNode / threadsPerBlock.x + 1); kernEfficientDownSweep << > > - (full, offset, dev_data); + (full, offset, numNode, dev_data); } From 3eec9d30387afe888d8b73493cfd95b96d53e80d Mon Sep 17 00:00:00 2001 From: fakeljl <694118974@qq.com> Date: Sun, 20 Sep 2020 00:25:37 -0400 Subject: [PATCH 04/10] Todo: thrust --- src/main.cpp | 3 +- stream_compaction/common.cu | 12 ++++ stream_compaction/efficient.cu | 116 ++++++++++++++++++++++++++------- stream_compaction/thrust.cu | 13 +++- 4 files changed, 116 insertions(+), 28 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 87a818e..3becb91 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 << 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]; @@ -26,6 +26,7 @@ int main(int argc, char* argv[]) { printf("****************\n"); printf("** SCAN TESTS **\n"); printf("****************\n"); + printf("%d\n", SIZE); genArray(SIZE - 1, a, 50); // Leave a 0 at the end to test that edge case //onesArray(SIZE, a); diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 2ed6d63..7bb73b8 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -24,6 +24,11 @@ namespace StreamCompaction { */ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { // TODO + int index = threadIdx.x + blockIdx.x * blockDim.x; + if (index >= n) { + return; + } + bools[index] = idata[index] == 0 ? 0 : 1; } /** @@ -33,6 +38,13 @@ 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/efficient.cu b/stream_compaction/efficient.cu index 19a3ecb..e79cc35 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -36,6 +36,30 @@ namespace StreamCompaction { data[index] += temp; } + void scanHelper(int full, int d, int blockSize, int *dev_data) { + dim3 threadsPerBlock(blockSize); + + // Up-Sweep + int offset = 1; + for (int i = 0; i < d; i++) { + int numNode = 1 << (d - i - 1); + dim3 blocks(numNode / threadsPerBlock.x + 1); + kernEfficientUpSweep << > > + (full, offset, numNode, dev_data); + offset <<= 1; + } + + // Down-Sweep + cudaMemset(dev_data + full - 1, 0, sizeof(int)); + for (int i = 0; i < d; i++) { + offset >>= 1; + int numNode = 1 << i; + dim3 blocks(numNode / threadsPerBlock.x + 1); + kernEfficientDownSweep << > > + (full, offset, numNode, dev_data); + } + } + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ @@ -61,28 +85,8 @@ namespace StreamCompaction { timer().startGpuTimer(); - dim3 threadsPerBlock(128); - - // Up-Sweep - int offset = 1; - for (int i = 0; i < d; i++) { - int numNode = 1 << (d - i - 1); - dim3 blocks(numNode / threadsPerBlock.x + 1); - kernEfficientUpSweep << > > - (full, offset, numNode, dev_data); - offset <<= 1; - } - - // Down-Sweep - cudaMemset(dev_data + full - 1, 0, sizeof(int)); - for (int i = 0; i < d; i++) { - offset >>= 1; - int numNode = 1 << i; - dim3 blocks(numNode / threadsPerBlock.x + 1); - kernEfficientDownSweep << > > - (full, offset, numNode, dev_data); - } - + int blockSize = 32; + scanHelper(full, d, blockSize, dev_data); timer().endGpuTimer(); @@ -103,11 +107,73 @@ namespace StreamCompaction { * @param idata The array of elements to compact. * @returns The number of elements remaining after compaction. */ - int compact(int n, int *odata, const int *idata) { + int compact(int n, int *odata, const int *idata) { // TODO + if (n < 1) { + return 0; + } + int* dev_data = nullptr; + int* dev_bools = nullptr; + int* dev_indices = nullptr; + int* dev_final = nullptr; + + int d = ilog2ceil(n); + int full = 1 << d; + + // Allocate memory on device + cudaMalloc((void**)&dev_data, n * sizeof(int)); + checkCUDAError("cudaMalloc dev_data failed!"); + cudaMalloc((void**)&dev_bools, n * sizeof(int)); + checkCUDAError("cudaMalloc dev_bools failed!"); + cudaMalloc((void**)&dev_indices, full * sizeof(int)); + checkCUDAError("cudaMalloc dev_indices failed!"); + cudaMalloc((void**)&dev_final, full * sizeof(int)); + checkCUDAError("cudaMalloc dev_final failed!"); + + // Copy data to device + cudaMemcpy(dev_data, idata, n * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("cudaMemcpy to device failed!"); + + // Set additional elements zero + cudaMemset(dev_indices + n, 0, (full - n) * sizeof(int)); + checkCUDAError("cudaMemset dev_bools failed!"); + timer().startGpuTimer(); - // TODO + + int blockSize = 128; + + dim3 threadsPerBlock(blockSize); + dim3 blocks(n / threadsPerBlock.x + 1); + + StreamCompaction::Common::kernMapToBoolean + << > > (n, dev_bools, dev_data); + + cudaMemcpy(dev_indices, dev_bools, n * sizeof(int), + cudaMemcpyDeviceToDevice); + + scanHelper(full, d, blockSize, dev_indices); + + StreamCompaction::Common::kernScatter<< > > + (n, dev_final, dev_data, dev_bools, dev_indices); + timer().endGpuTimer(); - return -1; + + // Get the number of remaining elements + int lastIndex; + int lastBool; + cudaMemcpy((void*)&lastIndex, dev_indices + n - 1, sizeof(int), cudaMemcpyDeviceToHost); + cudaMemcpy((void*)&lastBool, dev_bools + n - 1, sizeof(int), cudaMemcpyDeviceToHost); + int remain = lastIndex + lastBool; + + // Copy data back to host + cudaMemcpy(odata, dev_final, remain * sizeof(int), cudaMemcpyDeviceToHost); + + // Free device memory + cudaFree(dev_data); + cudaFree(dev_bools); + cudaFree(dev_indices); + cudaFree(dev_final); + + return remain; } } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 1def45e..f462aa8 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -17,12 +17,21 @@ namespace StreamCompaction { /** * 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) { // TODO + thrust::host_vector host_idata(idata, idata + n); + thrust::device_vector dev_idata(host_idata); + thrust::device_vector dev_odata(n); + timer().startGpuTimer(); - // TODO use `thrust::exclusive_scan` + // 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_idata.begin(), dev_idata.end(), dev_odata.begin()); + + timer().endGpuTimer(); + } } } From 7f418e56daa62cf89ba47d8d297e29c830e0855b Mon Sep 17 00:00:00 2001 From: fakeljl <694118974@qq.com> Date: Sun, 20 Sep 2020 18:42:02 -0400 Subject: [PATCH 05/10] Add thrust scan --- src/main.cpp | 5 ++--- stream_compaction/efficient.cu | 2 +- stream_compaction/efficient.h | 8 ++++++++ stream_compaction/thrust.cu | 12 ++++++++++-- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 3becb91..4687dd8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 18; // feel free to change the size of array +const int SIZE = 1 << 22; // feel free to change the size of array const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; @@ -26,16 +26,15 @@ int main(int argc, char* argv[]) { printf("****************\n"); printf("** SCAN TESTS **\n"); printf("****************\n"); - printf("%d\n", SIZE); genArray(SIZE - 1, a, 50); // Leave a 0 at the end to test that edge case - //onesArray(SIZE, a); a[SIZE - 1] = 0; printArray(SIZE, a, true); // initialize b using StreamCompaction::CPU::scan you implement // 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"); StreamCompaction::CPU::scan(SIZE, b, a); diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index e79cc35..0d0ff21 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -85,7 +85,7 @@ namespace StreamCompaction { timer().startGpuTimer(); - int blockSize = 32; + int blockSize = 128; scanHelper(full, d, blockSize, dev_data); timer().endGpuTimer(); diff --git a/stream_compaction/efficient.h b/stream_compaction/efficient.h index 803cb4f..d2be253 100644 --- a/stream_compaction/efficient.h +++ b/stream_compaction/efficient.h @@ -6,6 +6,14 @@ namespace StreamCompaction { namespace Efficient { StreamCompaction::Common::PerformanceTimer& timer(); + __global__ void kernEfficientUpSweep(int n, int offset, + int numNode, int* data); + + __global__ void kernEfficientDownSweep(int n, int offset, + int numNode, int* data); + + void scanHelper(int full, int d, int blockSize, int* dev_data); + void scan(int n, int *odata, const int *idata); int compact(int n, int *odata, const int *idata); diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index f462aa8..efaf94d 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -14,24 +14,32 @@ namespace StreamCompaction { 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) { // TODO thrust::host_vector host_idata(idata, idata + n); + + // You may encounter exception in debug build, press continue + + // Copy host_vector to device_vector thrust::device_vector dev_idata(host_idata); thrust::device_vector dev_odata(n); timer().startGpuTimer(); + // 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_idata.begin(), dev_idata.end(), dev_odata.begin()); - timer().endGpuTimer(); + // Copy data back to host + thrust::copy(dev_odata.begin(), dev_odata.end(), odata); + + // device and host vector are automatically deleted when the function returns } } } From 301b54b45492cdad51e301b91e3bb50e85443dad Mon Sep 17 00:00:00 2001 From: Songsong97 <32126346+Songsong97@users.noreply.github.com> Date: Sun, 20 Sep 2020 19:47:42 -0400 Subject: [PATCH 06/10] Update README.md --- README.md | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 127 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 0e38ddb..64c1b8c 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,133 @@ 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) +* Jilin Liu + * [LinkedIn](https://www.linkedin.com/in/jilin-liu-61b273192/), [twitter](https://twitter.com/Jilin18043110). +* Tested on: Windows 10, i7-8750H @ 2.20GHz, 16GB, GTX 1050Ti 4096MB (personal) -### (TODO: Your README) +## Features and Results + +This project includes several parallel algorithms such as exclusive scan and stream compaction. These algorithms can be very useful as independent components of later projects like GPU based path tracer. A serial CPU version of these algorithms is also implemented and used as a performance comparison baseline. + +Features: +1. CPU Scan +2. CPU Stream Compact +3. Naive GPU Scan +4. Work-Efficient Scan +5. Work-Efficient Stream Compact + +Extra Credit: +1. Faster GPU Implementation + +``` +**************** +** SCAN TESTS ** +**************** + [ 30 44 27 31 9 34 15 27 24 39 44 33 38 ... 18 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 17.3105ms (std::chrono Measured) + [ 0 30 74 101 132 141 175 190 217 241 280 324 357 ... 102764441 102764459 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 2.102ms (std::chrono Measured) + [ 0 30 74 101 132 141 175 190 217 241 280 324 357 ... 102764362 102764372 ] + passed +==== naive scan, power-of-two ==== + elapsed time: 8.62189ms (CUDA Measured) + passed +==== naive scan, non-power-of-two ==== + elapsed time: 8.62202ms (CUDA Measured) + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 3.79942ms (CUDA Measured) + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 3.77037ms (CUDA Measured) + passed +==== thrust scan, power-of-two ==== + elapsed time: 0.560736ms (CUDA Measured) + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 0.639808ms (CUDA Measured) + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 0 0 1 3 3 0 1 1 2 3 0 3 2 ... 0 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 9.2661ms (std::chrono Measured) + [ 1 3 3 1 1 2 3 3 2 3 2 3 3 ... 2 3 ] + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 9.253ms (std::chrono Measured) + [ 1 3 3 1 1 2 3 3 2 3 2 3 3 ... 2 2 ] + passed +==== cpu compact with scan ==== + elapsed time: 24.8881ms (std::chrono Measured) + [ 1 3 3 1 1 2 3 3 2 3 2 3 3 ... 2 3 ] + passed +==== work-efficient compact, power-of-two ==== + elapsed time: 5.13638ms (CUDA Measured) + passed +==== work-efficient compact, non-power-of-two ==== + elapsed time: 5.15882ms (CUDA Measured) + passed +``` + +## Performance Analysis + +A more detailed performance comparison of exclusive scan with respect to the array size is shown below. + +![](comp1.JPG) + +![](comp2.JPG) + +The thrust implementation has the best scalability and runs about 10 times faster than my work-efficient scan. But its execution time still follows a linear increase with respect to the array size. My hypothesis about its efficiency is that it's using shared memory. + +In the timeline below, we can easily spot the bottleneck of my implementation. As I precluded the time measurement of device-to-host and host-to-device memory copy, the majority execution time comes from the calling of up-sweep kernel function and down-sweep kernel function. The up-sweep and down-sweep in total take 5 times longer than scatter and 10 times longer than map-to-boolean. + +![](t.JPG) + +![](t2.JPG) + +The thrust scan seems to have two stage as well, as you can see below. But there is an noticable gap between two kernel functions. My guess is that they are packing memory into shared memories so the access can be much faster. + +![](thrust.JPG) + +In each step of up-sweep and down-sweep, I only used those threads that are necessary to the algorithm. Since in each step we are only accessing and modifying a subset of the array elements, so the number of threads we need is proportional to the size of this subset. This trick eliminates a large number of lazy threads and thus makes the program run faster. + +When the array has a trivial size, i.e. 256 elements, the CPU version runs faster(even faster than thrust implementation). The reason is that GPU has a overhead of packing and scheduling threads, which overweighs the benefits from parrallelism when the array size is small, as you can see below. + +``` +**************** +** SCAN TESTS ** +**************** + [ 38 13 31 10 45 3 41 44 26 12 44 28 12 ... 10 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 0.0005ms (std::chrono Measured) + [ 0 38 51 82 92 137 140 181 225 251 263 307 335 ... 6247 6257 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 0.0004ms (std::chrono Measured) + [ 0 38 51 82 92 137 140 181 225 251 263 307 335 ... 6169 6198 ] + passed +==== naive scan, power-of-two ==== + elapsed time: 0.017408ms (CUDA Measured) + passed +==== naive scan, non-power-of-two ==== + elapsed time: 0.017408ms (CUDA Measured) + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 0.050176ms (CUDA Measured) + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 0.044032ms (CUDA Measured) + passed +==== thrust scan, power-of-two ==== + elapsed time: 0.04448ms (CUDA Measured) + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 0.041984ms (CUDA Measured) + passed +``` -Include analysis, etc. (Remember, this is public, so don't put -anything here that you don't want to share with the world.) From 47810da9707579706bdbebfe427260284feae9ef Mon Sep 17 00:00:00 2001 From: fakeljl <694118974@qq.com> Date: Sun, 20 Sep 2020 19:48:02 -0400 Subject: [PATCH 07/10] Add images --- images/comp1.JPG | Bin 0 -> 44170 bytes images/comp2.JPG | Bin 0 -> 46218 bytes images/t.JPG | Bin 0 -> 47226 bytes images/t2.JPG | Bin 0 -> 55333 bytes images/thrust.JPG | Bin 0 -> 27859 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/comp1.JPG create mode 100644 images/comp2.JPG create mode 100644 images/t.JPG create mode 100644 images/t2.JPG create mode 100644 images/thrust.JPG diff --git a/images/comp1.JPG b/images/comp1.JPG new file mode 100644 index 0000000000000000000000000000000000000000..5e39029f4c8811091720f11351399774fbfb23a8 GIT binary patch literal 44170 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 vt@04F7n*6ANcE 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 z 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 Bb&3E0 literal 0 HcmV?d00001 diff --git a/images/thrust.JPG b/images/thrust.JPG new file mode 100644 index 0000000000000000000000000000000000000000..83e5f45be6025e3fc8e3af8c0448aa6457f22b52 GIT binary patch literal 27859 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 Date: Sun, 20 Sep 2020 19:49:25 -0400 Subject: [PATCH 08/10] Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 64c1b8c..51dbe3f 100644 --- a/README.md +++ b/README.md @@ -80,21 +80,21 @@ Extra Credit: A more detailed performance comparison of exclusive scan with respect to the array size is shown below. -![](comp1.JPG) +![](.images/comp1.JPG) -![](comp2.JPG) +![](.images/comp2.JPG) The thrust implementation has the best scalability and runs about 10 times faster than my work-efficient scan. But its execution time still follows a linear increase with respect to the array size. My hypothesis about its efficiency is that it's using shared memory. In the timeline below, we can easily spot the bottleneck of my implementation. As I precluded the time measurement of device-to-host and host-to-device memory copy, the majority execution time comes from the calling of up-sweep kernel function and down-sweep kernel function. The up-sweep and down-sweep in total take 5 times longer than scatter and 10 times longer than map-to-boolean. -![](t.JPG) +![](.images/t.JPG) -![](t2.JPG) +![](.images/t2.JPG) The thrust scan seems to have two stage as well, as you can see below. But there is an noticable gap between two kernel functions. My guess is that they are packing memory into shared memories so the access can be much faster. -![](thrust.JPG) +![](.images/thrust.JPG) In each step of up-sweep and down-sweep, I only used those threads that are necessary to the algorithm. Since in each step we are only accessing and modifying a subset of the array elements, so the number of threads we need is proportional to the size of this subset. This trick eliminates a large number of lazy threads and thus makes the program run faster. From 8edc25cdf78eba8f0a261d82cc46762cb1227073 Mon Sep 17 00:00:00 2001 From: Songsong97 <32126346+Songsong97@users.noreply.github.com> Date: Sun, 20 Sep 2020 19:50:08 -0400 Subject: [PATCH 09/10] Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 51dbe3f..86e953b 100644 --- a/README.md +++ b/README.md @@ -80,21 +80,21 @@ Extra Credit: A more detailed performance comparison of exclusive scan with respect to the array size is shown below. -![](.images/comp1.JPG) +![](./images/comp1.JPG) -![](.images/comp2.JPG) +![](./images/comp2.JPG) The thrust implementation has the best scalability and runs about 10 times faster than my work-efficient scan. But its execution time still follows a linear increase with respect to the array size. My hypothesis about its efficiency is that it's using shared memory. In the timeline below, we can easily spot the bottleneck of my implementation. As I precluded the time measurement of device-to-host and host-to-device memory copy, the majority execution time comes from the calling of up-sweep kernel function and down-sweep kernel function. The up-sweep and down-sweep in total take 5 times longer than scatter and 10 times longer than map-to-boolean. -![](.images/t.JPG) +![](./images/t.JPG) -![](.images/t2.JPG) +![](./images/t2.JPG) The thrust scan seems to have two stage as well, as you can see below. But there is an noticable gap between two kernel functions. My guess is that they are packing memory into shared memories so the access can be much faster. -![](.images/thrust.JPG) +![](./images/thrust.JPG) In each step of up-sweep and down-sweep, I only used those threads that are necessary to the algorithm. Since in each step we are only accessing and modifying a subset of the array elements, so the number of threads we need is proportional to the size of this subset. This trick eliminates a large number of lazy threads and thus makes the program run faster. From 30a581e7cea42b776a6d050afc37d8d459f12db1 Mon Sep 17 00:00:00 2001 From: Songsong97 <32126346+Songsong97@users.noreply.github.com> Date: Tue, 1 Dec 2020 13:19:51 -0500 Subject: [PATCH 10/10] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 86e953b..de503ff 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ CUDA Stream Compaction **University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 2** * Jilin Liu - * [LinkedIn](https://www.linkedin.com/in/jilin-liu-61b273192/), [twitter](https://twitter.com/Jilin18043110). + * [LinkedIn](https://www.linkedin.com/in/jilin-liu97/), [twitter](https://twitter.com/Jilin18043110). * Tested on: Windows 10, i7-8750H @ 2.20GHz, 16GB, GTX 1050Ti 4096MB (personal) ## Features and Results