From a5e9070f6993f86d0a4fad2baf3819436c51a079 Mon Sep 17 00:00:00 2001 From: mrabbitz <54726631+mrabbitz@users.noreply.github.com> Date: Thu, 12 Sep 2024 20:04:52 -0400 Subject: [PATCH 01/16] Complete Part 1: CPU Scan & Stream Compaction --- stream_compaction/cpu.cu | 63 ++++++++++++++++++++++++++++++++++++---- stream_compaction/cpu.h | 2 ++ 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 719fa11..366bbbc 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -17,9 +17,21 @@ namespace StreamCompaction { * For performance analysis, this is supposed to be a simple for loop. * (Optional) For better understanding before starting moving to GPU, you can simulate your GPU scan in this function first. */ + + void exclusivePrefixSum(int n, int* odata, const int* idata) { + int prefixSum = 0; + + for (int i = 0; i < n; ++i) { + odata[i] = prefixSum; + prefixSum += idata[i]; + } + } + void scan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // TODO + + exclusivePrefixSum(n, odata, idata); + timer().endCpuTimer(); } @@ -30,9 +42,19 @@ namespace StreamCompaction { */ int compactWithoutScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // TODO + + int compactedCount = 0; + + for (int i = 0; i < n; ++i) + { + if (idata[i] != 0) { + odata[compactedCount++] = idata[i]; + } + } + timer().endCpuTimer(); - return -1; + + return compactedCount; } /** @@ -42,9 +64,40 @@ namespace StreamCompaction { */ int compactWithScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // TODO + + if (n <= 0) { + timer().endCpuTimer(); + return 0; + } + + int* binaryMap = new int[n]; + int* exclusivePrefixSumResult = new int[n]; + + // map the input to an array of 0s and 1s + for (int i = 0; i < n; ++i) + { + binaryMap[i] = idata[i] == 0 ? 0 : 1; + } + + // scan the array of 0s and 1s + exclusivePrefixSum(n, exclusivePrefixSumResult, binaryMap); + + // scatter + int compactedCount = 0; + + for (int i = 0; i < n - 1; ++i) + { + if (exclusivePrefixSumResult[i] != exclusivePrefixSumResult[i + 1]) { + odata[compactedCount++] = idata[i]; + } + } + timer().endCpuTimer(); - return -1; + + delete[] binaryMap; + delete[] exclusivePrefixSumResult; + + return compactedCount; } } } diff --git a/stream_compaction/cpu.h b/stream_compaction/cpu.h index 873c047..110549b 100644 --- a/stream_compaction/cpu.h +++ b/stream_compaction/cpu.h @@ -6,6 +6,8 @@ namespace StreamCompaction { namespace CPU { StreamCompaction::Common::PerformanceTimer& timer(); + void exclusivePrefixSum(int n, int* odata, const int* idata); + void scan(int n, int *odata, const int *idata); int compactWithoutScan(int n, int *odata, const int *idata); From 1832fc0176d3e412a7740e2d0703565a0301b63d Mon Sep 17 00:00:00 2001 From: mrabbitz <54726631+mrabbitz@users.noreply.github.com> Date: Thu, 12 Sep 2024 22:22:55 -0400 Subject: [PATCH 02/16] Part 1 formatting tweaks --- stream_compaction/cpu.cu | 19 ++++++++++++------- stream_compaction/cpu.h | 2 +- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 366bbbc..025b9fe 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -18,10 +18,12 @@ namespace StreamCompaction { * (Optional) For better understanding before starting moving to GPU, you can simulate your GPU scan in this function first. */ - void exclusivePrefixSum(int n, int* odata, const int* idata) { + void exclusivePrefixSum(const int n, const int* idata, int* odata) + { int prefixSum = 0; - for (int i = 0; i < n; ++i) { + for (int i = 0; i < n; ++i) + { odata[i] = prefixSum; prefixSum += idata[i]; } @@ -30,7 +32,7 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - exclusivePrefixSum(n, odata, idata); + exclusivePrefixSum(n, idata, odata); timer().endCpuTimer(); } @@ -47,7 +49,8 @@ namespace StreamCompaction { for (int i = 0; i < n; ++i) { - if (idata[i] != 0) { + if (idata[i] != 0) + { odata[compactedCount++] = idata[i]; } } @@ -65,7 +68,8 @@ namespace StreamCompaction { int compactWithScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - if (n <= 0) { + if (n <= 0) + { timer().endCpuTimer(); return 0; } @@ -80,14 +84,15 @@ namespace StreamCompaction { } // scan the array of 0s and 1s - exclusivePrefixSum(n, exclusivePrefixSumResult, binaryMap); + exclusivePrefixSum(n, binaryMap, exclusivePrefixSumResult); // scatter int compactedCount = 0; for (int i = 0; i < n - 1; ++i) { - if (exclusivePrefixSumResult[i] != exclusivePrefixSumResult[i + 1]) { + if (exclusivePrefixSumResult[i] != exclusivePrefixSumResult[i + 1]) + { odata[compactedCount++] = idata[i]; } } diff --git a/stream_compaction/cpu.h b/stream_compaction/cpu.h index 110549b..4e044a8 100644 --- a/stream_compaction/cpu.h +++ b/stream_compaction/cpu.h @@ -6,7 +6,7 @@ namespace StreamCompaction { namespace CPU { StreamCompaction::Common::PerformanceTimer& timer(); - void exclusivePrefixSum(int n, int* odata, const int* idata); + void exclusivePrefixSum(const int n, const int* idata, int* odata); void scan(int n, int *odata, const int *idata); From 11c8290f6000ba559bacbb2a7055f00c8c210c50 Mon Sep 17 00:00:00 2001 From: mrabbitz <54726631+mrabbitz@users.noreply.github.com> Date: Sat, 14 Sep 2024 17:44:26 -0400 Subject: [PATCH 03/16] Complete Part 2: Naive GPU Scan Algorithm implementations - non-shared mem and shared mem (#2) --- src/main.cpp | 22 ++- stream_compaction/common.h | 3 + stream_compaction/naive.cu | 285 ++++++++++++++++++++++++++++++++++++- stream_compaction/naive.h | 20 ++- 4 files changed, 321 insertions(+), 9 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 896ac2b..fede9e2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -48,8 +48,8 @@ int main(int argc, char* argv[]) { printCmpResult(NPOT, b, c); zeroArray(SIZE, c); - printDesc("naive scan, power-of-two"); - StreamCompaction::Naive::scan(SIZE, c, a); + printDesc("naive scan, power-of-two, no shared memory"); + StreamCompaction::Naive::scan(SIZE, c, a, false); printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(SIZE, c, true); printCmpResult(SIZE, b, c); @@ -61,8 +61,22 @@ int main(int argc, char* argv[]) { printArray(SIZE, c, true); */ zeroArray(SIZE, c); - printDesc("naive scan, non-power-of-two"); - StreamCompaction::Naive::scan(NPOT, c, a); + printDesc("naive scan, non-power-of-two, no shared memory"); + StreamCompaction::Naive::scan(NPOT, c, a, false); + printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(SIZE, c, true); + printCmpResult(NPOT, b, c); + + zeroArray(SIZE, c); + printDesc("naive scan, power-of-two, shared memory"); + StreamCompaction::Naive::scan(SIZE, c, a, true); + printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(SIZE, c, true); + printCmpResult(SIZE, b, c); + + zeroArray(SIZE, c); + printDesc("naive scan, non-power-of-two, shared memory"); + StreamCompaction::Naive::scan(NPOT, c, a, true); printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(SIZE, c, true); printCmpResult(NPOT, b, c); diff --git a/stream_compaction/common.h b/stream_compaction/common.h index d2c1fed..37ea45f 100644 --- a/stream_compaction/common.h +++ b/stream_compaction/common.h @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -10,6 +11,8 @@ #include #include +#define blockSize 32 + #define FILENAME (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) #define checkCUDAError(msg) checkCUDAErrorFn(msg, FILENAME, __LINE__) diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 4308876..94e3909 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -11,15 +11,292 @@ namespace StreamCompaction { static PerformanceTimer timer; return timer; } - // TODO: __global__ + + __global__ void kernelInclusiveToExclusivePrefixSum(const int n, const int* idata, int* odata) + { + int g_index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (g_index >= n) + { + return; + } + + if (g_index > 0) + { + odata[g_index] = idata[g_index - 1]; + } + else if (g_index == 0) + { + odata[g_index] = 0; + } + } + + __global__ void kernelNaiveInclusivePrefixSumPass(const int n, const int offset, const int* idata, int* odata) + { + int g_index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (g_index >= n) + { + return; + } + + if (g_index >= offset) + { + odata[g_index] = idata[g_index - offset] + idata[g_index]; + } + else + { + odata[g_index] = idata[g_index]; + } + } + + __global__ void kernelNaiveInclusivePrefixSumByBlock(const int n, const int* idata, int* odata) + { + int g_index = blockIdx.x * blockDim.x + threadIdx.x; + + if (g_index >= n) + { + return; + } + + // allocated on invocation + extern __shared__ int doubleBuffer[]; + + int tx = threadIdx.x; + + int pout = 0, pin = 1; + + // Load input into shared memory. + doubleBuffer[pout * blockSize + tx] = idata[g_index]; + doubleBuffer[pin * blockSize + tx] = doubleBuffer[pout * blockSize + tx]; + __syncthreads(); + + for (int offset = 1; offset < blockSize; offset *= 2) + { + // swap double buffer indices + pout = 1 - pout; + pin = 1 - pout; + + if (tx >= offset) + { + doubleBuffer[pout * blockSize + tx] = doubleBuffer[pin * blockSize + tx - offset] + doubleBuffer[pin * blockSize + tx]; + } + else + { + doubleBuffer[pout * blockSize + tx] = doubleBuffer[pin * blockSize + tx]; + } + __syncthreads(); + } + + // write output + odata[g_index] = doubleBuffer[pout * blockSize + tx]; + } + + __global__ void kernelNaiveExclusivePrefixSumByBlock(const int n, const int* idata, int* odata) + { + int g_index = blockIdx.x * blockDim.x + threadIdx.x; + + if (g_index >= n) + { + return; + } + + // allocated on invocation + extern __shared__ int doubleBuffer[]; + + int tx = threadIdx.x; + + int pout = 0, pin = 1; + + // Load input into shared memory. + // This is exclusive scan, so shift right by one + // and set first element to 0 + doubleBuffer[pout * blockSize + tx] = (tx > 0) ? idata[g_index - 1] : 0; + doubleBuffer[pin * blockSize + tx] = doubleBuffer[pout * blockSize + tx]; + __syncthreads(); + + for (int offset = 1; offset < blockSize; offset *= 2) + { + // swap double buffer indices + pout = 1 - pout; + pin = 1 - pout; + + if (tx >= offset) + { + doubleBuffer[pout * blockSize + tx] = doubleBuffer[pin * blockSize + tx - offset] + doubleBuffer[pin * blockSize + tx]; + } + else + { + doubleBuffer[pout * blockSize + tx] = doubleBuffer[pin * blockSize + tx]; + } + __syncthreads(); + } + + // write output + odata[g_index] = doubleBuffer[pout * blockSize + tx]; + } + + __global__ void kernelExtractBlockSums(const int n, const int numBlocks, const int* idata, int* odata) + { + int g_index = blockIdx.x * blockDim.x + threadIdx.x; + + if (g_index >= numBlocks) + { + return; + } + + odata[g_index] = g_index == numBlocks - 1 ? idata[n - 1] : idata[(g_index * blockSize) + blockSize - 1]; + } + + __global__ void kernelAddBlockIncrements(const int n, const int* idataBlockSums, const int* idata, int* odata) + { + int g_index = blockIdx.x * blockDim.x + threadIdx.x; + + if (g_index >= n) + { + return; + } + + odata[g_index] = idata[g_index] + idataBlockSums[blockIdx.x]; + } /** * 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, bool useSharedMemory) + { + if (useSharedMemory) + { + naiveExclusivePrefixSumSharedMemory(n, idata, odata); + } + else + { + naiveExclusivePrefixSum(n, idata, odata); + } + } + + void naiveExclusivePrefixSum(const int n, const int* idata, int* odata) + { + int* dev_bufferA; + int* dev_bufferB; + + cudaMalloc((void**)&dev_bufferA, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_bufferA failed!"); + + cudaMalloc((void**)&dev_bufferB, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_bufferB failed!"); + + cudaMemcpy(dev_bufferA, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + checkCUDAError("memcpy idata to dev_bufferA failed!"); + + dim3 blocksPerGrid((n + blockSize - 1) / blockSize); + timer().startGpuTimer(); - // TODO + + + for (int offset = 1; offset < n; offset *= 2) + { + kernelNaiveInclusivePrefixSumPass<<>>(n, offset, dev_bufferA, dev_bufferB); + checkCUDAError("kernelNaiveInclusivePrefixSumPass failed!"); + + // set the input of the next iteration to the output of this iteration + std::swap(dev_bufferA, dev_bufferB); + } + + kernelInclusiveToExclusivePrefixSum<<>>(n, dev_bufferA, dev_bufferB); + checkCUDAError("kernelInclusiveToExclusivePrefixSum failed!"); + + cudaMemcpy(odata, dev_bufferB, sizeof(int) * n, cudaMemcpyDeviceToHost); + checkCUDAError("memcpy dev_bufferB to odata failed!"); + + timer().endGpuTimer(); + + cudaFree(dev_bufferA); + cudaFree(dev_bufferB); + } + + void naiveExclusivePrefixSumSharedMemory(const int n, const int* idata, int* odata) + { + int* dev_bufferA; + int* dev_bufferB; + + cudaMalloc((void**)&dev_bufferA, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_bufferA failed!"); + + cudaMalloc((void**)&dev_bufferB, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_bufferB failed!"); + + cudaMemcpy(dev_bufferA, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + checkCUDAError("memcpy idata to dev_bufferA failed!"); + + const int sharedMemoryBytes = 2 * blockSize * sizeof(int); + + int numBlocks = (n + blockSize - 1) / blockSize; + + timer().startGpuTimer(); + + + naiveInclusivePrefixSumAnyNumberOfBlocks(sharedMemoryBytes, n, numBlocks, dev_bufferA, dev_bufferB); + + kernelInclusiveToExclusivePrefixSum<<<(n + blockSize - 1) / blockSize, blockSize>>>(n, dev_bufferB, dev_bufferA); + checkCUDAError("kernelInclusiveToExclusivePrefixSum failed!"); + + cudaMemcpy(odata, dev_bufferA, sizeof(int) * n, cudaMemcpyDeviceToHost); + checkCUDAError("memcpy dev_bufferA to odata failed!"); + + + timer().endGpuTimer(); + + cudaFree(dev_bufferA); + cudaFree(dev_bufferB); + } + + // iterative approach is possible if the blockSums buffers are allocated carefully ahead of time, combined with clever indexing of them at each iteration + // for the sake of submitting this assignement on time, this will have to be explored at a later time + void naiveInclusivePrefixSumAnyNumberOfBlocks(const int sharedMemoryBytes, const int n, const int numBlocks, int* idata, int* odata) + { + kernelNaiveInclusivePrefixSumByBlock<<>>(n, idata, odata); + checkCUDAError("kernelNaiveInclusivePrefixSumByBlock failed!"); + + if (numBlocks > 1) + { + int* dev_bufferBlockSumsA; + int* dev_bufferBlockSumsB; + + cudaMalloc((void**)&dev_bufferBlockSumsA, sizeof(int) * numBlocks); + checkCUDAError("cudaMalloc dev_bufferBlockSumsA failed!"); + + cudaMalloc((void**)&dev_bufferBlockSumsB, sizeof(int) * numBlocks); + checkCUDAError("cudaMalloc dev_bufferBlockSumsB failed!"); + + int numBlocksForBlockSums = (numBlocks + blockSize - 1) / blockSize; + kernelExtractBlockSums<<>>(n, numBlocks, odata, dev_bufferBlockSumsA); + checkCUDAError("kernelExtractBlockSums failed!"); + + if (numBlocksForBlockSums > 1) + { + naiveInclusivePrefixSumAnyNumberOfBlocks(sharedMemoryBytes, numBlocks, numBlocksForBlockSums, dev_bufferBlockSumsA, dev_bufferBlockSumsB); + + kernelInclusiveToExclusivePrefixSum<<>>(numBlocks, dev_bufferBlockSumsB, dev_bufferBlockSumsA); + checkCUDAError("kernelInclusiveToExclusivePrefixSum failed!"); + + kernelAddBlockIncrements<<>>(n, dev_bufferBlockSumsA, odata, idata); + checkCUDAError("kernelAddBlockIncrements failed!"); + } + else + { + kernelNaiveExclusivePrefixSumByBlock<<>>(numBlocks, dev_bufferBlockSumsA, dev_bufferBlockSumsB); + checkCUDAError("kernelNaiveExclusivePrefixSumByBlock failed!"); + + kernelAddBlockIncrements<<>>(n, dev_bufferBlockSumsB, odata, idata); + checkCUDAError("kernelAddBlockIncrements failed!"); + } + + cudaMemcpy(odata, idata, sizeof(int) * n, cudaMemcpyDeviceToDevice); + checkCUDAError("memcpy idata to odata failed!"); + + cudaFree(dev_bufferBlockSumsA); + cudaFree(dev_bufferBlockSumsB); + } } } -} +} \ No newline at end of file diff --git a/stream_compaction/naive.h b/stream_compaction/naive.h index 37dcb06..41417f5 100644 --- a/stream_compaction/naive.h +++ b/stream_compaction/naive.h @@ -6,6 +6,24 @@ namespace StreamCompaction { namespace Naive { StreamCompaction::Common::PerformanceTimer& timer(); - void scan(int n, int *odata, const int *idata); + __global__ void kernelInclusiveToExclusivePrefixSum(const int n, const int* idata, int* odata); + + __global__ void kernelNaiveInclusivePrefixSumPass(const int n, const int offset, const int* idata, int* odata); + + __global__ void kernelNaiveInclusivePrefixSumByBlock(const int n, const int* idata, int* odata); + + __global__ void kernelNaiveExclusivePrefixSumByBlock(const int n, const int* idata, int* odata); + + __global__ void kernelExtractBlockSums(const int n, const int numBlocks, const int* idata, int* odata); + + __global__ void kernelAddBlockIncrements(const int n, const int* idataBlockSums, const int* idata, int* odata); + + void scan(int n, int* odata, const int* idata, bool useSharedMemory); + + void naiveExclusivePrefixSum(const int n, const int* idata, int* odata); + + void naiveExclusivePrefixSumSharedMemory(const int n, const int* idata, int* odata); + + void naiveInclusivePrefixSumAnyNumberOfBlocks(const int sharedMemoryBytes, const int n, const int numBlocks, int* idata, int* odata); } } From 0a47206a21c88cf6f888d21fd31f78c9bc37fce4 Mon Sep 17 00:00:00 2001 From: mrabbitz <54726631+mrabbitz@users.noreply.github.com> Date: Sat, 14 Sep 2024 18:13:57 -0400 Subject: [PATCH 04/16] Part 1 rework - cpu compact with scan can now handle if the last element of the stream is a "hit" --- src/main.cpp | 11 +++++++++-- stream_compaction/cpu.cu | 7 +++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index fede9e2..0502d25 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -141,12 +141,19 @@ int main(int argc, char* argv[]) { printCmpLenResult(count, expectedNPOT, b, c); zeroArray(SIZE, c); - printDesc("cpu compact with scan"); + printDesc("cpu compact with scan, power-of-two"); count = StreamCompaction::CPU::compactWithScan(SIZE, c, a); printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - printArray(count, c, true); + //printArray(count, c, true); printCmpLenResult(count, expectedCount, b, c); + zeroArray(SIZE, c); + printDesc("cpu compact with scan, non-power-of-two"); + count = StreamCompaction::CPU::compactWithScan(NPOT, c, a); + printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + //printArray(count, c, true); + printCmpLenResult(count, expectedNPOT, b, c); + zeroArray(SIZE, c); printDesc("work-efficient compact, power-of-two"); count = StreamCompaction::Efficient::compact(SIZE, c, a); diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 025b9fe..cdd6156 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -97,6 +97,13 @@ namespace StreamCompaction { } } + // handle case where last element of binary map is a "hit" AKA == 1 + // the exclusive prefixSumResult doesnt capture this edge case + if (binaryMap[n - 1] == 1) + { + odata[compactedCount++] = idata[n - 1]; + } + timer().endCpuTimer(); delete[] binaryMap; From 65c2637a0924a156b972bb55d036d5a5e07c50e2 Mon Sep 17 00:00:00 2001 From: mrabbitz <54726631+mrabbitz@users.noreply.github.com> Date: Sun, 15 Sep 2024 23:03:03 -0400 Subject: [PATCH 05/16] Complete Part 3: Work-Efficient GPU Scan & Stream Compaction - non-shared mem and shared mem. Part 1 and 2 slightly modified (#3) --- src/main.cpp | 44 +++++- stream_compaction/common.cu | 20 ++- stream_compaction/cpu.cu | 14 +- stream_compaction/efficient.cu | 276 ++++++++++++++++++++++++++++++++- stream_compaction/efficient.h | 18 ++- stream_compaction/naive.cu | 97 ++++++------ stream_compaction/naive.h | 2 +- 7 files changed, 391 insertions(+), 80 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 0502d25..cee7ca4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -82,15 +82,29 @@ int main(int argc, char* argv[]) { printCmpResult(NPOT, b, c); zeroArray(SIZE, c); - printDesc("work-efficient scan, power-of-two"); - StreamCompaction::Efficient::scan(SIZE, c, a); + printDesc("work-efficient scan, power-of-two, no shared memory"); + StreamCompaction::Efficient::scan(SIZE, c, a, false); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //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); + printDesc("work-efficient scan, non-power-of-two, no shared memory"); + StreamCompaction::Efficient::scan(NPOT, c, a, false); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(NPOT, c, true); + printCmpResult(NPOT, b, c); + + zeroArray(SIZE, c); + printDesc("work-efficient scan, power-of-two, shared memory"); + StreamCompaction::Efficient::scan(SIZE, c, a, true); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(SIZE, c, true); + printCmpResult(SIZE, b, c); + + zeroArray(SIZE, c); + printDesc("work-efficient scan, non-power-of-two, shared memory"); + StreamCompaction::Efficient::scan(NPOT, c, a, true); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(NPOT, c, true); printCmpResult(NPOT, b, c); @@ -155,15 +169,29 @@ int main(int argc, char* argv[]) { printCmpLenResult(count, expectedNPOT, b, c); zeroArray(SIZE, c); - printDesc("work-efficient compact, power-of-two"); - count = StreamCompaction::Efficient::compact(SIZE, c, a); + printDesc("work-efficient compact, power-of-two, no shared memory"); + count = StreamCompaction::Efficient::compact(SIZE, c, a, false); + 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, no shared memory"); + count = StreamCompaction::Efficient::compact(NPOT, c, a, false); + printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(count, c, true); + printCmpLenResult(count, expectedNPOT, b, c); + + zeroArray(SIZE, c); + printDesc("work-efficient compact, power-of-two, shared memory"); + count = StreamCompaction::Efficient::compact(SIZE, c, a, true); 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); + printDesc("work-efficient compact, non-power-of-two, shared memory"); + count = StreamCompaction::Efficient::compact(NPOT, c, a, true); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 2ed6d63..c2aa1b6 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -23,7 +23,14 @@ 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 g_index = (blockIdx.x * blockDim.x) + threadIdx.x; + if (g_index >= n) + { + return; + } + + bools[g_index] = idata[g_index] == 0 ? 0 : 1; } /** @@ -32,7 +39,16 @@ namespace StreamCompaction { */ __global__ void kernScatter(int n, int *odata, const int *idata, const int *bools, const int *indices) { - // TODO + + int g_index = (blockIdx.x * blockDim.x) + threadIdx.x; + + // index out of bounds or not a "hit" + if ((g_index >= n) || (bools[g_index] == 0)) + { + return; + } + + odata[indices[g_index]] = idata[g_index]; } } diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index cdd6156..7b43002 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -89,21 +89,15 @@ namespace StreamCompaction { // scatter int compactedCount = 0; - for (int i = 0; i < n - 1; ++i) + for (int i = 0; i < n; ++i) { - if (exclusivePrefixSumResult[i] != exclusivePrefixSumResult[i + 1]) + if (binaryMap[i] == 1) { - odata[compactedCount++] = idata[i]; + odata[exclusivePrefixSumResult[i]] = idata[i]; + ++compactedCount; } } - // handle case where last element of binary map is a "hit" AKA == 1 - // the exclusive prefixSumResult doesnt capture this edge case - if (binaryMap[n - 1] == 1) - { - odata[compactedCount++] = idata[n - 1]; - } - timer().endCpuTimer(); delete[] binaryMap; diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 2db346e..8082d6e 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -12,13 +12,219 @@ namespace StreamCompaction { return timer; } + __global__ void kernelReductionPass(const int bufferLength, const int offset, int* data) + { + int g_index = (blockIdx.x * blockDim.x) + threadIdx.x; + + // index out of bounds or not a rhs child node + if ((g_index >= bufferLength) || ((g_index + 1) % (2 * offset) != 0)) + { + return; + } + + data[g_index] += data[g_index - offset]; + } + + __global__ void kernelDownSweepPass(const int bufferLength, const int offset, int* data) + { + int g_index = (blockIdx.x * blockDim.x) + threadIdx.x; + + // index out of bounds or not a rhs child node + if ((g_index >= bufferLength) || ((g_index + 1) % (2 * offset) != 0)) + { + return; + } + + int tmp = data[g_index]; + data[g_index] += data[g_index - offset]; + data[g_index - offset] = tmp; + } + + __global__ void kernelEfficientExclusivePrefixSumByBlock(const int n, int* data, int* sums) + { + extern __shared__ int shared[]; + + int tx = threadIdx.x; + int g_index = blockIdx.x * blockDim.x + tx; + + // Load input into shared memory + if (g_index < n) + { + shared[tx] = data[g_index]; + } + else + { + shared[tx] = 0; + } + __syncthreads(); + + // Upsweep (Reduction) phase + for (int offset = 1; offset < blockSize; offset *= 2) + { + if ((tx + 1) % (2 * offset) == 0) + { + shared[tx] += shared[tx - offset]; + } + __syncthreads(); + } + + // Clear the last element + if (tx == blockSize - 1) + { + sums[blockIdx.x] = shared[tx]; + shared[tx] = 0; + } + __syncthreads(); + + // Downsweep phase + for (int offset = blockSize / 2; offset > 0; offset /= 2) + { + if ((tx + 1) % (2 * offset) == 0) + { + int temp = shared[tx]; + shared[tx] += shared[tx - offset]; + shared[tx - offset] = temp; + } + __syncthreads(); + } + + // Write the results back to global memory + if (g_index < n) + { + data[g_index] = shared[tx]; + } + } + + __global__ void kernelAddBlockSumsToBlockData(const int n, const int* idataBlockSums, int* data) + { + int g_index = blockIdx.x * blockDim.x + threadIdx.x; + if (g_index >= n) + { + return; + } + + data[g_index] += idataBlockSums[blockIdx.x]; + } + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ - void scan(int n, int *odata, const int *idata) { - timer().startGpuTimer(); - // TODO - timer().endGpuTimer(); + void scan(int n, int* odata, const int* idata, bool useSharedMemory) + { + if (useSharedMemory) + { + efficientExclusivePrefixSumSharedMemory(true, n, idata, odata); + } + else + { + efficientExclusivePrefixSum(true, n, idata, odata); + } + } + + void efficientExclusivePrefixSum(const bool useGpuTimer, const int n, const int* idata, int* odata) + { + int totalPasses = ilog2ceil(n); + int bufferLength = 1 << totalPasses; + + int* dev_data; + + cudaMalloc((void**)&dev_data, sizeof(int) * bufferLength); + checkCUDAError("cudaMalloc dev_data failed!"); + + cudaMemcpy(dev_data, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + checkCUDAError("memcpy idata to dev_data failed!"); + + if (bufferLength > n) + { + cudaMemset(dev_data + n, 0, sizeof(int) * (bufferLength - n)); + checkCUDAError("cudaMemset elements n to bufferLength - 1 in dev_data to 0 failed!"); + } + + int blocksPerGrid = (bufferLength + blockSize - 1) / blockSize; + + if (useGpuTimer) timer().startGpuTimer(); + + + for (int offset = 1; offset < bufferLength; offset *= 2) + { + kernelReductionPass<<>>(bufferLength, offset, dev_data); + checkCUDAError("kernelReductionPass failed!"); + } + + cudaMemset(dev_data + bufferLength - 1, 0, sizeof(int)); + checkCUDAError("cudaMemset last element in dev_data to 0 failed!"); + + for (int offset = bufferLength / 2; offset > 0; offset /= 2) + { + kernelDownSweepPass<<>>(bufferLength, offset, dev_data); + checkCUDAError("kernelDownSweepPass failed!"); + } + + + if (useGpuTimer) timer().endGpuTimer(); + + cudaMemcpy(odata, dev_data, sizeof(int) * n, cudaMemcpyDeviceToHost); + checkCUDAError("memcpy dev_data to odata failed!"); + + cudaFree(dev_data); + } + + void efficientExclusivePrefixSumSharedMemory(const bool useGpuTimer, const int n, const int* idata, int* odata) + { + int blocksPerGrid = (n + blockSize - 1) / blockSize; + + int* dev_data; + int* dev_sums; + + cudaMalloc((void**)&dev_data, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_data failed!"); + + cudaMalloc((void**)&dev_sums, sizeof(int) * blocksPerGrid); + checkCUDAError("cudaMalloc dev_sums failed!"); + + cudaMemcpy(dev_data, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + checkCUDAError("memcpy idata to dev_data failed!"); + + int sharedMemoryBytes = blockSize * sizeof(int); + + if (useGpuTimer) timer().startGpuTimer(); + + + efficientExclusivePrefixSumAnyNumberOfBlocks(sharedMemoryBytes, n, blocksPerGrid, dev_data, dev_sums); + + + if (useGpuTimer) timer().endGpuTimer(); + + cudaMemcpy(odata, dev_data, sizeof(int) * n, cudaMemcpyDeviceToHost); + checkCUDAError("memcpy dev_data to odata failed!"); + + cudaFree(dev_data); + cudaFree(dev_sums); + } + + // iterative approach is possible + // for the sake of submitting this assignement on time, this will have to be explored at a later time + void efficientExclusivePrefixSumAnyNumberOfBlocks(const int sharedMemoryBytes, const int n, const int numBlocks, int* data, int* sums) + { + kernelEfficientExclusivePrefixSumByBlock<<>>(n, data, sums); + checkCUDAError("kernelEfficientExclusivePrefixSumByBlock failed!"); + + if (numBlocks > 1) + { + int numBlocksForBlockSums = (numBlocks + blockSize - 1) / blockSize; + + int* dev_sums; + + cudaMalloc((void**)&dev_sums, sizeof(int) * numBlocksForBlockSums); + checkCUDAError("cudaMalloc dev_sums failed!"); + + efficientExclusivePrefixSumAnyNumberOfBlocks(sharedMemoryBytes, numBlocks, numBlocksForBlockSums, sums, dev_sums); + + kernelAddBlockSumsToBlockData<<>>(n, sums, data); + checkCUDAError("kernelAddBlockSumsToBlockData failed!"); + + cudaFree(dev_sums); + } } /** @@ -30,11 +236,67 @@ 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, bool useSharedMemory) + { + int* dev_idata; + int* dev_odata; + int* dev_binaryMap; + int* dev_exclusivePrefixSumResult; + + cudaMalloc((void**)&dev_idata, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_idata failed!"); + + cudaMalloc((void**)&dev_odata, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_odata failed!"); + + cudaMalloc((void**)&dev_binaryMap, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_binaryMap failed!"); + + cudaMalloc((void**)&dev_exclusivePrefixSumResult, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_exclusivePrefixSumResult failed!"); + + cudaMemcpy(dev_idata, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + checkCUDAError("memcpy idata to dev_idata failed!"); + + int blocksPerGrid = (n + blockSize - 1) / blockSize; + timer().startGpuTimer(); - // TODO + + + Common::kernMapToBoolean<<>>(n, dev_binaryMap, dev_idata); + + if (useSharedMemory) + { + efficientExclusivePrefixSumSharedMemory(false, n, dev_binaryMap, dev_exclusivePrefixSumResult); + } + else + { + efficientExclusivePrefixSum(false, n, dev_binaryMap, dev_exclusivePrefixSumResult); + } + + Common::kernScatter<<>>(n, dev_odata, dev_idata, dev_binaryMap, dev_exclusivePrefixSumResult); + + timer().endGpuTimer(); - return -1; + + cudaMemcpy(odata, dev_odata, sizeof(int) * n, cudaMemcpyDeviceToHost); + checkCUDAError("memcpy dev_bufferB to odata failed!"); + + int compactedCount; + cudaMemcpy(&compactedCount, dev_exclusivePrefixSumResult + (n - 1), sizeof(int), cudaMemcpyDeviceToHost); + checkCUDAError("cudaMemcpy dev_exclusivePrefixSumResult to compactedCount failed!"); + + if (idata[n - 1] != 0) + { + ++compactedCount; + } + + cudaFree(dev_idata); + cudaFree(dev_odata); + cudaFree(dev_binaryMap); + cudaFree(dev_exclusivePrefixSumResult); + + return compactedCount; } } } diff --git a/stream_compaction/efficient.h b/stream_compaction/efficient.h index 803cb4f..089c5e0 100644 --- a/stream_compaction/efficient.h +++ b/stream_compaction/efficient.h @@ -6,8 +6,22 @@ namespace StreamCompaction { namespace Efficient { StreamCompaction::Common::PerformanceTimer& timer(); - void scan(int n, int *odata, const int *idata); + __global__ void kernelReductionPass(const int bufferLength, const int offset, int* data); - int compact(int n, int *odata, const int *idata); + __global__ void kernelDownSweepPass(const int bufferLength, const int offset, int* data); + + __global__ void kernelEfficientExclusivePrefixSumByBlock(const int n, int* data, int* sums); + + __global__ void kernelAddBlockSumsToBlockData(const int n, const int* idataBlockSums, int* data); + + void scan(int n, int* odata, const int* idata, bool useSharedMemory); + + void efficientExclusivePrefixSum(const bool useGpuTimer, const int n, const int* idata, int* odata); + + void efficientExclusivePrefixSumSharedMemory(const bool useGpuTimer, const int n, const int* idata, int* odata); + + void efficientExclusivePrefixSumAnyNumberOfBlocks(const int sharedMemoryBytes, const int n, const int numBlocks, int* data, int* sums); + + int compact(int n, int* odata, const int* idata, bool useSharedMemory); } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 94e3909..b75ae7e 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -50,94 +50,94 @@ namespace StreamCompaction { __global__ void kernelNaiveInclusivePrefixSumByBlock(const int n, const int* idata, int* odata) { - int g_index = blockIdx.x * blockDim.x + threadIdx.x; + // allocated on invocation + extern __shared__ int doubleBuffer[]; + int g_index = blockIdx.x * blockDim.x + threadIdx.x; if (g_index >= n) { return; } - // allocated on invocation - extern __shared__ int doubleBuffer[]; - int tx = threadIdx.x; - int pout = 0, pin = 1; + // identify which half of double buffer is read-half and write-half + int writeBuffer = 0; + int readBuffer = 1; - // Load input into shared memory. - doubleBuffer[pout * blockSize + tx] = idata[g_index]; - doubleBuffer[pin * blockSize + tx] = doubleBuffer[pout * blockSize + tx]; + // Load input into shared memory + // Only need to write to the first half since our first write will be to the second half + doubleBuffer[tx] = idata[g_index]; __syncthreads(); for (int offset = 1; offset < blockSize; offset *= 2) { // swap double buffer indices - pout = 1 - pout; - pin = 1 - pout; + writeBuffer = 1 - writeBuffer; + readBuffer = 1 - writeBuffer; if (tx >= offset) { - doubleBuffer[pout * blockSize + tx] = doubleBuffer[pin * blockSize + tx - offset] + doubleBuffer[pin * blockSize + tx]; + doubleBuffer[writeBuffer * blockSize + tx] = doubleBuffer[readBuffer * blockSize + tx - offset] + doubleBuffer[readBuffer * blockSize + tx]; } else { - doubleBuffer[pout * blockSize + tx] = doubleBuffer[pin * blockSize + tx]; + doubleBuffer[writeBuffer * blockSize + tx] = doubleBuffer[readBuffer * blockSize + tx]; } __syncthreads(); } // write output - odata[g_index] = doubleBuffer[pout * blockSize + tx]; + odata[g_index] = doubleBuffer[writeBuffer * blockSize + tx]; } __global__ void kernelNaiveExclusivePrefixSumByBlock(const int n, const int* idata, int* odata) { - int g_index = blockIdx.x * blockDim.x + threadIdx.x; + // allocated on invocation + extern __shared__ int doubleBuffer[]; + int g_index = blockIdx.x * blockDim.x + threadIdx.x; if (g_index >= n) { return; } - // allocated on invocation - extern __shared__ int doubleBuffer[]; - int tx = threadIdx.x; - int pout = 0, pin = 1; + // identify which half of double buffer is read-half and write-half + int writeBuffer = 0; + int readBuffer = 1; - // Load input into shared memory. - // This is exclusive scan, so shift right by one - // and set first element to 0 - doubleBuffer[pout * blockSize + tx] = (tx > 0) ? idata[g_index - 1] : 0; - doubleBuffer[pin * blockSize + tx] = doubleBuffer[pout * blockSize + tx]; + // Load input into shared memory + // Exclusive scan - shift all elements right by one and set first element to 0 + // Only need to write to the first half since our first write will be to the second half + doubleBuffer[tx] = (tx > 0) ? idata[g_index - 1] : 0; __syncthreads(); for (int offset = 1; offset < blockSize; offset *= 2) { // swap double buffer indices - pout = 1 - pout; - pin = 1 - pout; + writeBuffer = 1 - writeBuffer; + readBuffer = 1 - writeBuffer; if (tx >= offset) { - doubleBuffer[pout * blockSize + tx] = doubleBuffer[pin * blockSize + tx - offset] + doubleBuffer[pin * blockSize + tx]; + doubleBuffer[writeBuffer * blockSize + tx] = doubleBuffer[readBuffer * blockSize + tx - offset] + doubleBuffer[readBuffer * blockSize + tx]; } else { - doubleBuffer[pout * blockSize + tx] = doubleBuffer[pin * blockSize + tx]; + doubleBuffer[writeBuffer * blockSize + tx] = doubleBuffer[readBuffer * blockSize + tx]; } __syncthreads(); } // write output - odata[g_index] = doubleBuffer[pout * blockSize + tx]; + odata[g_index] = doubleBuffer[writeBuffer * blockSize + tx]; } __global__ void kernelExtractBlockSums(const int n, const int numBlocks, const int* idata, int* odata) { int g_index = blockIdx.x * blockDim.x + threadIdx.x; - if (g_index >= numBlocks) { return; @@ -146,16 +146,15 @@ namespace StreamCompaction { odata[g_index] = g_index == numBlocks - 1 ? idata[n - 1] : idata[(g_index * blockSize) + blockSize - 1]; } - __global__ void kernelAddBlockIncrements(const int n, const int* idataBlockSums, const int* idata, int* odata) + __global__ void kernelAddBlockSumsToBlockData(const int n, const int* idataBlockSums, int* data) { int g_index = blockIdx.x * blockDim.x + threadIdx.x; - if (g_index >= n) { return; } - odata[g_index] = idata[g_index] + idataBlockSums[blockIdx.x]; + data[g_index] += idataBlockSums[blockIdx.x]; } /** @@ -187,7 +186,7 @@ namespace StreamCompaction { cudaMemcpy(dev_bufferA, idata, sizeof(int) * n, cudaMemcpyHostToDevice); checkCUDAError("memcpy idata to dev_bufferA failed!"); - dim3 blocksPerGrid((n + blockSize - 1) / blockSize); + int blocksPerGrid = (n + blockSize - 1) / blockSize; timer().startGpuTimer(); @@ -204,12 +203,12 @@ namespace StreamCompaction { kernelInclusiveToExclusivePrefixSum<<>>(n, dev_bufferA, dev_bufferB); checkCUDAError("kernelInclusiveToExclusivePrefixSum failed!"); - cudaMemcpy(odata, dev_bufferB, sizeof(int) * n, cudaMemcpyDeviceToHost); - checkCUDAError("memcpy dev_bufferB to odata failed!"); - timer().endGpuTimer(); + cudaMemcpy(odata, dev_bufferB, sizeof(int) * n, cudaMemcpyDeviceToHost); + checkCUDAError("memcpy dev_bufferB to odata failed!"); + cudaFree(dev_bufferA); cudaFree(dev_bufferB); } @@ -228,24 +227,24 @@ namespace StreamCompaction { cudaMemcpy(dev_bufferA, idata, sizeof(int) * n, cudaMemcpyHostToDevice); checkCUDAError("memcpy idata to dev_bufferA failed!"); - const int sharedMemoryBytes = 2 * blockSize * sizeof(int); + int blocksPerGrid = (n + blockSize - 1) / blockSize; - int numBlocks = (n + blockSize - 1) / blockSize; + int sharedMemoryBytes = 2 * blockSize * sizeof(int); timer().startGpuTimer(); - naiveInclusivePrefixSumAnyNumberOfBlocks(sharedMemoryBytes, n, numBlocks, dev_bufferA, dev_bufferB); + naiveInclusivePrefixSumAnyNumberOfBlocks(sharedMemoryBytes, n, blocksPerGrid, dev_bufferA, dev_bufferB); - kernelInclusiveToExclusivePrefixSum<<<(n + blockSize - 1) / blockSize, blockSize>>>(n, dev_bufferB, dev_bufferA); + kernelInclusiveToExclusivePrefixSum<<>>(n, dev_bufferB, dev_bufferA); checkCUDAError("kernelInclusiveToExclusivePrefixSum failed!"); - cudaMemcpy(odata, dev_bufferA, sizeof(int) * n, cudaMemcpyDeviceToHost); - checkCUDAError("memcpy dev_bufferA to odata failed!"); - timer().endGpuTimer(); + cudaMemcpy(odata, dev_bufferA, sizeof(int) * n, cudaMemcpyDeviceToHost); + checkCUDAError("memcpy dev_bufferA to odata failed!"); + cudaFree(dev_bufferA); cudaFree(dev_bufferB); } @@ -269,6 +268,7 @@ namespace StreamCompaction { checkCUDAError("cudaMalloc dev_bufferBlockSumsB failed!"); int numBlocksForBlockSums = (numBlocks + blockSize - 1) / blockSize; + kernelExtractBlockSums<<>>(n, numBlocks, odata, dev_bufferBlockSumsA); checkCUDAError("kernelExtractBlockSums failed!"); @@ -279,21 +279,18 @@ namespace StreamCompaction { kernelInclusiveToExclusivePrefixSum<<>>(numBlocks, dev_bufferBlockSumsB, dev_bufferBlockSumsA); checkCUDAError("kernelInclusiveToExclusivePrefixSum failed!"); - kernelAddBlockIncrements<<>>(n, dev_bufferBlockSumsA, odata, idata); - checkCUDAError("kernelAddBlockIncrements failed!"); + kernelAddBlockSumsToBlockData<<>>(n, dev_bufferBlockSumsA, odata); + checkCUDAError("kernelAddBlockSumsToBlockData failed!"); } else { kernelNaiveExclusivePrefixSumByBlock<<>>(numBlocks, dev_bufferBlockSumsA, dev_bufferBlockSumsB); checkCUDAError("kernelNaiveExclusivePrefixSumByBlock failed!"); - kernelAddBlockIncrements<<>>(n, dev_bufferBlockSumsB, odata, idata); - checkCUDAError("kernelAddBlockIncrements failed!"); + kernelAddBlockSumsToBlockData<<>>(n, dev_bufferBlockSumsB, odata); + checkCUDAError("kernelAddBlockSumsToBlockData failed!"); } - cudaMemcpy(odata, idata, sizeof(int) * n, cudaMemcpyDeviceToDevice); - checkCUDAError("memcpy idata to odata failed!"); - cudaFree(dev_bufferBlockSumsA); cudaFree(dev_bufferBlockSumsB); } diff --git a/stream_compaction/naive.h b/stream_compaction/naive.h index 41417f5..84fe093 100644 --- a/stream_compaction/naive.h +++ b/stream_compaction/naive.h @@ -16,7 +16,7 @@ namespace StreamCompaction { __global__ void kernelExtractBlockSums(const int n, const int numBlocks, const int* idata, int* odata); - __global__ void kernelAddBlockIncrements(const int n, const int* idataBlockSums, const int* idata, int* odata); + __global__ void kernelAddBlockSumsToBlockData(const int n, const int* idataBlockSums, int* data); void scan(int n, int* odata, const int* idata, bool useSharedMemory); From 3dc17723214b1446032c37c1bfbcd135ec3f70cb Mon Sep 17 00:00:00 2001 From: mrabbitz <54726631+mrabbitz@users.noreply.github.com> Date: Sun, 15 Sep 2024 23:55:05 -0400 Subject: [PATCH 06/16] Complete Part 4: Using Thrust's Implementation --- stream_compaction/efficient.cu | 4 ++++ stream_compaction/naive.cu | 3 +++ stream_compaction/thrust.cu | 31 ++++++++++++++++++++++++++++--- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 8082d6e..bc3b0b0 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -167,6 +167,7 @@ namespace StreamCompaction { checkCUDAError("memcpy dev_data to odata failed!"); cudaFree(dev_data); + checkCUDAError("cudaFree failed!"); } void efficientExclusivePrefixSumSharedMemory(const bool useGpuTimer, const int n, const int* idata, int* odata) @@ -200,6 +201,7 @@ namespace StreamCompaction { cudaFree(dev_data); cudaFree(dev_sums); + checkCUDAError("cudaFree failed!"); } // iterative approach is possible @@ -224,6 +226,7 @@ namespace StreamCompaction { checkCUDAError("kernelAddBlockSumsToBlockData failed!"); cudaFree(dev_sums); + checkCUDAError("cudaFree failed!"); } } @@ -295,6 +298,7 @@ namespace StreamCompaction { cudaFree(dev_odata); cudaFree(dev_binaryMap); cudaFree(dev_exclusivePrefixSumResult); + checkCUDAError("cudaFree failed!"); return compactedCount; } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index b75ae7e..1bb348b 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -211,6 +211,7 @@ namespace StreamCompaction { cudaFree(dev_bufferA); cudaFree(dev_bufferB); + checkCUDAError("cudaFree failed!"); } void naiveExclusivePrefixSumSharedMemory(const int n, const int* idata, int* odata) @@ -247,6 +248,7 @@ namespace StreamCompaction { cudaFree(dev_bufferA); cudaFree(dev_bufferB); + checkCUDAError("cudaFree failed!"); } // iterative approach is possible if the blockSums buffers are allocated carefully ahead of time, combined with clever indexing of them at each iteration @@ -293,6 +295,7 @@ namespace StreamCompaction { cudaFree(dev_bufferBlockSumsA); cudaFree(dev_bufferBlockSumsB); + checkCUDAError("cudaFree failed!"); } } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 1def45e..5bc857a 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -18,11 +18,36 @@ namespace StreamCompaction { * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + + int* dev_idata; + int* dev_odata; + + cudaMalloc((void**)&dev_idata, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_idata failed!"); + + cudaMalloc((void**)&dev_odata, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_odata failed!"); + + cudaMemcpy(dev_idata, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + checkCUDAError("memcpy idata to dev_idata failed!"); + + thrust::device_ptr dev_thrust_idata(dev_idata); + thrust::device_ptr dev_thrust_odata(dev_odata); + timer().startGpuTimer(); - // TODO use `thrust::exclusive_scan` - // example: for device_vectors dv_in and dv_out: - // thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); + + + thrust::exclusive_scan(dev_thrust_idata, dev_thrust_idata + n, dev_thrust_odata); + + timer().endGpuTimer(); + + cudaMemcpy(odata, dev_odata, sizeof(int) * n, cudaMemcpyDeviceToHost); + checkCUDAError("memcpy dev_odata to odata failed!"); + + cudaFree(dev_idata); + cudaFree(dev_odata); + checkCUDAError("cudaFree failed!"); } } } From 57da4c02480bbfe7a36b6b45e8d217fcce16f06f Mon Sep 17 00:00:00 2001 From: mrabbitz <54726631+mrabbitz@users.noreply.github.com> Date: Mon, 16 Sep 2024 02:05:07 -0400 Subject: [PATCH 07/16] thrust stream compaction using remove_if --- src/main.cpp | 14 ++++++++++++ stream_compaction/efficient.cu | 12 +++++----- stream_compaction/naive.cu | 22 +++++++++--------- stream_compaction/thrust.cu | 41 ++++++++++++++++++++++++++++++++++ stream_compaction/thrust.h | 2 ++ 5 files changed, 76 insertions(+), 15 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index cee7ca4..7692a43 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -196,6 +196,20 @@ int main(int argc, char* argv[]) { //printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); + zeroArray(SIZE, c); + printDesc("thrust compact, power-of-two"); + count = StreamCompaction::Thrust::compact(SIZE, c, a); + printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(count, c, true); + printCmpLenResult(count, expectedCount, b, c); + + zeroArray(SIZE, c); + printDesc("thrust compact, non-power-of-two"); + count = StreamCompaction::Thrust::compact(NPOT, c, a); + printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(count, c, true); + printCmpLenResult(count, expectedNPOT, b, c); + system("pause"); // stop Win32 console from closing on exit delete[] a; delete[] b; diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index bc3b0b0..96f7c65 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -68,7 +68,7 @@ namespace StreamCompaction { __syncthreads(); } - // Clear the last element + // Write the block sum and then clear it for the Downsweep if (tx == blockSize - 1) { sums[blockIdx.x] = shared[tx]; @@ -267,6 +267,7 @@ namespace StreamCompaction { Common::kernMapToBoolean<<>>(n, dev_binaryMap, dev_idata); + checkCUDAError("kernMapToBoolean failed!"); if (useSharedMemory) { @@ -278,22 +279,23 @@ namespace StreamCompaction { } Common::kernScatter<<>>(n, dev_odata, dev_idata, dev_binaryMap, dev_exclusivePrefixSumResult); + checkCUDAError("kernScatter failed!"); timer().endGpuTimer(); - cudaMemcpy(odata, dev_odata, sizeof(int) * n, cudaMemcpyDeviceToHost); - checkCUDAError("memcpy dev_bufferB to odata failed!"); - int compactedCount; cudaMemcpy(&compactedCount, dev_exclusivePrefixSumResult + (n - 1), sizeof(int), cudaMemcpyDeviceToHost); - checkCUDAError("cudaMemcpy dev_exclusivePrefixSumResult to compactedCount failed!"); + checkCUDAError("cudaMemcpy dev_exclusivePrefixSumResult last element to compactedCount failed!"); if (idata[n - 1] != 0) { ++compactedCount; } + cudaMemcpy(odata, dev_odata, sizeof(int) * compactedCount, cudaMemcpyDeviceToHost); + checkCUDAError("memcpy dev_odata to odata failed!"); + cudaFree(dev_idata); cudaFree(dev_odata); cudaFree(dev_binaryMap); diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 1bb348b..20e240c 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -51,7 +51,8 @@ namespace StreamCompaction { __global__ void kernelNaiveInclusivePrefixSumByBlock(const int n, const int* idata, int* odata) { // allocated on invocation - extern __shared__ int doubleBuffer[]; + // double buffer for ping-ponging + extern __shared__ int shared[]; int g_index = blockIdx.x * blockDim.x + threadIdx.x; if (g_index >= n) @@ -67,7 +68,7 @@ namespace StreamCompaction { // Load input into shared memory // Only need to write to the first half since our first write will be to the second half - doubleBuffer[tx] = idata[g_index]; + shared[tx] = idata[g_index]; __syncthreads(); for (int offset = 1; offset < blockSize; offset *= 2) @@ -78,23 +79,24 @@ namespace StreamCompaction { if (tx >= offset) { - doubleBuffer[writeBuffer * blockSize + tx] = doubleBuffer[readBuffer * blockSize + tx - offset] + doubleBuffer[readBuffer * blockSize + tx]; + shared[writeBuffer * blockSize + tx] = shared[readBuffer * blockSize + tx - offset] + shared[readBuffer * blockSize + tx]; } else { - doubleBuffer[writeBuffer * blockSize + tx] = doubleBuffer[readBuffer * blockSize + tx]; + shared[writeBuffer * blockSize + tx] = shared[readBuffer * blockSize + tx]; } __syncthreads(); } // write output - odata[g_index] = doubleBuffer[writeBuffer * blockSize + tx]; + odata[g_index] = shared[writeBuffer * blockSize + tx]; } __global__ void kernelNaiveExclusivePrefixSumByBlock(const int n, const int* idata, int* odata) { // allocated on invocation - extern __shared__ int doubleBuffer[]; + // double buffer for ping-ponging + extern __shared__ int shared[]; int g_index = blockIdx.x * blockDim.x + threadIdx.x; if (g_index >= n) @@ -111,7 +113,7 @@ namespace StreamCompaction { // Load input into shared memory // Exclusive scan - shift all elements right by one and set first element to 0 // Only need to write to the first half since our first write will be to the second half - doubleBuffer[tx] = (tx > 0) ? idata[g_index - 1] : 0; + shared[tx] = (tx > 0) ? idata[g_index - 1] : 0; __syncthreads(); for (int offset = 1; offset < blockSize; offset *= 2) @@ -122,17 +124,17 @@ namespace StreamCompaction { if (tx >= offset) { - doubleBuffer[writeBuffer * blockSize + tx] = doubleBuffer[readBuffer * blockSize + tx - offset] + doubleBuffer[readBuffer * blockSize + tx]; + shared[writeBuffer * blockSize + tx] = shared[readBuffer * blockSize + tx - offset] + shared[readBuffer * blockSize + tx]; } else { - doubleBuffer[writeBuffer * blockSize + tx] = doubleBuffer[readBuffer * blockSize + tx]; + shared[writeBuffer * blockSize + tx] = shared[readBuffer * blockSize + tx]; } __syncthreads(); } // write output - odata[g_index] = doubleBuffer[writeBuffer * blockSize + tx]; + odata[g_index] = shared[writeBuffer * blockSize + tx]; } __global__ void kernelExtractBlockSums(const int n, const int numBlocks, const int* idata, int* odata) diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 5bc857a..f500fc0 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -3,9 +3,17 @@ #include #include #include +#include #include "common.h" #include "thrust.h" +struct is_zero +{ + __device__ bool operator()(const int& x) const { + return x == 0; + } +}; + namespace StreamCompaction { namespace Thrust { using StreamCompaction::Common::PerformanceTimer; @@ -49,5 +57,38 @@ namespace StreamCompaction { cudaFree(dev_odata); checkCUDAError("cudaFree failed!"); } + + int compact(int n, int* odata, const int* idata) + { + int* dev_data; + + cudaMalloc((void**)&dev_data, sizeof(int) * n); + checkCUDAError("cudaMalloc dev_data failed!"); + + cudaMemcpy(dev_data, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + checkCUDAError("memcpy idata to dev_data failed!"); + + thrust::device_ptr dev_thrust_data(dev_data); + + timer().startGpuTimer(); + + + thrust::device_ptr new_end = thrust::remove_if(dev_thrust_data, dev_thrust_data + n, is_zero()); + + + timer().endGpuTimer(); + + // Calculate the number of elements remaining after removal + int compactedCount = new_end - dev_thrust_data; + + cudaMemcpy(odata, dev_data, sizeof(int) * compactedCount, cudaMemcpyDeviceToHost); + checkCUDAError("memcpy dev_data to odata failed!"); + + // Free device memory + cudaFree(dev_data); + checkCUDAError("cudaFree failed!"); + + return compactedCount; + } } } diff --git a/stream_compaction/thrust.h b/stream_compaction/thrust.h index fe98206..d5c82ec 100644 --- a/stream_compaction/thrust.h +++ b/stream_compaction/thrust.h @@ -7,5 +7,7 @@ namespace StreamCompaction { StreamCompaction::Common::PerformanceTimer& timer(); void scan(int n, int *odata, const int *idata); + + int compact(int n, int* odata, const int* idata); } } From 30991c72893e1a1caad519bda6edaa603b7d6d35 Mon Sep 17 00:00:00 2001 From: mrabbitz <54726631+mrabbitz@users.noreply.github.com> Date: Mon, 16 Sep 2024 02:22:24 -0400 Subject: [PATCH 08/16] replacing dividing by 2 with bitwise shifts --- stream_compaction/efficient.cu | 4 ++-- stream_compaction/naive.cu | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 96f7c65..26fa16c 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -77,7 +77,7 @@ namespace StreamCompaction { __syncthreads(); // Downsweep phase - for (int offset = blockSize / 2; offset > 0; offset /= 2) + for (int offset = blockSize >> 1; offset > 0; offset >>= 1) { if ((tx + 1) % (2 * offset) == 0) { @@ -154,7 +154,7 @@ namespace StreamCompaction { cudaMemset(dev_data + bufferLength - 1, 0, sizeof(int)); checkCUDAError("cudaMemset last element in dev_data to 0 failed!"); - for (int offset = bufferLength / 2; offset > 0; offset /= 2) + for (int offset = bufferLength >> 1; offset > 0; offset >>= 1) { kernelDownSweepPass<<>>(bufferLength, offset, dev_data); checkCUDAError("kernelDownSweepPass failed!"); diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 20e240c..3c4a5ac 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -62,15 +62,15 @@ namespace StreamCompaction { int tx = threadIdx.x; - // identify which half of double buffer is read-half and write-half - int writeBuffer = 0; - int readBuffer = 1; - // Load input into shared memory // Only need to write to the first half since our first write will be to the second half shared[tx] = idata[g_index]; __syncthreads(); + // identify which half of double buffer is read-half and write-half + int writeBuffer = 0; + int readBuffer = 1; + for (int offset = 1; offset < blockSize; offset *= 2) { // swap double buffer indices @@ -106,16 +106,16 @@ namespace StreamCompaction { int tx = threadIdx.x; - // identify which half of double buffer is read-half and write-half - int writeBuffer = 0; - int readBuffer = 1; - // Load input into shared memory // Exclusive scan - shift all elements right by one and set first element to 0 // Only need to write to the first half since our first write will be to the second half shared[tx] = (tx > 0) ? idata[g_index - 1] : 0; __syncthreads(); + // identify which half of double buffer is read-half and write-half + int writeBuffer = 0; + int readBuffer = 1; + for (int offset = 1; offset < blockSize; offset *= 2) { // swap double buffer indices From 774513891ae8fab137a689da29e4fe59302e9843 Mon Sep 17 00:00:00 2001 From: mrabbitz <54726631+mrabbitz@users.noreply.github.com> Date: Tue, 17 Sep 2024 22:53:31 -0400 Subject: [PATCH 09/16] optimizations for work-efficient scan, no shared memory and shared memory --- stream_compaction/efficient.cu | 182 ++++++++++++++++++++++----------- stream_compaction/efficient.h | 10 +- stream_compaction/naive.cu | 44 ++++---- stream_compaction/naive.h | 6 +- 4 files changed, 151 insertions(+), 91 deletions(-) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 26fa16c..01907c0 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -12,98 +12,117 @@ namespace StreamCompaction { return timer; } - __global__ void kernelReductionPass(const int bufferLength, const int offset, int* data) + __global__ void kernelReductionPass(const int reqThdsForPass, const int offset, int* data) { int g_index = (blockIdx.x * blockDim.x) + threadIdx.x; - // index out of bounds or not a rhs child node - if ((g_index >= bufferLength) || ((g_index + 1) % (2 * offset) != 0)) + if (g_index >= reqThdsForPass) { return; } - data[g_index] += data[g_index - offset]; + int left_node_g_index = offset * (2 * g_index + 1) - 1; + int right_node_g_index = offset * (2 * g_index + 2) - 1; + + data[right_node_g_index] += data[left_node_g_index]; } - __global__ void kernelDownSweepPass(const int bufferLength, const int offset, int* data) + __global__ void kernelDownSweepPass(const int reqThdsForPass, const int offset, int* data) { int g_index = (blockIdx.x * blockDim.x) + threadIdx.x; - // index out of bounds or not a rhs child node - if ((g_index >= bufferLength) || ((g_index + 1) % (2 * offset) != 0)) + if (g_index >= reqThdsForPass) { return; } - int tmp = data[g_index]; - data[g_index] += data[g_index - offset]; - data[g_index - offset] = tmp; + int left_node_g_index = offset * (2 * g_index + 1) - 1; + int right_node_g_index = offset * (2 * g_index + 2) - 1; + + int temp = data[left_node_g_index]; + data[left_node_g_index] = data[right_node_g_index]; + data[right_node_g_index] += temp; } - __global__ void kernelEfficientExclusivePrefixSumByBlock(const int n, int* data, int* sums) + __global__ void kernelEfficientExclusivePrefixSumByBlock(const int reqThdsPerBlock, int* data, int* blockSums) { + // allocated on invocation + // 2x block size extern __shared__ int shared[]; int tx = threadIdx.x; - int g_index = blockIdx.x * blockDim.x + tx; - // Load input into shared memory - if (g_index < n) + if (tx >= reqThdsPerBlock) { - shared[tx] = data[g_index]; - } - else - { - shared[tx] = 0; + return; } - __syncthreads(); + + int g_index = 2 * ((blockIdx.x * blockDim.x) + tx); + + // Load input into shared memory + shared[2 * tx] = data[g_index]; + shared[2 * tx + 1] = data[g_index + 1]; + + int offset = 1; // Upsweep (Reduction) phase - for (int offset = 1; offset < blockSize; offset *= 2) + for (int reqThdsForPass = reqThdsPerBlock; reqThdsForPass > 0; reqThdsForPass >>= 1) { - if ((tx + 1) % (2 * offset) == 0) + __syncthreads(); + + if (tx < reqThdsForPass) { - shared[tx] += shared[tx - offset]; + int left_node_shrd_index = offset * (2 * tx + 1) - 1; + int right_node_shrd_index = offset * (2 * tx + 2) - 1; + + shared[right_node_shrd_index] += shared[left_node_shrd_index]; } - __syncthreads(); + + offset *= 2; } // Write the block sum and then clear it for the Downsweep - if (tx == blockSize - 1) + if (tx == 0) { - sums[blockIdx.x] = shared[tx]; - shared[tx] = 0; + blockSums[blockIdx.x] = shared[2 * reqThdsPerBlock - 1]; + shared[2 * reqThdsPerBlock - 1] = 0; } - __syncthreads(); // Downsweep phase - for (int offset = blockSize >> 1; offset > 0; offset >>= 1) + for (int reqThdsForPass = 1; reqThdsForPass <= reqThdsPerBlock; reqThdsForPass *= 2) { - if ((tx + 1) % (2 * offset) == 0) + offset >>= 1; + __syncthreads(); + + if (tx < reqThdsForPass) { - int temp = shared[tx]; - shared[tx] += shared[tx - offset]; - shared[tx - offset] = temp; + int left_node_shrd_index = offset * (2 * tx + 1) - 1; + int right_node_shrd_index = offset * (2 * tx + 2) - 1; + + int temp = shared[left_node_shrd_index]; + shared[left_node_shrd_index] = shared[right_node_shrd_index]; + shared[right_node_shrd_index] += temp; } - __syncthreads(); } + __syncthreads(); + // Write the results back to global memory - if (g_index < n) - { - data[g_index] = shared[tx]; - } + data[g_index] = shared[2 * tx]; + data[g_index + 1] = shared[2 * tx + 1]; } - __global__ void kernelAddBlockSumsToBlockData(const int n, const int* idataBlockSums, int* data) + __global__ void kernelAddBlockSumsToBlockData(const int* blockSums, int* data) { - int g_index = blockIdx.x * blockDim.x + threadIdx.x; - if (g_index >= n) - { - return; - } + int g_index = 2 * ((blockIdx.x * blockDim.x) + threadIdx.x); - data[g_index] += idataBlockSums[blockIdx.x]; + // ***** blockSize must be a power of 2 ***** // + // no reason to check bounds because this kernel is only called if we recursively scan, + // meaning the buffer length (of int* data) is going to be (2 * (blockSize)) * (2 to the power of n), + // where n is the depth of recursion. To reiterate the first line, n is always >= 1 + + data[g_index] += blockSums[blockIdx.x]; + data[g_index + 1] += blockSums[blockIdx.x]; } /** @@ -140,23 +159,30 @@ namespace StreamCompaction { checkCUDAError("cudaMemset elements n to bufferLength - 1 in dev_data to 0 failed!"); } - int blocksPerGrid = (bufferLength + blockSize - 1) / blockSize; + int blocksPerGrid = 0; + int offset = 1; if (useGpuTimer) timer().startGpuTimer(); - for (int offset = 1; offset < bufferLength; offset *= 2) + for (int reqThdsForPass = bufferLength >> 1; reqThdsForPass > 0; reqThdsForPass >>= 1) { - kernelReductionPass<<>>(bufferLength, offset, dev_data); + blocksPerGrid = (reqThdsForPass + blockSize - 1) / blockSize; + kernelReductionPass<<>>(reqThdsForPass, offset, dev_data); checkCUDAError("kernelReductionPass failed!"); + + offset *= 2; } cudaMemset(dev_data + bufferLength - 1, 0, sizeof(int)); checkCUDAError("cudaMemset last element in dev_data to 0 failed!"); - for (int offset = bufferLength >> 1; offset > 0; offset >>= 1) + for (int reqThdsForPass = 1; reqThdsForPass < bufferLength; reqThdsForPass *= 2) { - kernelDownSweepPass<<>>(bufferLength, offset, dev_data); + offset >>= 1; + + blocksPerGrid = (reqThdsForPass + blockSize - 1) / blockSize; + kernelDownSweepPass<<>>(reqThdsForPass, offset, dev_data); checkCUDAError("kernelDownSweepPass failed!"); } @@ -172,12 +198,15 @@ namespace StreamCompaction { void efficientExclusivePrefixSumSharedMemory(const bool useGpuTimer, const int n, const int* idata, int* odata) { - int blocksPerGrid = (n + blockSize - 1) / blockSize; + int totalPasses = ilog2ceil(n); + int bufferLength = 1 << totalPasses; + int reqThdsTotal = bufferLength >> 1; + int blocksPerGrid = (reqThdsTotal + blockSize - 1) / blockSize; int* dev_data; int* dev_sums; - cudaMalloc((void**)&dev_data, sizeof(int) * n); + cudaMalloc((void**)&dev_data, sizeof(int) * bufferLength); checkCUDAError("cudaMalloc dev_data failed!"); cudaMalloc((void**)&dev_sums, sizeof(int) * blocksPerGrid); @@ -186,12 +215,19 @@ namespace StreamCompaction { cudaMemcpy(dev_data, idata, sizeof(int) * n, cudaMemcpyHostToDevice); checkCUDAError("memcpy idata to dev_data failed!"); - int sharedMemoryBytes = blockSize * sizeof(int); + if (bufferLength > n) + { + cudaMemset(dev_data + n, 0, sizeof(int) * (bufferLength - n)); + checkCUDAError("cudaMemset elements n to bufferLength - 1 in dev_data to 0 failed!"); + } - if (useGpuTimer) timer().startGpuTimer(); + int reqThdsPerBlock = std::min(reqThdsTotal, blockSize); + int sharedMemoryBytes = 2 * reqThdsPerBlock * sizeof(int); + if (useGpuTimer) timer().startGpuTimer(); - efficientExclusivePrefixSumAnyNumberOfBlocks(sharedMemoryBytes, n, blocksPerGrid, dev_data, dev_sums); + + efficientExclusivePrefixSumAnyNumberOfBlocks(sharedMemoryBytes, reqThdsPerBlock, blocksPerGrid, dev_data, dev_sums); if (useGpuTimer) timer().endGpuTimer(); @@ -206,26 +242,48 @@ namespace StreamCompaction { // iterative approach is possible // for the sake of submitting this assignement on time, this will have to be explored at a later time - void efficientExclusivePrefixSumAnyNumberOfBlocks(const int sharedMemoryBytes, const int n, const int numBlocks, int* data, int* sums) + void efficientExclusivePrefixSumAnyNumberOfBlocks(const int sharedMemoryBytes, const int reqThdsPerBlock, const int blocksPerGrid, int* data, int* blockSums) { - kernelEfficientExclusivePrefixSumByBlock<<>>(n, data, sums); + kernelEfficientExclusivePrefixSumByBlock<<>>(reqThdsPerBlock, data, blockSums); checkCUDAError("kernelEfficientExclusivePrefixSumByBlock failed!"); - if (numBlocks > 1) + if (blocksPerGrid > 1) { - int numBlocksForBlockSums = (numBlocks + blockSize - 1) / blockSize; + int n_blockSums = blocksPerGrid; + + int totalPasses_blockSums = ilog2ceil(n_blockSums); + int bufferLength_blockSums = 1 << totalPasses_blockSums; + int reqThdsTotal_blockSums = bufferLength_blockSums >> 1; + int blocksPerGrid_blockSums = (reqThdsTotal_blockSums + blockSize - 1) / blockSize; int* dev_sums; + int* dev_new_sums; - cudaMalloc((void**)&dev_sums, sizeof(int) * numBlocksForBlockSums); + cudaMalloc((void**)&dev_sums, sizeof(int) * bufferLength_blockSums); checkCUDAError("cudaMalloc dev_sums failed!"); - efficientExclusivePrefixSumAnyNumberOfBlocks(sharedMemoryBytes, numBlocks, numBlocksForBlockSums, sums, dev_sums); + cudaMalloc((void**)&dev_new_sums, sizeof(int) * blocksPerGrid_blockSums); + checkCUDAError("cudaMalloc dev_new_sums failed!"); + + cudaMemcpy(dev_sums, blockSums, sizeof(int) * n_blockSums, cudaMemcpyDeviceToDevice); + checkCUDAError("memcpy blockSums to dev_sums failed!"); + + if (bufferLength_blockSums > n_blockSums) + { + cudaMemset(dev_sums + n_blockSums, 0, sizeof(int) * (bufferLength_blockSums - n_blockSums)); + checkCUDAError("cudaMemset elements n_blockSums to bufferLength_blockSums - 1 in dev_sums to 0 failed!"); + } + + int reqThdsPerBlock_blockSums = std::min(reqThdsTotal_blockSums, blockSize); + int sharedMemoryBytes_blockSums = 2 * reqThdsPerBlock_blockSums * sizeof(int); + + efficientExclusivePrefixSumAnyNumberOfBlocks(sharedMemoryBytes_blockSums, reqThdsPerBlock_blockSums, blocksPerGrid_blockSums, dev_sums, dev_new_sums); - kernelAddBlockSumsToBlockData<<>>(n, sums, data); + kernelAddBlockSumsToBlockData<<>>(dev_sums, data); checkCUDAError("kernelAddBlockSumsToBlockData failed!"); cudaFree(dev_sums); + cudaFree(dev_new_sums); checkCUDAError("cudaFree failed!"); } } diff --git a/stream_compaction/efficient.h b/stream_compaction/efficient.h index 089c5e0..0de9d06 100644 --- a/stream_compaction/efficient.h +++ b/stream_compaction/efficient.h @@ -6,13 +6,13 @@ namespace StreamCompaction { namespace Efficient { StreamCompaction::Common::PerformanceTimer& timer(); - __global__ void kernelReductionPass(const int bufferLength, const int offset, int* data); + __global__ void kernelReductionPass(const int reqThdsForPass, const int offset, int* data); - __global__ void kernelDownSweepPass(const int bufferLength, const int offset, int* data); + __global__ void kernelDownSweepPass(const int reqThdsForPass, const int offset, int* data); - __global__ void kernelEfficientExclusivePrefixSumByBlock(const int n, int* data, int* sums); + __global__ void kernelEfficientExclusivePrefixSumByBlock(const int reqThdsPerBlock, int* data, int* blockSums); - __global__ void kernelAddBlockSumsToBlockData(const int n, const int* idataBlockSums, int* data); + __global__ void kernelAddBlockSumsToBlockData(const int* blockSums, int* data); void scan(int n, int* odata, const int* idata, bool useSharedMemory); @@ -20,7 +20,7 @@ namespace StreamCompaction { void efficientExclusivePrefixSumSharedMemory(const bool useGpuTimer, const int n, const int* idata, int* odata); - void efficientExclusivePrefixSumAnyNumberOfBlocks(const int sharedMemoryBytes, const int n, const int numBlocks, int* data, int* sums); + void efficientExclusivePrefixSumAnyNumberOfBlocks(const int sharedMemoryBytes, const int reqThdsPerBlock, const int blocksPerGrid, int* data, int* blockSums); int compact(int n, int* odata, const int* idata, bool useSharedMemory); } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 3c4a5ac..2331673 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -40,7 +40,7 @@ namespace StreamCompaction { if (g_index >= offset) { - odata[g_index] = idata[g_index - offset] + idata[g_index]; + odata[g_index] = idata[g_index] + idata[g_index - offset]; } else { @@ -79,7 +79,7 @@ namespace StreamCompaction { if (tx >= offset) { - shared[writeBuffer * blockSize + tx] = shared[readBuffer * blockSize + tx - offset] + shared[readBuffer * blockSize + tx]; + shared[writeBuffer * blockSize + tx] = shared[readBuffer * blockSize + tx] + shared[readBuffer * blockSize + tx - offset]; } else { @@ -124,7 +124,7 @@ namespace StreamCompaction { if (tx >= offset) { - shared[writeBuffer * blockSize + tx] = shared[readBuffer * blockSize + tx - offset] + shared[readBuffer * blockSize + tx]; + shared[writeBuffer * blockSize + tx] = shared[readBuffer * blockSize + tx] + shared[readBuffer * blockSize + tx - offset]; } else { @@ -137,18 +137,18 @@ namespace StreamCompaction { odata[g_index] = shared[writeBuffer * blockSize + tx]; } - __global__ void kernelExtractBlockSums(const int n, const int numBlocks, const int* idata, int* odata) + __global__ void kernelExtractBlockSums(const int n, const int n_blockSums, const int* idata, int* odata) { int g_index = blockIdx.x * blockDim.x + threadIdx.x; - if (g_index >= numBlocks) + if (g_index >= n_blockSums) { return; } - odata[g_index] = g_index == numBlocks - 1 ? idata[n - 1] : idata[(g_index * blockSize) + blockSize - 1]; + odata[g_index] = g_index == n_blockSums - 1 ? idata[n - 1] : idata[(g_index * blockSize) + blockSize - 1]; } - __global__ void kernelAddBlockSumsToBlockData(const int n, const int* idataBlockSums, int* data) + __global__ void kernelAddBlockSumsToBlockData(const int n, const int* blockSums, int* data) { int g_index = blockIdx.x * blockDim.x + threadIdx.x; if (g_index >= n) @@ -156,7 +156,7 @@ namespace StreamCompaction { return; } - data[g_index] += idataBlockSums[blockIdx.x]; + data[g_index] += blockSums[blockIdx.x]; } /** @@ -255,43 +255,45 @@ namespace StreamCompaction { // iterative approach is possible if the blockSums buffers are allocated carefully ahead of time, combined with clever indexing of them at each iteration // for the sake of submitting this assignement on time, this will have to be explored at a later time - void naiveInclusivePrefixSumAnyNumberOfBlocks(const int sharedMemoryBytes, const int n, const int numBlocks, int* idata, int* odata) + void naiveInclusivePrefixSumAnyNumberOfBlocks(const int sharedMemoryBytes, const int n, const int blocksPerGrid, int* idata, int* odata) { - kernelNaiveInclusivePrefixSumByBlock<<>>(n, idata, odata); + kernelNaiveInclusivePrefixSumByBlock<<>>(n, idata, odata); checkCUDAError("kernelNaiveInclusivePrefixSumByBlock failed!"); - if (numBlocks > 1) + if (blocksPerGrid > 1) { + int n_blockSums = blocksPerGrid; + int* dev_bufferBlockSumsA; int* dev_bufferBlockSumsB; - cudaMalloc((void**)&dev_bufferBlockSumsA, sizeof(int) * numBlocks); + cudaMalloc((void**)&dev_bufferBlockSumsA, sizeof(int) * n_blockSums); checkCUDAError("cudaMalloc dev_bufferBlockSumsA failed!"); - cudaMalloc((void**)&dev_bufferBlockSumsB, sizeof(int) * numBlocks); + cudaMalloc((void**)&dev_bufferBlockSumsB, sizeof(int) * n_blockSums); checkCUDAError("cudaMalloc dev_bufferBlockSumsB failed!"); - int numBlocksForBlockSums = (numBlocks + blockSize - 1) / blockSize; + int blocksPerGrid_blockSums = (n_blockSums + blockSize - 1) / blockSize; - kernelExtractBlockSums<<>>(n, numBlocks, odata, dev_bufferBlockSumsA); + kernelExtractBlockSums<<>>(n, n_blockSums, odata, dev_bufferBlockSumsA); checkCUDAError("kernelExtractBlockSums failed!"); - if (numBlocksForBlockSums > 1) + if (blocksPerGrid_blockSums > 1) { - naiveInclusivePrefixSumAnyNumberOfBlocks(sharedMemoryBytes, numBlocks, numBlocksForBlockSums, dev_bufferBlockSumsA, dev_bufferBlockSumsB); + naiveInclusivePrefixSumAnyNumberOfBlocks(sharedMemoryBytes, n_blockSums, blocksPerGrid_blockSums, dev_bufferBlockSumsA, dev_bufferBlockSumsB); - kernelInclusiveToExclusivePrefixSum<<>>(numBlocks, dev_bufferBlockSumsB, dev_bufferBlockSumsA); + kernelInclusiveToExclusivePrefixSum<<>>(n_blockSums, dev_bufferBlockSumsB, dev_bufferBlockSumsA); checkCUDAError("kernelInclusiveToExclusivePrefixSum failed!"); - kernelAddBlockSumsToBlockData<<>>(n, dev_bufferBlockSumsA, odata); + kernelAddBlockSumsToBlockData<<>>(n, dev_bufferBlockSumsA, odata); checkCUDAError("kernelAddBlockSumsToBlockData failed!"); } else { - kernelNaiveExclusivePrefixSumByBlock<<>>(numBlocks, dev_bufferBlockSumsA, dev_bufferBlockSumsB); + kernelNaiveExclusivePrefixSumByBlock<<>>(n_blockSums, dev_bufferBlockSumsA, dev_bufferBlockSumsB); checkCUDAError("kernelNaiveExclusivePrefixSumByBlock failed!"); - kernelAddBlockSumsToBlockData<<>>(n, dev_bufferBlockSumsB, odata); + kernelAddBlockSumsToBlockData<<>>(n, dev_bufferBlockSumsB, odata); checkCUDAError("kernelAddBlockSumsToBlockData failed!"); } diff --git a/stream_compaction/naive.h b/stream_compaction/naive.h index 84fe093..c447ce2 100644 --- a/stream_compaction/naive.h +++ b/stream_compaction/naive.h @@ -14,9 +14,9 @@ namespace StreamCompaction { __global__ void kernelNaiveExclusivePrefixSumByBlock(const int n, const int* idata, int* odata); - __global__ void kernelExtractBlockSums(const int n, const int numBlocks, const int* idata, int* odata); + __global__ void kernelExtractBlockSums(const int n, const int n_blockSums, const int* idata, int* odata); - __global__ void kernelAddBlockSumsToBlockData(const int n, const int* idataBlockSums, int* data); + __global__ void kernelAddBlockSumsToBlockData(const int n, const int* blockSums, int* data); void scan(int n, int* odata, const int* idata, bool useSharedMemory); @@ -24,6 +24,6 @@ namespace StreamCompaction { void naiveExclusivePrefixSumSharedMemory(const int n, const int* idata, int* odata); - void naiveInclusivePrefixSumAnyNumberOfBlocks(const int sharedMemoryBytes, const int n, const int numBlocks, int* idata, int* odata); + void naiveInclusivePrefixSumAnyNumberOfBlocks(const int sharedMemoryBytes, const int n, const int blocksPerGrid, int* idata, int* odata); } } From 511b81d836e86878df8b7b83e4675a7a5b774baf Mon Sep 17 00:00:00 2001 From: mrabbitz <54726631+mrabbitz@users.noreply.github.com> Date: Tue, 17 Sep 2024 23:46:12 -0400 Subject: [PATCH 10/16] eliminate bank conflicts from work-efficient scan shared mem impl --- stream_compaction/efficient.cu | 44 +++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 01907c0..2e0808e 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -3,6 +3,15 @@ #include "common.h" #include "efficient.h" +#define NUM_BANKS 32 +#define LOG_NUM_BANKS 5 +#ifdef ZERO_BANK_CONFLICTS +#define CONFLICT_FREE_OFFSET(n) \ + ((n) >> (LOG_NUM_BANKS) + (n) >> (2 * LOG_NUM_BANKS)) +#else +#define CONFLICT_FREE_OFFSET(n) ((n) >> LOG_NUM_BANKS) +#endif + namespace StreamCompaction { namespace Efficient { using StreamCompaction::Common::PerformanceTimer; @@ -57,11 +66,19 @@ namespace StreamCompaction { return; } - int g_index = 2 * ((blockIdx.x * blockDim.x) + tx); + int g_index = 2 * (blockIdx.x * blockDim.x) + tx; + + int ai = tx; + int bi = tx + reqThdsPerBlock; + int g_ai = g_index; + int g_bi = g_index + reqThdsPerBlock; + + int bankOffsetA = CONFLICT_FREE_OFFSET(ai); + int bankOffsetB = CONFLICT_FREE_OFFSET(bi); // Load input into shared memory - shared[2 * tx] = data[g_index]; - shared[2 * tx + 1] = data[g_index + 1]; + shared[ai + bankOffsetA] = data[g_ai]; + shared[bi + bankOffsetB] = data[g_bi]; int offset = 1; @@ -74,6 +91,8 @@ namespace StreamCompaction { { int left_node_shrd_index = offset * (2 * tx + 1) - 1; int right_node_shrd_index = offset * (2 * tx + 2) - 1; + left_node_shrd_index += CONFLICT_FREE_OFFSET(left_node_shrd_index); + right_node_shrd_index += CONFLICT_FREE_OFFSET(right_node_shrd_index); shared[right_node_shrd_index] += shared[left_node_shrd_index]; } @@ -84,8 +103,11 @@ namespace StreamCompaction { // Write the block sum and then clear it for the Downsweep if (tx == 0) { - blockSums[blockIdx.x] = shared[2 * reqThdsPerBlock - 1]; - shared[2 * reqThdsPerBlock - 1] = 0; + int n_minus_1 = 2 * reqThdsPerBlock - 1; + n_minus_1 += CONFLICT_FREE_OFFSET(n_minus_1); + + blockSums[blockIdx.x] = shared[n_minus_1]; + shared[n_minus_1] = 0; } // Downsweep phase @@ -98,6 +120,8 @@ namespace StreamCompaction { { int left_node_shrd_index = offset * (2 * tx + 1) - 1; int right_node_shrd_index = offset * (2 * tx + 2) - 1; + left_node_shrd_index += CONFLICT_FREE_OFFSET(left_node_shrd_index); + right_node_shrd_index += CONFLICT_FREE_OFFSET(right_node_shrd_index); int temp = shared[left_node_shrd_index]; shared[left_node_shrd_index] = shared[right_node_shrd_index]; @@ -108,8 +132,8 @@ namespace StreamCompaction { __syncthreads(); // Write the results back to global memory - data[g_index] = shared[2 * tx]; - data[g_index + 1] = shared[2 * tx + 1]; + data[g_ai] = shared[ai + bankOffsetA]; + data[g_bi] = shared[bi + bankOffsetB]; } __global__ void kernelAddBlockSumsToBlockData(const int* blockSums, int* data) @@ -222,7 +246,8 @@ namespace StreamCompaction { } int reqThdsPerBlock = std::min(reqThdsTotal, blockSize); - int sharedMemoryBytes = 2 * reqThdsPerBlock * sizeof(int); + int procElemsPerBlock = 2 * reqThdsPerBlock; + int sharedMemoryBytes = sizeof(int) * (procElemsPerBlock + (procElemsPerBlock / NUM_BANKS) + (procElemsPerBlock / (NUM_BANKS * NUM_BANKS))); if (useGpuTimer) timer().startGpuTimer(); @@ -275,7 +300,8 @@ namespace StreamCompaction { } int reqThdsPerBlock_blockSums = std::min(reqThdsTotal_blockSums, blockSize); - int sharedMemoryBytes_blockSums = 2 * reqThdsPerBlock_blockSums * sizeof(int); + int procElemsPerBlock_blockSums = 2 * reqThdsPerBlock_blockSums; + int sharedMemoryBytes_blockSums = sizeof(int) * (procElemsPerBlock_blockSums + (procElemsPerBlock_blockSums / NUM_BANKS) + (procElemsPerBlock_blockSums / (NUM_BANKS * NUM_BANKS))); efficientExclusivePrefixSumAnyNumberOfBlocks(sharedMemoryBytes_blockSums, reqThdsPerBlock_blockSums, blocksPerGrid_blockSums, dev_sums, dev_new_sums); From e67b65ae81a93011d2affe36e077e6872058c002 Mon Sep 17 00:00:00 2001 From: mrabbitz <54726631+mrabbitz@users.noreply.github.com> Date: Wed, 18 Sep 2024 03:20:18 -0400 Subject: [PATCH 11/16] removing an outdated comment --- stream_compaction/efficient.cu | 1 - 1 file changed, 1 deletion(-) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 2e0808e..ccb33c5 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -56,7 +56,6 @@ namespace StreamCompaction { __global__ void kernelEfficientExclusivePrefixSumByBlock(const int reqThdsPerBlock, int* data, int* blockSums) { // allocated on invocation - // 2x block size extern __shared__ int shared[]; int tx = threadIdx.x; From 422ea510e18945d99fc83a12f4067cb96f7c7006 Mon Sep 17 00:00:00 2001 From: mrabbitz <54726631+mrabbitz@users.noreply.github.com> Date: Wed, 18 Sep 2024 19:40:29 -0400 Subject: [PATCH 12/16] modified test code - for each test, run it N times, store the N runtime results, and display the average of the runtimes --- src/main.cpp | 376 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 289 insertions(+), 87 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 7692a43..ec5a484 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,12 +13,33 @@ #include #include "testing_helpers.hpp" +const bool runXNumTestsAndGetAverage = false; +const int numTests = 10; +int testCount = 0; +float testResults[numTests]; + 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]; int *c = new int[SIZE]; +void printAverageOfTestsAndResetTestCount(bool ranOnGPU) +{ + float average = 0.f; + for (int i = 0; i < numTests; ++i) + { + average += testResults[i]; + } + average /= numTests; + + std::cout << "Average Runtime of " << numTests << " runs: "; + printElapsedTime(average, ranOnGPU ? "(CUDA Measured)" : "(std::chrono Measured)"); + std::cout << std::endl; + + testCount = 0; +} + int main(int argc, char* argv[]) { // Scan tests @@ -34,94 +55,275 @@ 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); - - zeroArray(SIZE, c); - printDesc("naive scan, power-of-two, no shared memory"); - StreamCompaction::Naive::scan(SIZE, c, a, false); - printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //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, no shared memory"); - StreamCompaction::Naive::scan(NPOT, c, a, false); - printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); - printCmpResult(NPOT, b, c); - - zeroArray(SIZE, c); - printDesc("naive scan, power-of-two, shared memory"); - StreamCompaction::Naive::scan(SIZE, c, a, true); - printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); - printCmpResult(SIZE, b, c); - - zeroArray(SIZE, c); - printDesc("naive scan, non-power-of-two, shared memory"); - StreamCompaction::Naive::scan(NPOT, c, a, true); - printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); - printCmpResult(NPOT, b, c); - zeroArray(SIZE, c); - printDesc("work-efficient scan, power-of-two, no shared memory"); - StreamCompaction::Efficient::scan(SIZE, c, a, false); - printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); - printCmpResult(SIZE, b, c); - - zeroArray(SIZE, c); - printDesc("work-efficient scan, non-power-of-two, no shared memory"); - StreamCompaction::Efficient::scan(NPOT, c, a, false); - printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(NPOT, c, true); - printCmpResult(NPOT, b, c); - - zeroArray(SIZE, c); - printDesc("work-efficient scan, power-of-two, shared memory"); - StreamCompaction::Efficient::scan(SIZE, c, a, true); - printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); - printCmpResult(SIZE, b, c); - - zeroArray(SIZE, c); - printDesc("work-efficient scan, non-power-of-two, shared memory"); - StreamCompaction::Efficient::scan(NPOT, c, a, true); - printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //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); - 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); + do + { + zeroArray(SIZE, b); + if (testCount == 0) + { + printDesc("cpu scan, power-of-two"); + } + StreamCompaction::CPU::scan(SIZE, b, a); + testResults[testCount] = StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(); + if (testCount == 0) + { + printArray(SIZE, b, true); + } + printElapsedTime(testResults[testCount], "(std::chrono Measured)"); + } while (runXNumTestsAndGetAverage && ++testCount < numTests); + + if (runXNumTestsAndGetAverage) + { + printAverageOfTestsAndResetTestCount(false); + } + + do + { + zeroArray(SIZE, c); + if (testCount == 0) + { + printDesc("cpu scan, non-power-of-two"); + } + StreamCompaction::CPU::scan(NPOT, c, a); + testResults[testCount] = StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(); + if (testCount == 0) + { + printArray(NPOT, c, true); + } + printElapsedTime(testResults[testCount], "(std::chrono Measured)"); + printCmpResult(NPOT, b, c); + } while (runXNumTestsAndGetAverage && ++testCount < numTests); + + if (runXNumTestsAndGetAverage) + { + printAverageOfTestsAndResetTestCount(false); + } + + do + { + zeroArray(SIZE, c); + if (testCount == 0) + { + printDesc("naive scan, power-of-two, no shared memory"); + } + StreamCompaction::Naive::scan(SIZE, c, a, false); + testResults[testCount] = StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(); + if (testCount == 0) + { + //printArray(SIZE, c, true); + } + printElapsedTime(testResults[testCount], "(CUDA Measured)"); + printCmpResult(SIZE, b, c); + } while (runXNumTestsAndGetAverage && ++testCount < numTests); + + if (runXNumTestsAndGetAverage) + { + printAverageOfTestsAndResetTestCount(true); + } + + /* 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); */ + + do + { + zeroArray(SIZE, c); + if (testCount == 0) + { + printDesc("naive scan, non-power-of-two, no shared memory"); + } + StreamCompaction::Naive::scan(NPOT, c, a, false); + testResults[testCount] = StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(); + if (testCount == 0) + { + //printArray(NPOT, c, true); + } + printElapsedTime(testResults[testCount], "(CUDA Measured)"); + printCmpResult(NPOT, b, c); + } while (runXNumTestsAndGetAverage && ++testCount < numTests); + + if (runXNumTestsAndGetAverage) + { + printAverageOfTestsAndResetTestCount(true); + } + + do + { + zeroArray(SIZE, c); + if (testCount == 0) + { + printDesc("naive scan, power-of-two, shared memory"); + } + StreamCompaction::Naive::scan(SIZE, c, a, true); + testResults[testCount] = StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(); + if (testCount == 0) + { + //printArray(SIZE, c, true); + } + printElapsedTime(testResults[testCount], "(CUDA Measured)"); + printCmpResult(SIZE, b, c); + } while (runXNumTestsAndGetAverage && ++testCount < numTests); + + if (runXNumTestsAndGetAverage) + { + printAverageOfTestsAndResetTestCount(true); + } + + do + { + zeroArray(SIZE, c); + if (testCount == 0) + { + printDesc("naive scan, non-power-of-two, shared memory"); + } + StreamCompaction::Naive::scan(NPOT, c, a, true); + testResults[testCount] = StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(); + if (testCount == 0) + { + //printArray(NPOT, c, true); + } + printElapsedTime(testResults[testCount], "(CUDA Measured)"); + printCmpResult(NPOT, b, c); + } while (runXNumTestsAndGetAverage && ++testCount < numTests); + + if (runXNumTestsAndGetAverage) + { + printAverageOfTestsAndResetTestCount(true); + } + + do + { + zeroArray(SIZE, c); + if (testCount == 0) + { + printDesc("work-efficient scan, power-of-two, no shared memory"); + } + StreamCompaction::Efficient::scan(SIZE, c, a, false); + testResults[testCount] = StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(); + if (testCount == 0) + { + //printArray(SIZE, c, true); + } + printElapsedTime(testResults[testCount], "(CUDA Measured)"); + printCmpResult(SIZE, b, c); + } while (runXNumTestsAndGetAverage && ++testCount < numTests); + + if (runXNumTestsAndGetAverage) + { + printAverageOfTestsAndResetTestCount(true); + } + + do + { + zeroArray(SIZE, c); + if (testCount == 0) + { + printDesc("work-efficient scan, non-power-of-two, no shared memory"); + } + StreamCompaction::Efficient::scan(NPOT, c, a, false); + testResults[testCount] = StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(); + if (testCount == 0) + { + //printArray(NPOT, c, true); + } + printElapsedTime(testResults[testCount], "(CUDA Measured)"); + printCmpResult(NPOT, b, c); + } while (runXNumTestsAndGetAverage && ++testCount < numTests); + + if (runXNumTestsAndGetAverage) + { + printAverageOfTestsAndResetTestCount(true); + } + + do + { + zeroArray(SIZE, c); + if (testCount == 0) + { + printDesc("work-efficient scan, power-of-two, shared memory"); + } + StreamCompaction::Efficient::scan(SIZE, c, a, true); + testResults[testCount] = StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(); + if (testCount == 0) + { + //printArray(SIZE, c, true); + } + printElapsedTime(testResults[testCount], "(CUDA Measured)"); + printCmpResult(SIZE, b, c); + } while (runXNumTestsAndGetAverage && ++testCount < numTests); + + if (runXNumTestsAndGetAverage) + { + printAverageOfTestsAndResetTestCount(true); + } + + do + { + zeroArray(SIZE, c); + if (testCount == 0) + { + printDesc("work-efficient scan, non-power-of-two, shared memory"); + } + StreamCompaction::Efficient::scan(NPOT, c, a, true); + testResults[testCount] = StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(); + if (testCount == 0) + { + //printArray(NPOT, c, true); + } + printElapsedTime(testResults[testCount], "(CUDA Measured)"); + printCmpResult(NPOT, b, c); + } while (runXNumTestsAndGetAverage && ++testCount < numTests); + + if (runXNumTestsAndGetAverage) + { + printAverageOfTestsAndResetTestCount(true); + } + + do + { + zeroArray(SIZE, c); + if (testCount == 0) + { + printDesc("thrust scan, power-of-two"); + } + StreamCompaction::Thrust::scan(SIZE, c, a); + testResults[testCount] = StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(); + if (testCount == 0) + { + //printArray(SIZE, c, true); + } + printElapsedTime(testResults[testCount], "(CUDA Measured)"); + printCmpResult(SIZE, b, c); + } while (runXNumTestsAndGetAverage && ++testCount < numTests); + + if (runXNumTestsAndGetAverage) + { + printAverageOfTestsAndResetTestCount(true); + } + + do + { + zeroArray(SIZE, c); + if (testCount == 0) + { + printDesc("thrust scan, non-power-of-two"); + } + StreamCompaction::Thrust::scan(NPOT, c, a); + testResults[testCount] = StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(); + if (testCount == 0) + { + //printArray(NPOT, c, true); + } + printElapsedTime(testResults[testCount], "(CUDA Measured)"); + printCmpResult(NPOT, b, c); + } while (runXNumTestsAndGetAverage && ++testCount < numTests); + + if (runXNumTestsAndGetAverage) + { + printAverageOfTestsAndResetTestCount(true); + } printf("\n"); printf("*****************************\n"); From 5d47a27cd5627d08e490b65cc488c857a38fb8a5 Mon Sep 17 00:00:00 2001 From: mrabbitz <54726631+mrabbitz@users.noreply.github.com> Date: Wed, 18 Sep 2024 23:58:48 -0400 Subject: [PATCH 13/16] updating README (#5) * Update README.md * Update README.md * Update README.md * uploading images * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * upload images * Update README.md * Update README.md * Update README.md * Update README.md * update images * Update README.md * update images * update image * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * upload image * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * readme charts * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * images * Update README.md * Update README.md * Update README.md --- README.md | 213 +++++++++++++++++++++- img/compaction_with_scan.PNG | Bin 0 -> 17865 bytes img/gpu_excluisve_efficient_downsweep.PNG | Bin 0 -> 18381 bytes img/gpu_exclusive_efficient_upsweep.PNG | Bin 0 -> 11643 bytes img/gpu_inclusive_naive.PNG | Bin 0 -> 15855 bytes img/runtime_vs_arraysize.png | Bin 0 -> 169990 bytes img/runtime_vs_blocksize.png | Bin 0 -> 130776 bytes img/scan_visual.PNG | Bin 0 -> 15037 bytes img/stream_compaction_visual.PNG | Bin 0 -> 8555 bytes 9 files changed, 207 insertions(+), 6 deletions(-) create mode 100644 img/compaction_with_scan.PNG create mode 100644 img/gpu_excluisve_efficient_downsweep.PNG create mode 100644 img/gpu_exclusive_efficient_upsweep.PNG create mode 100644 img/gpu_inclusive_naive.PNG create mode 100644 img/runtime_vs_arraysize.png create mode 100644 img/runtime_vs_blocksize.png create mode 100644 img/scan_visual.PNG create mode 100644 img/stream_compaction_visual.PNG diff --git a/README.md b/README.md index 0e38ddb..b031049 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,213 @@ 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) +* Michael Rabbitz + * [LinkedIn](https://www.linkedin.com/in/mike-rabbitz) +* Tested on: Windows 10, i7-9750H @ 2.60GHz 32GB, RTX 2060 6GB (Personal) -### (TODO: Your README) +## Part 1: 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 focuses on implementing various Stream Compaction algorithms, including those utilizing the Scan algorithm, to emphasize the importance of designing GPU hardware-optimized algorithms that leverage parallel computation for superior performance compared to CPU implementations. +### Stream Compaction +Stream compaction involves filtering an input data set to produce a new collection that contains only the elements meeting a specified condition, while preserving their original order. This process reduces the size of the data set by removing unwanted elements, which is crucial for optimizing performance and memory usage in applications like path tracing, collision detection, etc. + +

+ +

+ +### Scan +The Scan algorithm, also known as the all-prefix-sums operation, computes prefix sums for an array of data. In an exclusive scan, each element in the result is the sum of all preceding elements in the input array. Conversely, an inclusive scan includes the current element in the sum. Scan algorithms are fundamental in parallel computing for tasks like sorting, stream compaction, and building data structures, as they transform inherently sequential computations into parallel ones. + +

+ +

+ +## Part 2: Implementation Details + +**n represents the number of elements in the array** + +**All implementations support arrays of arbitrary n - small, large, powers of two, not powers of two** + +### Scan +#### Implementations +1. **CPU:** O(n) addition operations - sequential loop over array elements, accumulating a sum at each iteration +2. **GPU Naive Algorithm:** O(n * log2(n)) addition operations - over log2(n) passes, for pass p starting at p = 1, compute the partial sums of n - 2p - 1 elements in parallel +3. **GPU Work-Efficient Algorithm:** O(n) operations - performs scan into two phases: parallel upsweep (reduction) with n - 1 adds (O(n)), and parallel downsweep with n - 1 adds (O(n)) and n - 1 swaps (O(n)) +4. **GPU Naive Algorithm with Hardware Efficiency:** shared memory - divide the array into evenly-sized blocks, each of which is scanned by a single thread block. Utilize shared memory within each thread block to perform the scan and write the total sum of each block to a separate array of block sums. Then, scan the array of block sums to create an array of block increments, which are added to all elements within their respective blocks. +5. **GPU Work-Efficient Algorithm with Hardware Efficiency:** shared memory - same process as above +6. **GPU using [Thrust CUDA library](https://nvidia.github.io/cccl/thrust):** wrapper function using thrust::exclusive_scan + +#### Inclusive Scan - GPU Naive Algorithm: +

+ +

+ +#### Exclusive Scan - GPU Work-Efficient Algorithm: +**Upsweep** +

+ +

+ +**Downsweep** +

+ +

+ +### Stream Compaction +**Compaction removes invalid elements (0s) from an array of randomized ints** + +#### Stream Compaction with Scan is described in 3 steps: +1. **Create Binary Map:** use the input array to create a binary map array indicating the validity of each input element +2. **Scan:** perform Scan on the binary array to generate a map of index values which correspond to the compacted array index of sequential valid input elements +3. **Scatter:** for the indices of the binary array that indicate valid input elements, use those indices to index the Scan output array to determine the compated array index of the valid element, then place valid element data into the compacted array + +

+ +

+ +#### Implementations +1. **CPU without Scan:** - sequential loop over input elements while placing valid input data into the compacted array +2. **CPU with Scan:** - perform Step 1 with sequential loop over n elements, perform Step 2 using CPU Scan, then perform Step 3 with sequential loop over n elements +3. **GPU with Work-Efficient Scan:** - perform Step 1 over n elements in one parallel pass, perform Step 2 using Work-Efficient Scan, then perform Step 3 over n elements in one parallel pass +4. **GPU with Work-Efficient and Hardware-Efficient Scan:** - same as above line except using Work-Efficient and Hardware-Efficient Scan +5. **GPU using [Thrust CUDA library](https://nvidia.github.io/cccl/thrust):** wrapper function using thrust::remove_if + +## Part 3: Performance Analysis +### Optimal Block Size +**For each GPU Scan implementation, find the block size that gives the minimal runtime on the GPU** + +**Each data point is the average of 100 runtime samples** +

+ +

+ +| Block Size | Naive (ms) | Naive & Hardware-Eff (ms) | Work-Eff | Work-Eff & Hardware-Eff | +| ---------- | ---------- | ------------------------- | -------- | ----------------------- | +|32 |191.8 |24 |47.6 |13.1 | +|64 |116.9 |14.4 |47.9 |9.7 | +|128 |116.8 |13.8 |47.4 |9.3 | +|256 |116.8 |14 |47.8 |9.6 | +|512 |116.8 |14.4 |48.3 |10.5 | +|1024 |118.1 |16.6 |50.4 |12.4 | + +Based on the results, it is clear that block size of 128 is optimal. + +### Runtime +**Includes the CPU Scan implementation, all GPU Scan implementations, and the Thrust Scan** + +**Each data point is the average of 100 runtime samples** +

+ +

+ +| Array Size | CPU (ms) | Naive (ms) | Naive & Hardware-Eff (ms) | Work-Eff | Work-Eff & Hardware-Eff | Thrust (ms) | +| ------------ | -------- |------------ | -------------------------- | --------- | ------------------------ | ------------ | +|210|0.0005 |0.0332 |0.0626 |0.0786 |0.0742 |0.0670 | +|212|0.0018 |0.0390 |0.0570 |0.1122 |0.0766 |0.1143 | +|214|0.0068 |0.0494 |0.0589 |0.1236 |0.0598 |0.0514 | +|216|0.0241 |0.0756 |0.1145 |0.1271 |0.0776 |0.0793 | +|218|0.1092 |0.1705 |0.2576 |0.1742 |0.1362 |0.1640 | +|220|0.5457 |0.8490 |0.3955 |0.4744 |0.2322 |0.2773 | +|222|2.8498 |2.9690 |0.7290 |1.4791 |0.4043 |0.3592 | +|224|13.7399 |12.8068 |1.9275 |5.9673 |1.2438 |0.6996 | + +Based on the results, we see that the CPU implementation is the fastest up to array size 218. +As array size continues to increase past this, all of the GPU algorithms besides Naive get relatively exponentially faster. +Work-Efficient, although much better than CPU and Naive, does itself start to have exponentially longer run times as we get to very large sizes. +The Naive & Hardware-Efficient Scan and Work-Efficient & Hardware-Efficient Scan both exemplify the signficance of using shared memory best practices (no bank conflicts) and warp partitioning. +Thrust clearly starts to pull away as we get to the largest array sizes, but I am proud of how my Work-Efficient & Hardware-Efficient Scan gives it a run for its money! + + +### Performance Bottlenecks + +The Work-Efficient Scan is clearly faster than the Naive Scan since there is less overall work to do as described in the implementation details in the [Scan](#Scan) section. +However, since they both have a vast amount of read and write operations from/to global memory, they both perform poorly relative to the Hardware-Efficient implementations that use shared memory. +Another inefficiency of the Naive Scan is the absense of warp partitioning best practices, which the rest of the GPU Scan implementations utilize. Warp paritioning is how threads from a block are divided into warps, and the goal is to partition based on consecutive increasing thread indices such that divergent branches are minimized and warps are retired early, freeing up resources for the GPU to perform any other available work with. +Lastly, since the Naive & Hardware-Efficient and Work-Efficient & Hardware-Efficient implementations are optimized with shared memory and warp paritioning best practices, another bottleneck comes into play called bakn conflicts. Shared memory is split up to 32 banks such that each bank can service on address per cycle. This was not a problem when implementing the Naive & Hardware-Efficient Scan, but was introduced in the initial implementations of the Work-Efficient & Hardware-Efficient Scan. Through adding a padding offset to after every 32 shared memory elements, the bank conflicts were alleviated and performance increased. + +### Sample Output +This output is used to test the correctness and timing of all Scan and Stream Compaction implementations. + +In this sample, Array Size of 220 is used. + +``` +**************** +** SCAN TESTS ** +**************** + [ 12 47 23 8 49 44 11 3 48 22 33 4 12 ... 31 0 ] +==== cpu scan, power-of-two ==== + [ 0 12 59 82 90 139 183 194 197 245 267 300 304 ... 25666918 25666949 ] + elapsed time: 0.6517ms (std::chrono Measured) +==== cpu scan, non-power-of-two ==== + [ 0 12 59 82 90 139 183 194 197 245 267 300 304 ... 25666812 25666855 ] + elapsed time: 0.5208ms (std::chrono Measured) + passed +==== naive scan, power-of-two, no shared memory ==== + elapsed time: 1.07728ms (CUDA Measured) + passed +==== naive scan, non-power-of-two, no shared memory ==== + elapsed time: 0.843456ms (CUDA Measured) + passed +==== naive scan, power-of-two, shared memory ==== + elapsed time: 0.49872ms (CUDA Measured) + passed +==== naive scan, non-power-of-two, shared memory ==== + elapsed time: 0.477088ms (CUDA Measured) + passed +==== work-efficient scan, power-of-two, no shared memory ==== + elapsed time: 0.566848ms (CUDA Measured) + passed +==== work-efficient scan, non-power-of-two, no shared memory ==== + elapsed time: 0.468896ms (CUDA Measured) + passed +==== work-efficient scan, power-of-two, shared memory ==== + elapsed time: 0.216576ms (CUDA Measured) + passed +==== work-efficient scan, non-power-of-two, shared memory ==== + elapsed time: 0.2104ms (CUDA Measured) + passed +==== thrust scan, power-of-two ==== + elapsed time: 0.621248ms (CUDA Measured) + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 0.183968ms (CUDA Measured) + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 0 1 1 0 1 0 3 3 0 0 3 0 0 ... 1 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 2.4059ms (std::chrono Measured) + [ 1 1 1 3 3 3 1 1 1 3 1 3 1 ... 3 1 ] + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 2.4662ms (std::chrono Measured) + [ 1 1 1 3 3 3 1 1 1 3 1 3 1 ... 3 2 ] + passed +==== cpu compact with scan, power-of-two ==== + elapsed time: 4.6895ms (std::chrono Measured) + passed +==== cpu compact with scan, non-power-of-two ==== + elapsed time: 5.1045ms (std::chrono Measured) + passed +==== work-efficient compact, power-of-two, no shared memory ==== + elapsed time: 1.39776ms (CUDA Measured) + passed +==== work-efficient compact, non-power-of-two, no shared memory ==== + elapsed time: 0.817856ms (CUDA Measured) + passed +==== work-efficient compact, power-of-two, shared memory ==== + elapsed time: 0.602912ms (CUDA Measured) + passed +==== work-efficient compact, non-power-of-two, shared memory ==== + elapsed time: 0.588288ms (CUDA Measured) + passed +==== thrust compact, power-of-two ==== + elapsed time: 0.28656ms (CUDA Measured) + passed +==== thrust compact, non-power-of-two ==== + elapsed time: 0.283488ms (CUDA Measured) + passed +``` diff --git a/img/compaction_with_scan.PNG b/img/compaction_with_scan.PNG new file mode 100644 index 0000000000000000000000000000000000000000..a6f780f9b8fbdda26eddd57617e11ff82e2cffe9 GIT binary patch literal 17865 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 literal 0 HcmV?d00001 diff --git a/img/gpu_excluisve_efficient_downsweep.PNG b/img/gpu_excluisve_efficient_downsweep.PNG new file mode 100644 index 0000000000000000000000000000000000000000..268ff26824f17b29103cde96f81a08d2c38d5fae GIT binary patch literal 18381 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 DALvAJ literal 0 HcmV?d00001 diff --git a/img/gpu_exclusive_efficient_upsweep.PNG b/img/gpu_exclusive_efficient_upsweep.PNG new file mode 100644 index 0000000000000000000000000000000000000000..7344fab95794dc62005ce4a8553c09bd5e76c3e0 GIT binary patch literal 11643 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 literal 0 HcmV?d00001 diff --git a/img/runtime_vs_blocksize.png b/img/runtime_vs_blocksize.png new file mode 100644 index 0000000000000000000000000000000000000000..94a00e05e131fd9f278b45a1086b244ac3c3aee6 GIT binary patch literal 130776 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

B#Z}b{oU93Fy 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 Date: Thu, 19 Sep 2024 00:02:17 -0400 Subject: [PATCH 14/16] minor README fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b031049..1cdfb08 100644 --- a/README.md +++ b/README.md @@ -123,7 +123,7 @@ Thrust clearly starts to pull away as we get to the largest array sizes, but I a ### Performance Bottlenecks -The Work-Efficient Scan is clearly faster than the Naive Scan since there is less overall work to do as described in the implementation details in the [Scan](#Scan) section. +The Work-Efficient Scan is clearly faster than the Naive Scan since there is less overall work to do as described in the implementation details in the [Part 2](#part-2-implementation-details) Scan section. However, since they both have a vast amount of read and write operations from/to global memory, they both perform poorly relative to the Hardware-Efficient implementations that use shared memory. Another inefficiency of the Naive Scan is the absense of warp partitioning best practices, which the rest of the GPU Scan implementations utilize. Warp paritioning is how threads from a block are divided into warps, and the goal is to partition based on consecutive increasing thread indices such that divergent branches are minimized and warps are retired early, freeing up resources for the GPU to perform any other available work with. Lastly, since the Naive & Hardware-Efficient and Work-Efficient & Hardware-Efficient implementations are optimized with shared memory and warp paritioning best practices, another bottleneck comes into play called bakn conflicts. Shared memory is split up to 32 banks such that each bank can service on address per cycle. This was not a problem when implementing the Naive & Hardware-Efficient Scan, but was introduced in the initial implementations of the Work-Efficient & Hardware-Efficient Scan. Through adding a padding offset to after every 32 shared memory elements, the bank conflicts were alleviated and performance increased. From 827ea50fbc8bc29e3dff0d6c6c3346fa586df32d Mon Sep 17 00:00:00 2001 From: mrabbitz <54726631+mrabbitz@users.noreply.github.com> Date: Thu, 19 Sep 2024 00:16:36 -0400 Subject: [PATCH 15/16] fixing README typos --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1cdfb08..b1b733c 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,7 @@ Thrust clearly starts to pull away as we get to the largest array sizes, but I a The Work-Efficient Scan is clearly faster than the Naive Scan since there is less overall work to do as described in the implementation details in the [Part 2](#part-2-implementation-details) Scan section. However, since they both have a vast amount of read and write operations from/to global memory, they both perform poorly relative to the Hardware-Efficient implementations that use shared memory. Another inefficiency of the Naive Scan is the absense of warp partitioning best practices, which the rest of the GPU Scan implementations utilize. Warp paritioning is how threads from a block are divided into warps, and the goal is to partition based on consecutive increasing thread indices such that divergent branches are minimized and warps are retired early, freeing up resources for the GPU to perform any other available work with. -Lastly, since the Naive & Hardware-Efficient and Work-Efficient & Hardware-Efficient implementations are optimized with shared memory and warp paritioning best practices, another bottleneck comes into play called bakn conflicts. Shared memory is split up to 32 banks such that each bank can service on address per cycle. This was not a problem when implementing the Naive & Hardware-Efficient Scan, but was introduced in the initial implementations of the Work-Efficient & Hardware-Efficient Scan. Through adding a padding offset to after every 32 shared memory elements, the bank conflicts were alleviated and performance increased. +Lastly, since the Naive & Hardware-Efficient and Work-Efficient & Hardware-Efficient implementations are optimized with shared memory and warp paritioning best practices, another bottleneck comes into play called bank conflicts. Shared memory is split up into 32 banks such that each bank can service one address per cycle. This was not a problem when implementing the Naive & Hardware-Efficient Scan, but was introduced in the initial implementation stages of the Work-Efficient & Hardware-Efficient Scan. Through adding a padding element after every 32 shared memory elements, the bank conflicts were alleviated and performance increased. ### Sample Output This output is used to test the correctness and timing of all Scan and Stream Compaction implementations. From 77135e18442a0b3e19255950f6bc463d2181cbb5 Mon Sep 17 00:00:00 2001 From: mrabbitz <54726631+mrabbitz@users.noreply.github.com> Date: Fri, 13 Dec 2024 17:07:48 -0500 Subject: [PATCH 16/16] Readme updates (#6) Readme updates (#6) --- README.md | 82 +++++++++++++++++++----------------- img/scan_array_arb_size.PNG | Bin 0 -> 126758 bytes 2 files changed, 44 insertions(+), 38 deletions(-) create mode 100644 img/scan_array_arb_size.PNG diff --git a/README.md b/README.md index b1b733c..ef14151 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ CUDA Stream Compaction ## Part 1: Introduction -This project focuses on implementing various Stream Compaction algorithms, including those utilizing the Scan algorithm, to emphasize the importance of designing GPU hardware-optimized algorithms that leverage parallel computation for superior performance compared to CPU implementations. +This project implements various Stream Compaction algorithms, with an emphasis on those utilizing the Scan algorithm, to highlight the importance of designing GPU hardware-optimized algorithms that leverage parallel computation for superior performance. ### Stream Compaction Stream compaction involves filtering an input data set to produce a new collection that contains only the elements meeting a specified condition, while preserving their original order. This process reduces the size of the data set by removing unwanted elements, which is crucial for optimizing performance and memory usage in applications like path tracing, collision detection, etc. @@ -27,52 +27,49 @@ The Scan algorithm, also known as the all-prefix-sums operation, computes prefix ## Part 2: Implementation Details -**n represents the number of elements in the array** - -**All implementations support arrays of arbitrary n - small, large, powers of two, not powers of two** +**All implementations support arrays of arbitrary size** ### Scan #### Implementations 1. **CPU:** O(n) addition operations - sequential loop over array elements, accumulating a sum at each iteration 2. **GPU Naive Algorithm:** O(n * log2(n)) addition operations - over log2(n) passes, for pass p starting at p = 1, compute the partial sums of n - 2p - 1 elements in parallel 3. **GPU Work-Efficient Algorithm:** O(n) operations - performs scan into two phases: parallel upsweep (reduction) with n - 1 adds (O(n)), and parallel downsweep with n - 1 adds (O(n)) and n - 1 swaps (O(n)) -4. **GPU Naive Algorithm with Hardware Efficiency:** shared memory - divide the array into evenly-sized blocks, each of which is scanned by a single thread block. Utilize shared memory within each thread block to perform the scan and write the total sum of each block to a separate array of block sums. Then, scan the array of block sums to create an array of block increments, which are added to all elements within their respective blocks. -5. **GPU Work-Efficient Algorithm with Hardware Efficiency:** shared memory - same process as above +4. **GPU Naive Algorithm with Hardware Efficiency:** uses shared memory - divide the array into blocks, then scan each block in parallel over many SMs (with each block corresponding to a thread block). Utilize shared memory within each thread block to perform the scan and write the total sum of each block to a new array of block sums. Scan the array of block sums to compute an array of block increments, which are then added to each element in the corresponding scanned block from the initial scan (e.g. the zero-indexed block increment from the block increments array is added to each element in the zero-indexed scanned block of the divided input array). +5. **GPU Work-Efficient Algorithm with Hardware Efficiency:** uses shared memory - same process as above 6. **GPU using [Thrust CUDA library](https://nvidia.github.io/cccl/thrust):** wrapper function using thrust::exclusive_scan -#### Inclusive Scan - GPU Naive Algorithm: -

    - -

    +|Inclusive Scan - GPU Naive Algorithm| +|:--:| +|![GPU Inclusive Naive](img/gpu_inclusive_naive.PNG)| -#### Exclusive Scan - GPU Work-Efficient Algorithm: -**Upsweep** -

    - -

    +|Exclusive Scan - GPU Work-Efficient Algorithm| +|:--:| +|Upsweep | +|![GPU Exclusive Efficient Upsweep](img/gpu_exclusive_efficient_upsweep.PNG) | +|Downsweep | +|![GPU Exclusive Efficient Upsweep](img/gpu_excluisve_efficient_downsweep.PNG)| -**Downsweep** -

    - -

    +|Inclusive Scan - GPU with Hardware Efficiency using shared memory| +|:--:| +|![GPU Scan Arb Size Array](img/scan_array_arb_size.PNG)| ### Stream Compaction -**Compaction removes invalid elements (0s) from an array of randomized ints** +**For this project, Stream Compaction is performed on an array of randomized non-negative integers, where elements with a value of 0 are considered 'invalid' and those with positive values are considered 'valid'.** #### Stream Compaction with Scan is described in 3 steps: -1. **Create Binary Map:** use the input array to create a binary map array indicating the validity of each input element -2. **Scan:** perform Scan on the binary array to generate a map of index values which correspond to the compacted array index of sequential valid input elements -3. **Scatter:** for the indices of the binary array that indicate valid input elements, use those indices to index the Scan output array to determine the compated array index of the valid element, then place valid element data into the compacted array +1. **Create Binary Map:** use the input array to generate a binary map array indicating the validity of each input element (0 for invalid, 1 for valid) +2. **Scan:** perform Scan on the binary map to generate an array of indices that indicate the compacted array positions of valid input elements +3. **Scatter:** for each index in the binary map that indicates a valid input element - use the index to retrieve the valid element data from the input array, and use the same index to retrieve the compacted array index from the Scan output array. Use these two retrieved values to place the valid element data into the compacted array

    #### Implementations -1. **CPU without Scan:** - sequential loop over input elements while placing valid input data into the compacted array -2. **CPU with Scan:** - perform Step 1 with sequential loop over n elements, perform Step 2 using CPU Scan, then perform Step 3 with sequential loop over n elements -3. **GPU with Work-Efficient Scan:** - perform Step 1 over n elements in one parallel pass, perform Step 2 using Work-Efficient Scan, then perform Step 3 over n elements in one parallel pass -4. **GPU with Work-Efficient and Hardware-Efficient Scan:** - same as above line except using Work-Efficient and Hardware-Efficient Scan +1. **CPU without Scan:** sequential loop over n input elements while placing valid input data into the compacted array +2. **CPU with Scan:** Create Binary Map with sequential loop over n input elements, Scan using CPU Scan, then Scatter with sequential loop over n elements +3. **GPU with Work-Efficient Scan:** Create Binary Map over n input elements in one parallel pass, Scan using Work-Efficient Scan, then Scatter over n elements in one parallel pass +4. **GPU with Work-Efficient & Hardware-Efficient Scan:** same as above line except using Work-Efficient & Hardware-Efficient Scan 5. **GPU using [Thrust CUDA library](https://nvidia.github.io/cccl/thrust):** wrapper function using thrust::remove_if ## Part 3: Performance Analysis @@ -114,24 +111,33 @@ Based on the results, it is clear that block size of 128 is optimal. |222|2.8498 |2.9690 |0.7290 |1.4791 |0.4043 |0.3592 | |224|13.7399 |12.8068 |1.9275 |5.9673 |1.2438 |0.6996 | -Based on the results, we see that the CPU implementation is the fastest up to array size 218. -As array size continues to increase past this, all of the GPU algorithms besides Naive get relatively exponentially faster. -Work-Efficient, although much better than CPU and Naive, does itself start to have exponentially longer run times as we get to very large sizes. -The Naive & Hardware-Efficient Scan and Work-Efficient & Hardware-Efficient Scan both exemplify the signficance of using shared memory best practices (no bank conflicts) and warp partitioning. -Thrust clearly starts to pull away as we get to the largest array sizes, but I am proud of how my Work-Efficient & Hardware-Efficient Scan gives it a run for its money! +Based on the results, CPU Scan is the fastest up to an array size of 218. +Beyond this size, all GPU Scans, except for Naive Scan, exhibit exponential speedups relative to CPU Scan. +Work-Efficient Scan, although much faster than both CPU Scan and Naive Scan at large array sizes, begins to experience exponentially longer run times as we reach these sizes. +The results of Naive & Hardware-Efficient Scan and Work-Efficient & Hardware-Efficient Scan demonstrate the importance of effectively utilizing shared memory (e.g. avoiding bank conflicts) and incorporating warp partitioning. +As we approach the largest tested array sizes, Thrust clearly pulls ahead, but I am proud of how my Work-Efficient & Hardware-Efficient Scan competes closely with it! ### Performance Bottlenecks -The Work-Efficient Scan is clearly faster than the Naive Scan since there is less overall work to do as described in the implementation details in the [Part 2](#part-2-implementation-details) Scan section. -However, since they both have a vast amount of read and write operations from/to global memory, they both perform poorly relative to the Hardware-Efficient implementations that use shared memory. -Another inefficiency of the Naive Scan is the absense of warp partitioning best practices, which the rest of the GPU Scan implementations utilize. Warp paritioning is how threads from a block are divided into warps, and the goal is to partition based on consecutive increasing thread indices such that divergent branches are minimized and warps are retired early, freeing up resources for the GPU to perform any other available work with. -Lastly, since the Naive & Hardware-Efficient and Work-Efficient & Hardware-Efficient implementations are optimized with shared memory and warp paritioning best practices, another bottleneck comes into play called bank conflicts. Shared memory is split up into 32 banks such that each bank can service one address per cycle. This was not a problem when implementing the Naive & Hardware-Efficient Scan, but was introduced in the initial implementation stages of the Work-Efficient & Hardware-Efficient Scan. Through adding a padding element after every 32 shared memory elements, the bank conflicts were alleviated and performance increased. +The Work-Efficient Scan is clearly faster than the Naive Scan due to the reduced overall work involved, as described in the implementation details in the [Part 2](#part-2-implementation-details) Scan section. +However, both implementations suffer from a significant number of read and write operations to and from global memory, resulting in poor performance compared to Hardware-Efficient implementations that utilize shared memory. + +Another inefficiency of the Naive Scan is the absence of warp partitioning best practices, which the other GPU Scan implementations adopt. +Warp partitioning involves dividing threads from a block into warps, aiming to partition based on consecutive increasing thread indices. +This approach minimizes divergent branches and allows warps to retire early, freeing up GPU resources for other available work. + +Lastly, while the Naive & Hardware-Efficient Scan and Work-Efficient & Hardware-Efficient Scan are optimized with shared memory and warp partitioning practices, they introduce a bottleneck known as bank conflicts that are specific to shared memory. +Shared memory is divided into 32 banks, allowing each bank to service one address per cycle. +Although bank conflicts were not an issue in the Naive & Hardware-Efficient Scan, they emerged during the later implementation stages of the Work-Efficient & Hardware-Efficient Scan. +To address this, a padding element was added after every 32 shared memory elements, effectively alleviating these bank conflicts and leading to improved performance. + + ### Sample Output -This output is used to test the correctness and timing of all Scan and Stream Compaction implementations. +This is a sample of the output used to test the correctness and timing of all Scan and Stream Compaction implementations. -In this sample, Array Size of 220 is used. +In this sample, array size is 220 ``` **************** diff --git a/img/scan_array_arb_size.PNG b/img/scan_array_arb_size.PNG new file mode 100644 index 0000000000000000000000000000000000000000..c6daf54fffb2bf86c76c194df77130e97f75b2eb GIT binary patch literal 126758 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
    9x#*K4XwhPm$|H~!dj@6^RK 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