From 347651d8027092ed2eff0afc6f03dfe61ad24266 Mon Sep 17 00:00:00 2001 From: HantingXu Date: Thu, 14 Sep 2023 23:38:35 -0400 Subject: [PATCH 1/7] basic functions implemented --- src/main.cpp | 46 ++++---- stream_compaction/common.cu | 29 +++++ stream_compaction/cpu.cu | 53 ++++++++- stream_compaction/efficient.cu | 194 ++++++++++++++++++++++++++++++++- stream_compaction/naive.cu | 85 ++++++++++++++- stream_compaction/thrust.cu | 12 +- 6 files changed, 389 insertions(+), 30 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 896ac2b..7e51eda 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 << 26; // 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]; @@ -21,7 +21,7 @@ int *c = new int[SIZE]; int main(int argc, char* argv[]) { // Scan tests - + printf("\n"); printf("****************\n"); printf("** SCAN TESTS **\n"); @@ -34,67 +34,69 @@ int main(int argc, char* argv[]) { // 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); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(SIZE, b, true); - + /* zeroArray(SIZE, c); 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); - printCmpResult(NPOT, b, c); - + 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 + /* For bug-finding only: Array of 1s to help find bugs in stream compaction or scan*/ + /* onesArray(SIZE, c); printDesc("1s array for finding bugs"); StreamCompaction::Naive::scan(SIZE, c, a); - printArray(SIZE, c, true); */ + printArray(SIZE, c, true); zeroArray(SIZE, c); printDesc("naive scan, non-power-of-two"); StreamCompaction::Naive::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); - printCmpResult(NPOT, b, c); - + printArray(SIZE, c, true); + printCmpResult(NPOT, b, c);*/ + zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); StreamCompaction::Efficient::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); + printArray(SIZE, c, true); printCmpResult(SIZE, b, c); - + /** zeroArray(SIZE, c); printDesc("work-efficient scan, non-power-of-two"); StreamCompaction::Efficient::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(NPOT, c, true); - printCmpResult(NPOT, b, c); + printArray(NPOT, c, true); + printCmpResult(NPOT, b, c);*/ zeroArray(SIZE, c); printDesc("thrust scan, power-of-two"); StreamCompaction::Thrust::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); + printArray(SIZE, c, true); printCmpResult(SIZE, b, c); - + /* zeroArray(SIZE, c); printDesc("thrust scan, non-power-of-two"); StreamCompaction::Thrust::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(NPOT, c, true); - printCmpResult(NPOT, b, c); - + printArray(NPOT, c, true); + printCmpResult(NPOT, b, c);*/ + /* printf("\n"); printf("*****************************\n"); printf("** STREAM COMPACTION TESTS **\n"); @@ -132,7 +134,7 @@ int main(int argc, char* argv[]) { printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(count, c, true); printCmpLenResult(count, expectedCount, b, c); - + zeroArray(SIZE, c); printDesc("work-efficient compact, power-of-two"); count = StreamCompaction::Efficient::compact(SIZE, c, a); @@ -145,7 +147,7 @@ int main(int argc, char* argv[]) { count = StreamCompaction::Efficient::compact(NPOT, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(count, c, true); - printCmpLenResult(count, expectedNPOT, b, c); + printCmpLenResult(count, expectedNPOT, b, c);*/ system("pause"); // stop Win32 console from closing on exit delete[] a; diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 2ed6d63..1fcc8ff 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -24,6 +24,26 @@ namespace StreamCompaction { */ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { // TODO + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= n) + { + return; + } + /**don't check the last element, the last one is always true + no matter it is 0 or not*/ + if (index == n - 1) + { + bools[index] = 1; + return; + } + if (idata[index + 1] != idata[index]) + { + bools[index] = 1; + } + else + { + bools[index] = 0; + } } /** @@ -33,6 +53,15 @@ namespace StreamCompaction { __global__ void kernScatter(int n, int *odata, const int *idata, const int *bools, const int *indices) { // TODO + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= n) + { + return; + } + if (bools[index] == 1) + { + odata[indices[index]] = idata[index]; + } } } diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 719fa11..2fd2f46 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -12,14 +12,31 @@ namespace StreamCompaction { return timer; } + void map(int n, int* odata) + { + for (int i = 0; i < n; i++) + { + if (odata[i] != 0) + { + odata[i] = 1; + } + } + } + /** * CPU scan (prefix sum). * For performance analysis, this is supposed to be a simple for loop. * (Optional) For better understanding before starting moving to GPU, you can simulate your GPU scan in this function first. */ void scan(int n, int *odata, const int *idata) { - timer().startCpuTimer(); // TODO + std::copy(idata, idata + n - 1, &(odata[1])); + timer().startCpuTimer(); + odata[0] = 0; + for (int i = 1; i < n; i++) + { + odata[i] = odata[i] + odata[i - 1]; + } timer().endCpuTimer(); } @@ -29,10 +46,20 @@ namespace StreamCompaction { * @returns the number of elements remaining after compaction. */ int compactWithoutScan(int n, int *odata, const int *idata) { + // TODO timer().startCpuTimer(); // TODO + int j = 0; + for (int i = 0; i < n; i++) + { + if (idata[i] != 0) + { + odata[j] = idata[i]; + ++j; + } + } timer().endCpuTimer(); - return -1; + return j; } /** @@ -43,8 +70,28 @@ namespace StreamCompaction { int compactWithScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + std::copy(idata, idata + n - 1, &(odata[1])); + odata[0] = 0; + map(n, odata); + for (int i = 1; i < n; i++) + { + odata[i] = odata[i] + odata[i - 1]; + } + int lastNumber = odata[n - 1]; + int* temp = (int*)malloc(n * sizeof(int)); + memcpy(temp, odata, n * sizeof(int)); + if (idata[n - 1] != 0) + { + ++lastNumber; + } + + for (int i = 0; i < n; i++) + { + odata[temp[i]] = idata[i]; + } + free(temp); timer().endCpuTimer(); - return -1; + return lastNumber; } } } diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 2db346e..af18fec 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -2,6 +2,8 @@ #include #include "common.h" #include "efficient.h" +/*! Block size used for CUDA kernel launch. */ +#define blockSize 128 namespace StreamCompaction { namespace Efficient { @@ -12,13 +14,161 @@ namespace StreamCompaction { return timer; } + //number of data with padding included + int length; + //container to store the data + int* dev_idata; + int* dev_odata; + int* dev_indices; + int* dev_bools; + int* dev_nonZero; + dim3 threadsPerBlock(blockSize); + + void initScan(int N, int* odata, const int* idata) + { + //give padding the arrays with size not the power of 2 + length = int(pow(2, ilog2ceil(N))); + cudaMalloc((void**)&dev_idata, length * sizeof(int)); + cudaMemcpy(dev_idata, idata, N * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("cudaMalloc dev_idata failed!", __LINE__); + cudaMalloc((void**)&dev_odata, length * sizeof(int)); + cudaMemcpy(dev_odata, idata, N * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("cudaMalloc dev_odata failed!", __LINE__); + //to record non-zero numbers + cudaMalloc((void**)&dev_nonZero, 1 * sizeof(int)); + checkCUDAError("cudaMalloc dev_nonZero failed!", __LINE__); + cudaDeviceSynchronize(); + } + + void initCompact(int N, const int* idata, int* odata) + { + //give padding the arrays with size not the power of 2 + length = int(pow(2, ilog2ceil(N))); + cudaMalloc((void**)&dev_idata, length * sizeof(int)); + cudaMemcpy(dev_idata, idata, N * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("cudaMalloc dev_idata failed!", __LINE__); + cudaMalloc((void**)&dev_odata, length * sizeof(int)); + checkCUDAError("cudaMalloc dev_odata failed!", __LINE__); + cudaMalloc((void**)&dev_indices, length * sizeof(int)); + cudaMemcpy(dev_indices, odata, N * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("cudaMalloc dev_indices failed!", __LINE__); + cudaMalloc((void**)&dev_bools, length * sizeof(int)); + checkCUDAError("cudaMalloc dev_bool failed!", __LINE__); + } + + void endScan() + { + cudaFree(dev_idata); + cudaFree(dev_odata); + } + + void endCompact() + { + cudaFree(dev_bools); + cudaFree(dev_indices); + cudaFree(dev_idata); + cudaFree(dev_odata); + cudaFree(dev_nonZero); + } + + __global__ void EfficientMapKernel(int n, int realLen, int* idata) + { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= n) + { + return; + } + + if (index < realLen && idata[index] != 0) + { + idata[index] = 1; + } + else + { + idata[index] = 0; + } + __syncthreads(); + } + + __global__ void InitDownSweepKernel(int n, int* idata, int* odata) + { + idata[n - 1] = 0; + odata[n - 1] = 0; + } + + __global__ void UpSweepScanKernel(int n, int interval, int* idata, int* odata) + { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= n) + { + return; + } + //index that needs to be changed + int validBase = interval * 2; + int trueIndex = validBase * (index + 1) - 1; + idata[trueIndex] = odata[trueIndex - interval] + odata[trueIndex]; + odata[trueIndex] = idata[trueIndex]; + } + + __global__ void DownSweepScanKernel(int n, int interval, int* idata, int* odata) + { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= n) + { + return; + } + //index that needs to be changed + int validBase = interval * 2; + int trueIndex = validBase * (index + 1) - 1; + idata[trueIndex] = odata[trueIndex - interval] + odata[trueIndex]; + idata[trueIndex - interval] = odata[trueIndex]; + } + + __global__ void CountKernel(int n, int* indices, int* idata, int* count) + { + int lastIndice = n - 1; + if (idata[lastIndice] == 0) + { + count[0] = indices[lastIndice]; + } + else + { + count[0] = indices[lastIndice] + 1; + } + } + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { - timer().startGpuTimer(); // TODO + initScan(n, odata, idata); + dim3 fullBlocksPerGrid((length + blockSize - 1) / blockSize); + timer().startGpuTimer(); + for (int i = 1; i < length; i = i * 2) + { + int totalSize = length / (2 * i); + dim3 BlocksPerGrid((totalSize + blockSize - 1) / blockSize); + UpSweepScanKernel << > > (totalSize, i, dev_idata, dev_odata); + cudaDeviceSynchronize(); + + std::swap(dev_idata, dev_odata); + } + std::swap(dev_idata, dev_odata); + InitDownSweepKernel << <1, 1 >> > (length, dev_idata, dev_odata); + + for (int i = length / 2; i > 0; i = i / 2) + { + int totalSize = length / (2 * i); + dim3 BlocksPerGrid((totalSize + blockSize - 1) / blockSize); + DownSweepScanKernel << > > (totalSize , i, dev_idata, dev_odata); + cudaDeviceSynchronize(); + std::swap(dev_idata, dev_odata); + } timer().endGpuTimer(); + cudaMemcpy(odata, dev_odata, sizeof(int) * n, cudaMemcpyDeviceToHost); + + endScan(); } /** @@ -31,10 +181,48 @@ namespace StreamCompaction { * @returns The number of elements remaining after compaction. */ int compact(int n, int *odata, const int *idata) { + timer().startGpuTimer(); - // TODO + + initScan(n, odata, idata); + dim3 fullBlocksPerGrid((length + blockSize - 1) / blockSize); + EfficientMapKernel << > > (length, n, dev_odata); + for (int i = 1; i < length; i = i * 2) + { + int totalSize = length / (2 * i); + dim3 BlocksPerGrid((totalSize + blockSize - 1) / blockSize); + UpSweepScanKernel << > > (totalSize, i, dev_idata, dev_odata); + cudaDeviceSynchronize(); + + std::swap(dev_idata, dev_odata); + } + std::swap(dev_idata, dev_odata); + InitDownSweepKernel << <1, 1 >> > (length, dev_idata, dev_odata); + + for (int i = length / 2; i > 0; i = i / 2) + { + int totalSize = length / (2 * i); + dim3 BlocksPerGrid((totalSize + blockSize - 1) / blockSize); + DownSweepScanKernel << > > (totalSize, i, dev_idata, dev_odata); + cudaDeviceSynchronize(); + std::swap(dev_idata, dev_odata); + } + cudaMemcpy(odata, dev_odata, sizeof(int) * n, cudaMemcpyDeviceToHost); + + endScan(); + + initCompact(n, idata, odata); + StreamCompaction::Common::kernMapToBoolean << > > (length, dev_bools, dev_indices); + StreamCompaction::Common::kernScatter << > > (length, dev_odata, dev_idata, dev_bools, dev_indices); + cudaMemcpy(odata, dev_odata, sizeof(int) * n, cudaMemcpyDeviceToHost); + int* p = (int*)malloc(1 * sizeof(int)); + CountKernel << <1, 1 >> > (n, dev_indices, dev_idata, dev_nonZero); + cudaMemcpy(p, dev_nonZero, sizeof(int) * 1, cudaMemcpyDeviceToHost); + int ans = p[0]; + free(p); + endCompact(); timer().endGpuTimer(); - return -1; + return ans; } } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 4308876..389646e 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -2,24 +2,107 @@ #include #include "common.h" #include "naive.h" +/*! Block size used for CUDA kernel launch. */ +#define blockSize 128 namespace StreamCompaction { + namespace Naive { using StreamCompaction::Common::PerformanceTimer; + + int* dev_idata; + int* dev_odata; + PerformanceTimer& timer() { static PerformanceTimer timer; return timer; } + + void initScan(int N, int* odata, const int* idata) + { + int shift = 0; + cudaMalloc((void**)&dev_idata, N * sizeof(int)); + cudaMemcpy(dev_idata, &(shift), sizeof(int), cudaMemcpyHostToDevice); + cudaMemcpy(&dev_idata[1], idata, sizeof(int) * (N - 1), cudaMemcpyHostToDevice); + checkCUDAError("cudaMalloc dev_idata failed!", __LINE__); + cudaMalloc((void**)&dev_odata, N * sizeof(int)); + cudaMemcpy(dev_odata, &(shift), sizeof(int), cudaMemcpyHostToDevice); + cudaMemcpy(&dev_odata[1], idata, sizeof(int) * (N - 1), cudaMemcpyHostToDevice); + checkCUDAError("cudaMalloc dev_odata failed!", __LINE__); + cudaDeviceSynchronize(); + } + + void endScan() + { + cudaFree(dev_idata); + cudaFree(dev_odata); + } + + __global__ void NaiveMapKernel(int n, int* idata, int* odata) + { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= n) + { + return; + } + if (odata[index] != 0) + { + idata[index] = 1; + } + else + { + idata[index] = 0; + } + } + + __global__ void NaiveScanKernel(int n, int interval, int* odata, int* idata) + { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= n) + { + return; + } + + if (index >= interval) + { + odata[index] = idata[index] + idata[index - interval]; + } + else + { + odata[index] = idata[index]; + } + } + // TODO: __global__ /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ + void scan(int n, int *odata, const int *idata) { - timer().startGpuTimer(); + // TODO + initScan(n, odata, idata); + cudaDeviceSynchronize(); + timer().startGpuTimer(); + dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); + int blocks = 1; + int round = ilog2ceil(n); + + cudaDeviceSynchronize(); + for (int i = 0; i < round; i++) + { + int interval = int(powf(2, i)); + NaiveScanKernel << > > (n, interval, dev_odata, dev_idata); + cudaDeviceSynchronize(); + std::swap(dev_idata, dev_odata); + } + std::swap(dev_idata, dev_odata); timer().endGpuTimer(); + cudaMemcpy(odata, dev_odata, sizeof(int) * n, cudaMemcpyDeviceToHost); + endScan(); } } + } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 1def45e..3f3bffc 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -9,6 +9,10 @@ namespace StreamCompaction { namespace Thrust { using StreamCompaction::Common::PerformanceTimer; + + int* dev_in; + int* dev_out; + PerformanceTimer& timer() { static PerformanceTimer timer; @@ -18,11 +22,17 @@ namespace StreamCompaction { * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { - timer().startGpuTimer(); + // 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_vector dev_in(idata, idata + n); + thrust::device_vector dev_out(odata, odata + n); + timer().startGpuTimer(); + thrust::exclusive_scan(dev_in.begin(), dev_in.end(), dev_out.begin()); timer().endGpuTimer(); + thrust::copy(dev_out.begin(), dev_out.end(), odata); } } } From f049bb0a32a03f879ea55bdc212d3a88d0830b9d Mon Sep 17 00:00:00 2001 From: HantingXu Date: Fri, 15 Sep 2023 09:25:52 -0400 Subject: [PATCH 2/7] main.cpp modified --- src/main.cpp | 103 +++++++++++++-------------------------------------- 1 file changed, 26 insertions(+), 77 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 7e51eda..d039882 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,15 +13,17 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 26; // feel free to change the size of array +const int SIZE = 1 << 28; // 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* a = new int[SIZE]; +int* b = new int[SIZE]; +int* c = new int[SIZE]; +int* d = new int[SIZE]; + int main(int argc, char* argv[]) { // Scan tests - + printf("\n"); printf("****************\n"); printf("** SCAN TESTS **\n"); @@ -34,123 +36,70 @@ int main(int argc, char* argv[]) { // 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); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(SIZE, b, true); - /* + zeroArray(SIZE, c); 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); - printCmpResult(NPOT, b, c);*/ - + 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*/ - /* + /* For bug-finding only: Array of 1s to help find bugs in stream compaction or scan onesArray(SIZE, c); printDesc("1s array for finding bugs"); StreamCompaction::Naive::scan(SIZE, c, a); - printArray(SIZE, c, true); + printArray(SIZE, c, true); */ zeroArray(SIZE, c); printDesc("naive scan, non-power-of-two"); StreamCompaction::Naive::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - printArray(SIZE, c, true); - printCmpResult(NPOT, b, c);*/ - + //printArray(SIZE, c, true); + printCmpResult(NPOT, b, c); + zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); StreamCompaction::Efficient::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - printArray(SIZE, c, true); + //printArray(SIZE, c, true); printCmpResult(SIZE, b, c); - /** + zeroArray(SIZE, c); printDesc("work-efficient scan, non-power-of-two"); StreamCompaction::Efficient::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - printArray(NPOT, c, true); - printCmpResult(NPOT, b, c);*/ + //printArray(NPOT, c, true); + printCmpResult(NPOT, b, c); zeroArray(SIZE, c); printDesc("thrust scan, power-of-two"); StreamCompaction::Thrust::scan(SIZE, c, a); printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - printArray(SIZE, c, true); + //printArray(SIZE, c, true); printCmpResult(SIZE, b, c); - /* + zeroArray(SIZE, c); printDesc("thrust scan, non-power-of-two"); StreamCompaction::Thrust::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - printArray(NPOT, c, true); - printCmpResult(NPOT, b, c);*/ - /* - printf("\n"); - printf("*****************************\n"); - printf("** STREAM COMPACTION TESTS **\n"); - printf("*****************************\n"); - - // Compaction tests - - genArray(SIZE - 1, a, 4); // Leave a 0 at the end to test that edge case - a[SIZE - 1] = 0; - printArray(SIZE, a, true); - - int count, expectedCount, expectedNPOT; - - // initialize b using StreamCompaction::CPU::compactWithoutScan you implement - // We use b for further comparison. Make sure your StreamCompaction::CPU::compactWithoutScan is correct. - zeroArray(SIZE, b); - printDesc("cpu compact without scan, power-of-two"); - count = StreamCompaction::CPU::compactWithoutScan(SIZE, b, a); - printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - expectedCount = count; - printArray(count, b, true); - printCmpLenResult(count, expectedCount, b, b); - - zeroArray(SIZE, c); - printDesc("cpu compact without scan, non-power-of-two"); - count = StreamCompaction::CPU::compactWithoutScan(NPOT, c, a); - printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - expectedNPOT = count; - printArray(count, c, true); - printCmpLenResult(count, expectedNPOT, b, c); - - zeroArray(SIZE, c); - printDesc("cpu compact with scan"); - count = StreamCompaction::CPU::compactWithScan(SIZE, c, a); - printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - printArray(count, c, true); - printCmpLenResult(count, expectedCount, b, c); - - zeroArray(SIZE, c); - 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); - printCmpLenResult(count, expectedCount, b, c); - - zeroArray(SIZE, c); - printDesc("work-efficient compact, non-power-of-two"); - count = StreamCompaction::Efficient::compact(NPOT, c, a); - printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(count, c, true); - printCmpLenResult(count, expectedNPOT, b, c);*/ + //printArray(NPOT, c, true); + printCmpResult(NPOT, b, c); system("pause"); // stop Win32 console from closing on exit delete[] a; delete[] b; delete[] c; -} + delete[] d; +} \ No newline at end of file From 41fb210c5a2695ae8103ca4d281218837911d626 Mon Sep 17 00:00:00 2001 From: HantingXu Date: Fri, 15 Sep 2023 13:33:25 -0400 Subject: [PATCH 3/7] Radix sort updated --- stream_compaction/efficient.cu | 154 ++++++++++++++++++++++++++++++++- stream_compaction/efficient.h | 2 + 2 files changed, 155 insertions(+), 1 deletion(-) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index af18fec..bc3183f 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -4,6 +4,7 @@ #include "efficient.h" /*! Block size used for CUDA kernel launch. */ #define blockSize 128 +#define passNumber 6 namespace StreamCompaction { namespace Efficient { @@ -22,8 +23,40 @@ namespace StreamCompaction { int* dev_indices; int* dev_bools; int* dev_nonZero; + + //for radix sort (0 - 5) + int* dev_input; + int* dev_pass; + dim3 threadsPerBlock(blockSize); + void initRadixSort(int N, int* odata, const int* idata) + { + //give padding the arrays with size not the power of 2 + length = int(pow(2, ilog2ceil(N))); + + cudaMalloc((void**)&dev_input, length * sizeof(int)); + cudaMemcpy(dev_input, idata, N * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("cudaMalloc dev_input failed!", __LINE__); + + cudaMalloc((void**)&dev_idata, length * sizeof(int)); + cudaMemcpy(dev_idata, idata, N * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("cudaMalloc dev_idata failed!", __LINE__); + + cudaMalloc((void**)&dev_odata, length * sizeof(int)); + cudaMemcpy(dev_odata, idata, N * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("cudaMalloc dev_odata failed!", __LINE__); + + cudaMalloc((void**)&dev_pass, length * sizeof(int)); + checkCUDAError("cudaMalloc dev_pass failed!", __LINE__); + + //to record non-zero numbers + cudaMalloc((void**)&dev_nonZero, 1 * sizeof(int)); + checkCUDAError("cudaMalloc dev_nonZero failed!", __LINE__); + + cudaDeviceSynchronize(); + } + void initScan(int N, int* odata, const int* idata) { //give padding the arrays with size not the power of 2 @@ -70,6 +103,62 @@ namespace StreamCompaction { cudaFree(dev_odata); cudaFree(dev_nonZero); } + + void endRadixSort() + { + cudaFree(dev_idata); + cudaFree(dev_odata); + cudaFree(dev_pass); + cudaFree(dev_input); + cudaFree(dev_nonZero); + } + + //n is number of elements in one pass + //pass is 0, 1, 2, 3, 4, 5 + __global__ void RadixSortMapKernel(int n, int realLen, int pass, int* idata, int* odata) + { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= n) + { + return; + } + //map 0 to 1 + odata[index] = 1 - ((idata[index] >> pass) & 1); + //if there are extra space mark them as 1 + if (index >= realLen) + { + odata[index] = 0; + } + } + + //here n is the number of the array without padding + __global__ void RadixTrueScanKernel(int n, int zeros, int* idata, int* pass, int* odata) + { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= n) + { + return; + } + if (pass[index] == 0) + { + odata[index] = index - idata[index] + zeros; + } + else + { + odata[index] = idata[index]; + } + } + + + __global__ void RadixScatterKernel(int n, int* indices, int* odata, int* input) + { + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (index >= n) + { + return; + } + odata[indices[index]] = input[index]; + } __global__ void EfficientMapKernel(int n, int realLen, int* idata) { @@ -87,7 +176,7 @@ namespace StreamCompaction { { idata[index] = 0; } - __syncthreads(); + //__syncthreads(); } __global__ void InitDownSweepKernel(int n, int* idata, int* odata) @@ -171,6 +260,69 @@ namespace StreamCompaction { endScan(); } + void printArray(int n, int* a, bool abridged = false) { + printf(" [ "); + for (int i = 0; i < n; i++) { + if (abridged && i + 2 == 15 && n > 16) { + i = n - 2; + printf("... "); + } + printf("%3d ", a[i]); + } + printf("]\n"); + } + + void radixSort(int n, int* odata, const int* idata) + { + initRadixSort(n, odata, idata); + dim3 fullBlocksPerGrid((length + blockSize - 1) / blockSize); + for (int i = 0; i < passNumber; i++) + { + + RadixSortMapKernel << > > (length, n, i, dev_input, dev_odata); + cudaMemcpy(dev_pass, dev_odata, sizeof(int) * length, cudaMemcpyDeviceToDevice); + /* + * Scan for one pass begins + */ + for (int i = 1; i < length; i = i * 2) + { + int totalSize = length / (2 * i); + dim3 BlocksPerGrid((totalSize + blockSize - 1) / blockSize); + UpSweepScanKernel << > > (totalSize, i, dev_idata, dev_odata); + cudaDeviceSynchronize(); + + std::swap(dev_idata, dev_odata); + } + std::swap(dev_idata, dev_odata); + InitDownSweepKernel << <1, 1 >> > (length, dev_idata, dev_odata); + + for (int i = length / 2; i > 0; i = i / 2) + { + int totalSize = length / (2 * i); + dim3 BlocksPerGrid((totalSize + blockSize - 1) / blockSize); + DownSweepScanKernel << > > (totalSize, i, dev_idata, dev_odata); + cudaDeviceSynchronize(); + std::swap(dev_idata, dev_odata); + } + /* + * scan for one pass ends + */ + //get the total number of zero + int* p = (int*)malloc(1 * sizeof(int)); + CountKernel << <1, 1 >> > (n, dev_odata, dev_pass, dev_nonZero); + cudaMemcpy(p, dev_nonZero, sizeof(int) * 1, cudaMemcpyDeviceToHost); + int zeros = p[0]; + + dim3 fullBlocksPerGrid1((n + blockSize - 1) / blockSize); + RadixTrueScanKernel << > > (n, zeros, dev_odata, dev_pass, dev_idata); + RadixScatterKernel<< > >(n, dev_idata, dev_odata, dev_input); + std::swap(dev_odata, dev_input); + } + //dev_input as the final result + cudaMemcpy(odata, dev_input, sizeof(int) * n, cudaMemcpyDeviceToHost); + endRadixSort(); + } + /** * Performs stream compaction on idata, storing the result into odata. * All zeroes are discarded. diff --git a/stream_compaction/efficient.h b/stream_compaction/efficient.h index 803cb4f..b5948e5 100644 --- a/stream_compaction/efficient.h +++ b/stream_compaction/efficient.h @@ -8,6 +8,8 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata); + void radixSort(int n, int* odata, const int* idata); + int compact(int n, int *odata, const int *idata); } } From 5e9f3336fa3b915f5be7b50ff8ab9b30df2fde8f Mon Sep 17 00:00:00 2001 From: HantingXu Date: Fri, 15 Sep 2023 14:35:23 -0400 Subject: [PATCH 4/7] update cpu radix sort --- src/main.cpp | 26 +++++++++++++++++++++--- stream_compaction/cpu.cu | 36 ++++++++++++++++++++++++++++++++++ stream_compaction/cpu.h | 2 ++ stream_compaction/efficient.cu | 13 ++---------- 4 files changed, 63 insertions(+), 14 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index d039882..e0b273c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 28; // 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]; @@ -22,7 +22,7 @@ int* d = new int[SIZE]; int main(int argc, char* argv[]) { - // Scan tests + // Radix Sort tests printf("\n"); printf("****************\n"); @@ -33,6 +33,26 @@ int main(int argc, char* argv[]) { a[SIZE - 1] = 0; printArray(SIZE, a, true); + zeroArray(SIZE, b); + printDesc("cpu radix sort, power-of-two"); + StreamCompaction::CPU::radixSort(SIZE, b, a); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + printArray(SIZE, b, true); + + zeroArray(SIZE, c); + printDesc("work-efficient radix sort, power-of-two"); + StreamCompaction::Efficient::radixSort(SIZE, c, a); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + printArray(SIZE, c, true); + + // Scan tests + + printf("\n"); + printf("****************\n"); + printf("** SCAN TESTS **\n"); + printf("****************\n"); + + // 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. @@ -61,7 +81,7 @@ int main(int argc, char* argv[]) { 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); diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 2fd2f46..7c766fb 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -2,6 +2,7 @@ #include "cpu.h" #include "common.h" +#define passNumber 6 namespace StreamCompaction { namespace CPU { @@ -40,6 +41,41 @@ namespace StreamCompaction { timer().endCpuTimer(); } + void radixSort(int n, int* odata, int* idata) + { + int* temp = (int*)malloc(n * sizeof(int)); + int* input = (int*)malloc(n * sizeof(int)); + memcpy(input, idata, n * sizeof(int)); + timer().startCpuTimer(); + for (int i = 0; i < passNumber; i++) + { + int zero = 0; + for (int j = 0; j < n; j++) + { + //if is 0 + if (1 - ((input[j] >> i) & 1)) + { + temp[zero] = input[j]; + ++zero; + } + } + for (int j = 0; j < n; j++) + { + //if is 1 + if ((input[j] >> i) & 1) + { + temp[zero] = input[j]; + ++zero; + } + } + std::swap(temp, input); + } + timer().endCpuTimer(); + std::copy(input, input + n, odata); + free(temp); + free(input); + } + /** * CPU stream compaction without using the scan function. * diff --git a/stream_compaction/cpu.h b/stream_compaction/cpu.h index 873c047..cbcc8b7 100644 --- a/stream_compaction/cpu.h +++ b/stream_compaction/cpu.h @@ -11,5 +11,7 @@ namespace StreamCompaction { int compactWithoutScan(int n, int *odata, const int *idata); int compactWithScan(int n, int *odata, const int *idata); + + void radixSort(int n, int* odata, int* idata); } } diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index bc3183f..455ac3c 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -260,22 +260,12 @@ namespace StreamCompaction { endScan(); } - void printArray(int n, int* a, bool abridged = false) { - printf(" [ "); - for (int i = 0; i < n; i++) { - if (abridged && i + 2 == 15 && n > 16) { - i = n - 2; - printf("... "); - } - printf("%3d ", a[i]); - } - printf("]\n"); - } void radixSort(int n, int* odata, const int* idata) { initRadixSort(n, odata, idata); dim3 fullBlocksPerGrid((length + blockSize - 1) / blockSize); + timer().startGpuTimer(); for (int i = 0; i < passNumber; i++) { @@ -318,6 +308,7 @@ namespace StreamCompaction { RadixScatterKernel<< > >(n, dev_idata, dev_odata, dev_input); std::swap(dev_odata, dev_input); } + timer().endGpuTimer(); //dev_input as the final result cudaMemcpy(odata, dev_input, sizeof(int) * n, cudaMemcpyDeviceToHost); endRadixSort(); From 9d561542ff20452d666136ab0941e0e2bbdf1209 Mon Sep 17 00:00:00 2001 From: HantingXu Date: Fri, 15 Sep 2023 16:39:42 -0400 Subject: [PATCH 5/7] update README.md --- README.md | 41 +++++++++++++++++++++++++++++++++++------ img/example.png | Bin 0 -> 29803 bytes img/radix_result.svg | 1 + img/radix_sort.png | Bin 0 -> 118801 bytes img/scan_result.svg | 1 + 5 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 img/example.png create mode 100644 img/radix_result.svg create mode 100644 img/radix_sort.png create mode 100644 img/scan_result.svg diff --git a/README.md b/README.md index 0e38ddb..65ea377 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,41 @@ 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) +* Hanting Xu +* [GitHub](https://github.com/HantingXu), [LinkedIn](www.linkedin.com/in/hanting-xu-25615b28b). +* Tested on: (Personal Computer) Windows 11, i7-12700H @ 2.70GHz 32GB, GeForce RTX 3070 Ti Laptop GPU -### (TODO: Your README) +### Basic Introduction -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 implements the stream compaction and radix sort on GPU with CUDA. +#### Stream Compaction + +Stream Compaction here mainly refers to a process that taking an array of numbers as input and eliminate the zeros in that very array and then output result. A work-efficient implementation of this algorithm in GPU can be roughly devided into 3 parts: map, scan and scatter. +* map: map the elements of the original array onto 1 and 0. +* scan: generate the index that each elements should be at after the compaction by computing their exclusive prefix sum. +* scatter: scatter the elements in the original array to their corresponding place according to the index array generated in the scan function. + +* Figure - Map, Scan, Scatter for Stream Compaction +![](img/example.png) + +The main focus of this project is on the scan function. There are 3 different scan functions implemented: CPU Scan, Naive GPU Scan and Efficient GPU Scan, and their performance are compared together with CUDA thrust scan method. For more detail on how to implement scan, this is a good reference link - [Parallel Prefix Sum (Scan) with CUDA](https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch39.html). + +#### Radix sort + +Radix sort is a type of sorting algorithm that sort an array according to each digit of an element in the array. The time complexity of this algorithm on CPU is normally O(n). This project implement both the CPU version of radix sort and its GPU version. The basic process for this algorithm in GPU version can also be concluded as Map, Scan and Scatter, but in a slightly different way. +* Figure - Map, Scan, Scatter for Radix Sort +![](img/radix_sort.png) +This project compares the efficiency of the CPU and GPU version of Radix Sort. The scan function used in based on the work-efficient GPU scan implemented above. + +### Analysis + +#### Scan +In the end, we record the execution time of different scan functions implemented. Through my observation, CPU runs the fastest when there are only 2^2 to 2^18 elements in an array. And as we can observe from the graph below, CPU becomes slower than all GPU algorithms when there are 2^20 or more elements in an array. That is basically because the time comlexity of CPU scan is intrinsicly larger than the GPU ones. Thus as the input size grows, it becomes inevitably slower. One interesting discovery here is that when the Naive GPU method deals with array with 2^30 elements, it hits the bottleneck and its speed drop sharply. This is probably have something to do with the shortage of memory. + +Note: all the block size for the GPU algorithms used in this project is 128. +![](img/scan_result.svg) + +#### Radix sort +The graph shown below decribes the exetion time of radix sort on CPU and GPU as the input size changes. Both radix sort on CPU and GPU slows down as the number of inputs increases. However, as the input size increases, the performance of CPU implementation drops faster than GPU one. That is most likely because of the time compexity of the algorithm itself. +![](img/radix_result.svg) diff --git a/img/example.png b/img/example.png new file mode 100644 index 0000000000000000000000000000000000000000..02d06313e6dcbd28f51ecf4429551d8d772d35e2 GIT binary patch literal 29803 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

d+?f;ts;jG-8?JvI5pLg{C)F#Iu0;f#!Ahspa zGFOuak??-rgMkus!ah~-Z%h{-RGc$omrFID=L9ipEgyl3p2%Pp+KoMS@N!j{--M0ov5LTtw}NGz z-cLzc=D2S}OLWD8wDcjSo%^J`*-~s`S-`2#6zlPx$<>lyJWu>Fge%J;Ks&N#<3(g2 z4piA|2*ZK1Wi?bA2eC`+h$PzR;Srqk+ZKjYj#>_=)wS|%bn&+|mdDWatbm97=o_u_2j`A76r>+aVSdVMk7c_L zdUV3)ZmO;gf>@H4U-%(fauWO&F3=+1Eh=VO+(K1T60@>$jnH63-w!r^YYmD*O8njrl7mp4xWwC2xnixlj5 zpMW^I1Mi7R1$~P{T*vW{8Zn|v^HpRZ?(mVu@cz-~OfICRyBbvlK;!4@r#5w_LRODr zhO%Pyyml?{+2NeOXb1aR>yWqEc3L)MkW7QxovJEnTw|FOzD2!zRJX9efVgQU-%R(v&CHM$d(3T8JTz~Pyy}}LoK!r(jlKxfhy@lV zg1}!`1i6V~C1u+=qr(BY=^9;oBU-snABczsA%Db1{5;*;eqG8DSqW1YDUiA)=hnxb zCZ>9Qv9OkN+p9~}DRvVg8h*g^ycU^=!a5#_4Z5 zs==}2Pt38yGZ^RGlxwi8Y=G{}HX|Gxtcio~-u0yDe}!ef<{V*aMqc3x6|-;nAnTsI zL@0Robr;E~&sa}Sukr#@OPc$)9){*c*JTCa*{wvA2H_k&(SZ_n|T@tb^a!k(GAUObKmQR`&z|4LSt zd1<`9Z;m+GuLh0lLq|sCDEkgWK(7rfA2zSz2XEJuE z%IsqUQ{Nb&aO9<;3z{dy+8%0-0KV>XtFsD^Hm8Bu&qZp2#RXTyk|2XVYA2y%`es^j z?3lMQS={Roh|r6ry~K@4t8(@OHfQ zsFdv_*4Y(Oe6+Lg(Xt}GA%NvhbscCD#OQt+qk|r#BC^ILPJAbR)C^Y&Zr{DLU`_1% zE3z^VVddYGl^=`-X#O_qLqq3ty&Y6pcL;7!EPH7^Uh$)yaLql#j4Op=1g0MiGOqhn!5iIL5FffgYp9fiWa*u&s6`ie)K?U| z_jbuonUtgrZsDlm0KcMswD1`qMu~tb%)6^8bkoKVxa%xjh^Z)ye|$eDztOjV)p*U~ zvDVNGRm2bQlodew1DnNm0#~f@5b)goVeHg&+5mrplOczL4t5=kFOpnSn6Z+@psimQrjMQfoxq<3<`w zV$Y-n=owk7C3yJPzxSQXea3yJF9z^(CXXEUaTz-qnNgx0Zkjh1+|ZA~u~09#d|AXe zIICQ;I?*HXM@GP2fFroLb!-)gvSj685st+YYHE;19$3z^sgy&&0{Uf$VUXmTf$9 z4OW|UAe+Yekw)Un7zSTE!g1zRv9<9j=~!=z>2f|X9Q-g2Qnsp42+9zI#IcJ=6HrQr zp>8;R`ptSuqf5yNnN7_`8JptZ$JpR{0D3qBSCezYUI3t^-4&h0ayu@*@>c0*a8po* zUub_%XDM4&=8@`5^^N)P&QxC8;W1?7RIL2DYL;dT@BZFSb6zw;09Mg9%}P6>O~6F~ z6n2iY?XyB?vB*Gpyk>>OJ{~a)nm%T$a8)JI)ucIxRlO;zDYaj&r=VL7&i`yeJ@OAFjdumdSP%&-~BGp>L z_3w8|JwkgH!|cqLT9y@tPHFAlb2#v>QVv03NNU5%5U4w|7gUnPAQ^2|x!jt%*IXVcCvMTU2Am+u5;BBhg$**$2u9DONZt`MqMeC>crln)&ddlQoU}Li6*`Ohgk%bRg_LW z`e~6Zsh2b>4=oa_H7nR2Mj6`tif4ZA>~&t)MzJfGXPG^Pvk;}SHpyq;hK*kiQ>|~V z=6KQD_*cApZ1zwRE4@ELhA^PzX_-pNpjfqwNHU`oS5&+6wE09&X--d?lUE$QWlJmkg|%0D}o> z@~;UaCAqDLV|T9ViSEgxpTi$dg~~TM1CN;~P#Q9Ilp)(Gly^a;-(*7v8WOVS(1UV_ zr~Su5*6aQn<1BCScZ_qNdexS)PT@?3V#bRE)?)0%Yj6uLvK(EvLR^9iTn8bj_uX7i ztj~G+ys_6Px-k1A{`a+=lQS}mkT=Z8Oy203G_XSZ)%KeLSQY{sQus>y(qrKP(HSIv zO7ff>aXxQ-%wHyYg}F@;T$J@v_!xeEexNvwYWhz^XCNtA%XCvG6|K1bWk%|DQSqf* z1IvWROhQ_1g~GtYyMU`gBjV%J_8fV8|~d+A(QC$fD#cUDcg&>x`OoPPkZPr;Sver!5>6E!bxs`zno>fiZiaf4csCxq5lwdd_#5{a~ zM~M7>vZFOrZxW)`3Ot8m(c;cWjfi*pt{c2FH{`V=ask}hbM%|~+rJZ?9gdc7ZlCEL zeOb$Qhiw$R*lb+!YV3oAj52%Wt{jeR?7lxJt8d_>(>iGTk{vj7fO1y<-a&3z82sli z_8%(t1ppy1&X@wX^Zs#&m?&w%JU^X~ECS+==a%kXp+I^&fg6aEm{+t!f)is!)h_-s zy4lY`*Q)lxOCUfMkJFZeh_=ynbqm$IS706H54ZB+%Q>XJxVG%&q8KY5AD<+{HtUdH zn5EItc$C~LerG!24{S4_I{BV9DB-r1oOXuMkW4~@T|Jf? zfLqZj)Ku&ReI*hP1O|g{1Tcc=B63or#I6G%6yXD?{4S+&!#RTI(wV%c!TVjCjL`n6 zc=}AIO+FCuc+g3BbOm-Ub#t@J;4spS*LHAUJsJHpeXY;_Z}{NvYH(V7Uf|nVa1^6`mTfD(Q2b{$(i+tQ&M*&dGleGoj8_$KIC2oGS`3#0FyR39T zo!8wui%Y*sT%L@bNd(P|n`n9myEeJPS{V)^6Jk4=Q7hE+q~;yZBcAL7v~PvNl+)N# zwQO(&sU40Acu})^B*uYpy~HR^J0w@;;#TfDZBl*dRhR`krGX@k=t~*2}K2*wnup*&UIhu_b9#!`FF=*k(q-B2b2H}>SR2`h7 zzkb!V_WAhy)@}@H`rT7#EXAfps~x=+;MwbKvAt<-=CqaXXuVBVxBh!@>+(hhX@Uhv zGXO1U2a)l+G;{qPP^qC&jqm^XN$7e?X8Dube9=*+A^XluBn_jSn_}yge@PV!N1zUB zHKSZkK4*Cy+^}|QOWUde?RNl4c9PZg{1N{MWw?M=j-S|M#52zoq5=UZwkw^wIx&DCB?rI9lYTZvV6pz{(4mxirK1G+iyD KTUd>|&;AGNBihjb literal 0 HcmV?d00001 diff --git a/img/radix_result.svg b/img/radix_result.svg new file mode 100644 index 0000000..0e22566 --- /dev/null +++ b/img/radix_result.svg @@ -0,0 +1 @@ +The execution time of radix sort on CPU and GPU withdifferent number of inputsCPUGPU16182022240200400600800Number of inputs(2^n))Execution time(ms)) \ No newline at end of file diff --git a/img/radix_sort.png b/img/radix_sort.png new file mode 100644 index 0000000000000000000000000000000000000000..89cba01a389ce1554eff8d2b430efbdba0ee40f5 GIT binary patch literal 118801 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 z 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 ()B*8onb2S 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 DQd}s$ literal 0 HcmV?d00001 diff --git a/img/scan_result.svg b/img/scan_result.svg new file mode 100644 index 0000000..1a00deb --- /dev/null +++ b/img/scan_result.svg @@ -0,0 +1 @@ +Execution time of different scan functions with 2^n inputsCPUNaiveEffiecientThrust20222426283001,0002,0003,000data size (2^n))execution time (ms) \ No newline at end of file From c292ae7fda6926fbec908422cea6413758e8959c Mon Sep 17 00:00:00 2001 From: HantingXu Date: Fri, 15 Sep 2023 16:41:25 -0400 Subject: [PATCH 6/7] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 65ea377..db1acf5 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ Stream Compaction here mainly refers to a process that taking an array of number * scatter: scatter the elements in the original array to their corresponding place according to the index array generated in the scan function. * Figure - Map, Scan, Scatter for Stream Compaction + ![](img/example.png) The main focus of this project is on the scan function. There are 3 different scan functions implemented: CPU Scan, Naive GPU Scan and Efficient GPU Scan, and their performance are compared together with CUDA thrust scan method. For more detail on how to implement scan, this is a good reference link - [Parallel Prefix Sum (Scan) with CUDA](https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch39.html). @@ -27,6 +28,7 @@ The main focus of this project is on the scan function. There are 3 different sc Radix sort is a type of sorting algorithm that sort an array according to each digit of an element in the array. The time complexity of this algorithm on CPU is normally O(n). This project implement both the CPU version of radix sort and its GPU version. The basic process for this algorithm in GPU version can also be concluded as Map, Scan and Scatter, but in a slightly different way. * Figure - Map, Scan, Scatter for Radix Sort + ![](img/radix_sort.png) This project compares the efficiency of the CPU and GPU version of Radix Sort. The scan function used in based on the work-efficient GPU scan implemented above. @@ -36,8 +38,10 @@ This project compares the efficiency of the CPU and GPU version of Radix Sort. T In the end, we record the execution time of different scan functions implemented. Through my observation, CPU runs the fastest when there are only 2^2 to 2^18 elements in an array. And as we can observe from the graph below, CPU becomes slower than all GPU algorithms when there are 2^20 or more elements in an array. That is basically because the time comlexity of CPU scan is intrinsicly larger than the GPU ones. Thus as the input size grows, it becomes inevitably slower. One interesting discovery here is that when the Naive GPU method deals with array with 2^30 elements, it hits the bottleneck and its speed drop sharply. This is probably have something to do with the shortage of memory. Note: all the block size for the GPU algorithms used in this project is 128. + ![](img/scan_result.svg) #### Radix sort The graph shown below decribes the exetion time of radix sort on CPU and GPU as the input size changes. Both radix sort on CPU and GPU slows down as the number of inputs increases. However, as the input size increases, the performance of CPU implementation drops faster than GPU one. That is most likely because of the time compexity of the algorithm itself. + ![](img/radix_result.svg) From 3b4669ffe89b3927cbdd76dbd47ff99cbbe7fc6c Mon Sep 17 00:00:00 2001 From: HantingXu Date: Mon, 18 Sep 2023 15:07:10 -0400 Subject: [PATCH 7/7] Modify the compact function --- stream_compaction/efficient.cu | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 455ac3c..40b4aa1 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -67,9 +67,6 @@ namespace StreamCompaction { cudaMalloc((void**)&dev_odata, length * sizeof(int)); cudaMemcpy(dev_odata, idata, N * sizeof(int), cudaMemcpyHostToDevice); checkCUDAError("cudaMalloc dev_odata failed!", __LINE__); - //to record non-zero numbers - cudaMalloc((void**)&dev_nonZero, 1 * sizeof(int)); - checkCUDAError("cudaMalloc dev_nonZero failed!", __LINE__); cudaDeviceSynchronize(); } @@ -81,12 +78,21 @@ namespace StreamCompaction { cudaMemcpy(dev_idata, idata, N * sizeof(int), cudaMemcpyHostToDevice); checkCUDAError("cudaMalloc dev_idata failed!", __LINE__); cudaMalloc((void**)&dev_odata, length * sizeof(int)); + cudaMemcpy(dev_odata, idata, N * sizeof(int), cudaMemcpyHostToDevice); checkCUDAError("cudaMalloc dev_odata failed!", __LINE__); + //to record non-zero numbers + cudaMalloc((void**)&dev_nonZero, 1 * sizeof(int)); + checkCUDAError("cudaMalloc dev_nonZero failed!", __LINE__); + + cudaMalloc((void**)&dev_input, length * sizeof(int)); + cudaMemcpy(dev_input, idata, N * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAError("cudaMalloc dev_input failed!", __LINE__); cudaMalloc((void**)&dev_indices, length * sizeof(int)); - cudaMemcpy(dev_indices, odata, N * sizeof(int), cudaMemcpyHostToDevice); checkCUDAError("cudaMalloc dev_indices failed!", __LINE__); cudaMalloc((void**)&dev_bools, length * sizeof(int)); checkCUDAError("cudaMalloc dev_bool failed!", __LINE__); + + cudaDeviceSynchronize(); } void endScan() @@ -101,6 +107,7 @@ namespace StreamCompaction { cudaFree(dev_indices); cudaFree(dev_idata); cudaFree(dev_odata); + cudaFree(dev_input); cudaFree(dev_nonZero); } @@ -324,10 +331,9 @@ namespace StreamCompaction { * @returns The number of elements remaining after compaction. */ int compact(int n, int *odata, const int *idata) { + initCompact(n, idata, odata); timer().startGpuTimer(); - - initScan(n, odata, idata); dim3 fullBlocksPerGrid((length + blockSize - 1) / blockSize); EfficientMapKernel << > > (length, n, dev_odata); for (int i = 1; i < length; i = i * 2) @@ -350,21 +356,19 @@ namespace StreamCompaction { cudaDeviceSynchronize(); std::swap(dev_idata, dev_odata); } - cudaMemcpy(odata, dev_odata, sizeof(int) * n, cudaMemcpyDeviceToHost); - endScan(); - - initCompact(n, idata, odata); + std::swap(dev_odata, dev_indices); StreamCompaction::Common::kernMapToBoolean << > > (length, dev_bools, dev_indices); - StreamCompaction::Common::kernScatter << > > (length, dev_odata, dev_idata, dev_bools, dev_indices); + StreamCompaction::Common::kernScatter << > > (length, dev_odata, dev_input, dev_bools, dev_indices); + timer().endGpuTimer(); + cudaMemcpy(odata, dev_odata, sizeof(int) * n, cudaMemcpyDeviceToHost); int* p = (int*)malloc(1 * sizeof(int)); - CountKernel << <1, 1 >> > (n, dev_indices, dev_idata, dev_nonZero); + CountKernel << <1, 1 >> > (n, dev_indices, dev_input, dev_nonZero); cudaMemcpy(p, dev_nonZero, sizeof(int) * 1, cudaMemcpyDeviceToHost); int ans = p[0]; free(p); endCompact(); - timer().endGpuTimer(); return ans; } }