From c8a659d1479311f6c0310e69dd4127bd840ea33c Mon Sep 17 00:00:00 2001 From: Caroline Fernandes Date: Sat, 13 Sep 2025 15:56:30 -0400 Subject: [PATCH 01/24] up to parts 3.1 --- stream_compaction/cpu.cu | 76 ++++++++++++++++++++++++++++- stream_compaction/efficient.cu | 80 +++++++++++++++++++++++++++++++ stream_compaction/naive.cu | 87 ++++++++++++++++++++++++++++++++++ 3 files changed, 241 insertions(+), 2 deletions(-) diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 719fa115..bdabdc69 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -2,6 +2,8 @@ #include "cpu.h" #include "common.h" +#include + namespace StreamCompaction { namespace CPU { @@ -20,6 +22,10 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + odata[0] = 0; + for(int i = 1; i + namespace StreamCompaction { namespace Efficient { using StreamCompaction::Common::PerformanceTimer; @@ -12,13 +14,91 @@ namespace StreamCompaction { return timer; } + + __global__ void kernDownSweepEfficientScan(int n, int d, int* odata) { + int k = threadIdx.x + (blockIdx.x * blockDim.x); + + int stride = 1 << (d + 1); // 2^(d+1) + + if (k * stride >= n) return; + + int leftIdx = stride * k + (1 << d) - 1; + int rightIdx = stride * k + stride - 1; + + int t = odata[leftIdx]; + + //if (rightIdx < n) { + odata[leftIdx] = odata[rightIdx]; + odata[rightIdx] += t; + //} + } + + + __global__ void kernUpSweepEfficientScan(int n, int d, int* odata) { + int index = (blockIdx.x * blockDim.x + threadIdx.x); + int stride = 1 << (d + 1); // 2^(d+1) + + // Only use every 2^(d+1)th thread + if (index * stride >= n) return; + + int leftIdx = stride * index + (1 << d) - 1; // Left child + int rightIdx = stride * index + stride - 1; // Right child + + if (rightIdx < n) { + odata[rightIdx] += odata[leftIdx]; + } + } + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + + + int* d_data; + + int paddedN = 1 << ilog2ceil(n); + int logceilN = ilog2ceil(paddedN); + + cudaMalloc((void**)&d_data, paddedN * sizeof(int)); + cudaMemcpy(d_data, idata, paddedN * sizeof(int), cudaMemcpyHostToDevice); + timer().startGpuTimer(); // TODO + int blockSize = 64; + int numBlocks = (paddedN + blockSize - 1) / blockSize; + + + for (int d = 0; d < logceilN; ++d) { + int threadsNeeded = n / (1 << (d + 1)); + if (threadsNeeded == 0) break; // No more work to do + + int numBlocksLevel = (threadsNeeded + blockSize - 1) / blockSize; + + + kernUpSweepEfficientScan << > > (n, d, d_data); + cudaDeviceSynchronize(); + } + + int setNMinusOne_ToZero = 0; + cudaMemcpy(d_data + paddedN - 1, &setNMinusOne_ToZero, sizeof(int), cudaMemcpyHostToDevice); + + for (int d = logceilN - 1; d > -1; --d) { + int threadsNeeded = (paddedN)/ (1 << (d + 1)); + if (threadsNeeded == 0) break; + + int numBlocksLevel = (threadsNeeded + blockSize - 1) / blockSize; + + kernDownSweepEfficientScan << > > (paddedN, d, d_data); + cudaDeviceSynchronize(); + } + timer().endGpuTimer(); + + cudaMemcpy(odata, d_data, paddedN * sizeof(int), cudaMemcpyDeviceToHost); + cudaFree(d_data); + + } /** diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 43088769..ef5e12bb 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -3,6 +3,8 @@ #include "common.h" #include "naive.h" +#include + namespace StreamCompaction { namespace Naive { using StreamCompaction::Common::PerformanceTimer; @@ -13,13 +15,98 @@ namespace StreamCompaction { } // TODO: __global__ + + __global__ void kernNaiveScan(int n, int d, int* odata, const int* idata) { + int index = threadIdx.x + (blockIdx.x * blockDim.x); + + + if (index >= n) return; + int val = 1 << (d-1); + if (index == 0) { + odata[0] = idata[0]; + //return; + } + + if (index >= val ) { + odata[index] = idata[index - val] + idata[index]; + } + else { + odata[index] = idata[index]; + } + + } + + // This uses the "Naive" algorithm from GPU Gems 3, Section 39.2.1. + // Example 39-1 uses shared memory. This is not required in this project. + // You can simply use global memory. As a result of this, you will have to do ilog2ceil(n) separate kernel invocations. + + // Since your individual GPU threads are not guaranteed to run simultaneously, + // you can't generally operate on an array in-place on the GPU; + // it will cause race conditions. Instead, create two device arrays. + // Swap them at each iteration: read from A and write to B, read from B and write to A, and so on. + + + __global__ void exclusiveShift(int n, int* odata, const int* idata) { + // TODO + int index = threadIdx.x + (blockIdx.x * blockDim.x); + + if (index >= n || index < 0) return; + + odata[index] = idata[index - 1]; + + } + + int ilog2ceil(int n) { + int log = 0; + int pow2 = 1; + while (pow2 < n) { + log++; + pow2 *= 2; + } + return log; + } + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + + int* d_A; + int* d_B; + + cudaMalloc((void**)&d_A, n * sizeof(int)); + cudaMalloc((void**)&d_B, n * sizeof(int)); + cudaMemcpy(d_A, idata, n * sizeof(int), cudaMemcpyHostToDevice); + cudaMemcpy(d_B, odata, n * sizeof(int), cudaMemcpyHostToDevice); + + timer().startGpuTimer(); // TODO + + int blockSize = 32; + int numBlocks = (n + blockSize - 1) / blockSize; + + int swapBuffer = 0; + for (int d = 1; d <= ilog2ceil(n); ++d) { + kernNaiveScan << > > (n, d, d_B, d_A); + cudaDeviceSynchronize(); + + int* temp; + + std::swap(d_A, d_B); + + } + + exclusiveShift << > > (n, d_B, d_A); + timer().endGpuTimer(); + + cudaMemcpy(odata, d_B, n * sizeof(int), cudaMemcpyDeviceToHost); + + + + cudaFree(d_A); + cudaFree(d_B); } } } From 4e24409426f79269709d79b36f3444d0d9289405 Mon Sep 17 00:00:00 2001 From: Caroline Fernandes Date: Sun, 14 Sep 2025 15:25:30 -0400 Subject: [PATCH 02/24] up to part 4 --- stream_compaction/common.cu | 20 ++++++++ stream_compaction/efficient.cu | 88 +++++++++++++++++++++++++++++----- stream_compaction/thrust.cu | 9 ++++ 3 files changed, 104 insertions(+), 13 deletions(-) diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 2ed6d630..4c4da90a 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -24,6 +24,17 @@ namespace StreamCompaction { */ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { // TODO + + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= n) return; + + if (idata[index] != 0) { + bools[index] = 1; + } + else { + bools[index] = 0; + } + } /** @@ -33,6 +44,15 @@ namespace StreamCompaction { __global__ void kernScatter(int n, int *odata, const int *idata, const int *bools, const int *indices) { // TODO + + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= n) return; + + if (bools[index] == 1) { + int idx = indices[index]; + odata[idx] = idata[index]; + } + } } diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 70d7b2f1..c6bac3e1 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -54,7 +54,6 @@ namespace StreamCompaction { */ void scan(int n, int *odata, const int *idata) { - int* d_data; int paddedN = 1 << ilog2ceil(n); @@ -63,20 +62,20 @@ namespace StreamCompaction { cudaMalloc((void**)&d_data, paddedN * sizeof(int)); cudaMemcpy(d_data, idata, paddedN * sizeof(int), cudaMemcpyHostToDevice); - timer().startGpuTimer(); // TODO int blockSize = 64; int numBlocks = (paddedN + blockSize - 1) / blockSize; + timer().startGpuTimer(); for (int d = 0; d < logceilN; ++d) { - int threadsNeeded = n / (1 << (d + 1)); - if (threadsNeeded == 0) break; // No more work to do + //int threadsNeeded = n / (1 << (d + 1)); + //if (threadsNeeded == 0) break; // No more work to do - int numBlocksLevel = (threadsNeeded + blockSize - 1) / blockSize; + //int numBlocksLevel = (threadsNeeded + blockSize - 1) / blockSize; - kernUpSweepEfficientScan << > > (n, d, d_data); + kernUpSweepEfficientScan << > > (n, d, d_data); cudaDeviceSynchronize(); } @@ -84,18 +83,20 @@ namespace StreamCompaction { cudaMemcpy(d_data + paddedN - 1, &setNMinusOne_ToZero, sizeof(int), cudaMemcpyHostToDevice); for (int d = logceilN - 1; d > -1; --d) { - int threadsNeeded = (paddedN)/ (1 << (d + 1)); - if (threadsNeeded == 0) break; + //int threadsNeeded = (paddedN)/ (1 << (d + 1)); + //if (threadsNeeded == 0) break; - int numBlocksLevel = (threadsNeeded + blockSize - 1) / blockSize; + //int numBlocksLevel = (threadsNeeded + blockSize - 1) / blockSize; - kernDownSweepEfficientScan << > > (paddedN, d, d_data); + kernDownSweepEfficientScan << > > (paddedN, d, d_data); cudaDeviceSynchronize(); } timer().endGpuTimer(); cudaMemcpy(odata, d_data, paddedN * sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(d_data); @@ -111,10 +112,71 @@ namespace StreamCompaction { * @returns The number of elements remaining after compaction. */ int compact(int n, int *odata, const int *idata) { - timer().startGpuTimer(); // TODO - timer().endGpuTimer(); - return -1; + + int *count; + int *d_bools; + int *d_indices; + int *d_idata; + int* d_odata; + + + int paddedN = 1 << ilog2ceil(n); + + cudaMalloc((void**)&d_bools, paddedN * sizeof(int)); + cudaMalloc((void**)&d_indices, paddedN * sizeof(int)); + cudaMalloc((void**)&d_idata, paddedN * sizeof(int)); + cudaMalloc((void**)&d_odata, paddedN * sizeof(int)); + + cudaMemcpy(d_idata, idata, paddedN * sizeof(int), cudaMemcpyHostToDevice); + + // map to bools + int blockSize = 64; + int numBlocks = (paddedN + blockSize - 1) / blockSize; + + //timer().startGpuTimer(); + + StreamCompaction::Common::kernMapToBoolean << > > (paddedN, d_bools, d_idata); + cudaDeviceSynchronize(); + + int* tmp_bools = new int[paddedN]; + cudaMemcpy(tmp_bools, d_bools, paddedN * sizeof(int), cudaMemcpyDeviceToHost); + + + int* tmp_indices = new int[paddedN]; + // scan bools into indices + scan(paddedN, tmp_indices, tmp_bools); + cudaDeviceSynchronize(); + + + // copy indices to device for scatter kernel + cudaMemcpy(d_indices, tmp_indices, paddedN * sizeof(int), cudaMemcpyHostToDevice); + + + // scatter + StreamCompaction::Common::kernScatter << > > (paddedN, d_odata, d_idata, d_bools, d_indices); + cudaDeviceSynchronize(); + + + int returnVal = 0; + for (int i = 0; i < n; i++) { + tmp_bools[i] == 1 ? returnVal++ : returnVal += 0; + } + + //timer().endGpuTimer(); + + cudaMemcpy(odata, d_odata, paddedN * sizeof(int), cudaMemcpyDeviceToHost); + + delete[] tmp_bools; + delete[] tmp_indices; + cudaFree(d_bools); + cudaFree(d_indices); + cudaFree(d_idata); + cudaFree(d_odata); + + + + return returnVal; } } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 1def45e7..550b151f 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -22,6 +22,15 @@ namespace StreamCompaction { // TODO use `thrust::exclusive_scan` // example: for device_vectors dv_in and dv_out: // thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); + + thrust::device_vector dv_in(n); + thrust::device_vector dv_out(n); + + thrust::copy(idata, idata + n, dv_in.begin()); + thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); + + thrust::copy(dv_out.begin(), dv_out.end(), odata); + timer().endGpuTimer(); } } From ded1ae440e5c060f41d12983ebc802c8ea855edf Mon Sep 17 00:00:00 2001 From: 0cfernandes00 Date: Sun, 14 Sep 2025 18:17:49 -0400 Subject: [PATCH 03/24] Update README.md --- README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 0e38ddb1..dca6f948 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,13 @@ 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) +* Caroline Fernandes + * [LinkedIn](https://www.linkedin.com/in/caroline-fernandes-0-/), [personal website](https://0cfernandes00.wixsite.com/visualfx) +* Tested on: Windows 11, i9-14900HX @ 2.20GHz, Nvidia GeForce RTX 4070 -### (TODO: Your README) +### Project Intro -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 was to understand and implement Stream Compaction on the GPU, it was also an introduction into converting algorithms to be parallel on the GPU. +In this process, I first implemented these algorithms on the CPU including Scan(Prefix Sum) and built up to a naive, work efficient, and thrust implementation of stream compaction. +I also optimized my work efficient scan bringing the time on a non-power-of-2 array from 0.2 ms to 0.02ms From 14ddc29d95944814750bb1027b6a280eec489ebd Mon Sep 17 00:00:00 2001 From: 0cfernandes00 Date: Mon, 15 Sep 2025 23:03:19 -0400 Subject: [PATCH 04/24] Update README.md --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index dca6f948..83cc05d6 100644 --- a/README.md +++ b/README.md @@ -13,3 +13,11 @@ This project was to understand and implement Stream Compaction on the GPU, it wa In this process, I first implemented these algorithms on the CPU including Scan(Prefix Sum) and built up to a naive, work efficient, and thrust implementation of stream compaction. I also optimized my work efficient scan bringing the time on a non-power-of-2 array from 0.2 ms to 0.02ms + + +### Thrust + +Unlike the other implementations, thrust seems to be using the cudaStreamSynchronize which is slowing the runtime. On average, the other implementations seem to be allocating less memory than the thrust implementation. For thrust the average runtime for the cudaMalloc API call is 34.4 microseconds, and for the other implementations the average is 29.93 microseconds. + +Screenshot 2025-09-15 225852 +thrust_events From 4e0b663275b6a0ed697df0c110ab83a19aaf35a9 Mon Sep 17 00:00:00 2001 From: 0cfernandes00 Date: Mon, 15 Sep 2025 23:04:18 -0400 Subject: [PATCH 05/24] text change --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 83cc05d6..62c11fe1 100644 --- a/README.md +++ b/README.md @@ -19,5 +19,7 @@ I also optimized my work efficient scan bringing the time on a non-power-of-2 ar Unlike the other implementations, thrust seems to be using the cudaStreamSynchronize which is slowing the runtime. On average, the other implementations seem to be allocating less memory than the thrust implementation. For thrust the average runtime for the cudaMalloc API call is 34.4 microseconds, and for the other implementations the average is 29.93 microseconds. +All implementations except for thrust Screenshot 2025-09-15 225852 +Thrust only thrust_events From 4f1c9582a505d582ab57cecc01006c3342b10618 Mon Sep 17 00:00:00 2001 From: Caroline Fernandes Date: Tue, 16 Sep 2025 11:13:10 -0400 Subject: [PATCH 06/24] adding images for readme --- img/thrust_compute.png | Bin 0 -> 67151 bytes img/workeff_scan_compute.png | Bin 0 -> 22035 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/thrust_compute.png create mode 100644 img/workeff_scan_compute.png diff --git a/img/thrust_compute.png b/img/thrust_compute.png new file mode 100644 index 0000000000000000000000000000000000000000..ae763e80db03e2a87fa63cd993b12dbdd5f866b0 GIT binary patch literal 67151 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

OGxxs?Y0Uldm#1f(Xt-qKCwCg5pLP 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 W{Y}hMgfoaUj}&B7r7I*&g8mO+w6azJ literal 0 HcmV?d00001 diff --git a/img/workeff_scan_compute.png b/img/workeff_scan_compute.png new file mode 100644 index 0000000000000000000000000000000000000000..5703d637aaf1fed05aa09ae5221272fa5d007e52 GIT binary patch literal 22035 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 Date: Tue, 16 Sep 2025 11:13:32 -0400 Subject: [PATCH 07/24] Update README.md --- README.md | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 62c11fe1..2d4b59a3 100644 --- a/README.md +++ b/README.md @@ -9,17 +9,52 @@ CUDA Stream Compaction ### Project Intro -This project was to understand and implement Stream Compaction on the GPU, it was also an introduction into converting algorithms to be parallel on the GPU. +Features +- CPU Scan and Stream Compaction +- Naive GPU Scan +- Work Efficient Scan and Compaction +- Thrust Scan implementation + +The overarching goals for this project were to +1) understand and implement Stream Compaction on the GPU +2) practice converting algorithms to be parallel + +This implementation of stream compaction is for removing zeroes from an array of ints but this algorithm will be useful for removing unhelpful rays for a path tracer. + In this process, I first implemented these algorithms on the CPU including Scan(Prefix Sum) and built up to a naive, work efficient, and thrust implementation of stream compaction. I also optimized my work efficient scan bringing the time on a non-power-of-2 array from 0.2 ms to 0.02ms +Can you find the performance bottlenecks? Is it memory I/O? Computation? Is it different for each implementation? + +### CPU +An Exclusive Prefix Sum (Scan) +Stream Compaction without scan +Stream Compaction with scan + + +### Naive +Pseudocode from [GPU Gems 3 Chapter 39 (Section 39.2.1)](https://developer.nvidia.com/gpugems/gpugems3/part-vi-gpu-computing/chapter-39-parallel-prefix-sum-scan-cuda) +image + +Performance +The primary hit to performance for the naive implementation could be + +### Work Efficient +![](img/workeff_scan_compute.png) + ### Thrust Unlike the other implementations, thrust seems to be using the cudaStreamSynchronize which is slowing the runtime. On average, the other implementations seem to be allocating less memory than the thrust implementation. For thrust the average runtime for the cudaMalloc API call is 34.4 microseconds, and for the other implementations the average is 29.93 microseconds. +![](img/thrust_compute.png) All implementations except for thrust Screenshot 2025-09-15 225852 Thrust only thrust_events + +### Optimization Analysis + +image + From d18d9422da63857acd7ac2dbf666c37c0b6d1910 Mon Sep 17 00:00:00 2001 From: 0cfernandes00 Date: Tue, 16 Sep 2025 11:30:30 -0400 Subject: [PATCH 08/24] Update README.md --- README.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2d4b59a3..4f80f256 100644 --- a/README.md +++ b/README.md @@ -34,20 +34,33 @@ Stream Compaction with scan ### Naive Pseudocode from [GPU Gems 3 Chapter 39 (Section 39.2.1)](https://developer.nvidia.com/gpugems/gpugems3/part-vi-gpu-computing/chapter-39-parallel-prefix-sum-scan-cuda) + image Performance -The primary hit to performance for the naive implementation could be +The primary hit to performance for the naive implementation could be the multiple accesses to global memory as well as the swapping needed to prevent race conditions. ### Work Efficient +The Work Efficient Compaction utilized an parallel reduction up-sweep kernel and a down-sweep kernel as part of the sum, provided again from the book. +Upsweep +image +Downsweep +image + +I had originally expected this to be the fastest implementation. + + +The NSight Compute report seemed to suggest that the bottleneck was largely in computation usage for this algorithm. I had originally implemented this algorithm using the pseudocode from the book and slides. However combining the upsweep and downsweep kernels into a single kernel (as well as removing the memory copy I was using in my approach), proved to be a benefit in reducing the amount of time. ![](img/workeff_scan_compute.png) ### Thrust +This was simply a call to the Thrust library to compare against our other implementations. The compute report suggested that the kernel thrust uses has high register usage and low occupancy requiring more hardware resources for a single thread. +![](img/thrust_compute.png) Unlike the other implementations, thrust seems to be using the cudaStreamSynchronize which is slowing the runtime. On average, the other implementations seem to be allocating less memory than the thrust implementation. For thrust the average runtime for the cudaMalloc API call is 34.4 microseconds, and for the other implementations the average is 29.93 microseconds. -![](img/thrust_compute.png) + All implementations except for thrust Screenshot 2025-09-15 225852 From bd1563707ec51ae8a89345c9a5bd3640f642522e Mon Sep 17 00:00:00 2001 From: 0cfernandes00 Date: Tue, 16 Sep 2025 11:32:14 -0400 Subject: [PATCH 09/24] small text changes --- README.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 4f80f256..6441ef7d 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,8 @@ Features - Thrust Scan implementation The overarching goals for this project were to -1) understand and implement Stream Compaction on the GPU -2) practice converting algorithms to be parallel +1) Understand and implement Stream Compaction on the GPU +2) Practice converting algorithms to be parallel This implementation of stream compaction is for removing zeroes from an array of ints but this algorithm will be useful for removing unhelpful rays for a path tracer. @@ -35,8 +35,6 @@ Stream Compaction with scan ### Naive Pseudocode from [GPU Gems 3 Chapter 39 (Section 39.2.1)](https://developer.nvidia.com/gpugems/gpugems3/part-vi-gpu-computing/chapter-39-parallel-prefix-sum-scan-cuda) -image - Performance The primary hit to performance for the naive implementation could be the multiple accesses to global memory as well as the swapping needed to prevent race conditions. @@ -44,10 +42,6 @@ The primary hit to performance for the naive implementation could be the multipl ### Work Efficient The Work Efficient Compaction utilized an parallel reduction up-sweep kernel and a down-sweep kernel as part of the sum, provided again from the book. -Upsweep -image -Downsweep -image I had originally expected this to be the fastest implementation. From 2c2304ba85137e32835877f5d3b504b9261cd005 Mon Sep 17 00:00:00 2001 From: 0cfernandes00 Date: Tue, 16 Sep 2025 11:44:41 -0400 Subject: [PATCH 10/24] Update README.md --- README.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6441ef7d..62f4e520 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,13 @@ CUDA Stream Compaction ### Project Intro -Features +Features & Sections - CPU Scan and Stream Compaction - Naive GPU Scan - Work Efficient Scan and Compaction -- Thrust Scan implementation +- Thrust Scan +- Optimization +- Final Output The overarching goals for this project were to 1) Understand and implement Stream Compaction on the GPU @@ -27,17 +29,18 @@ I also optimized my work efficient scan bringing the time on a non-power-of-2 ar Can you find the performance bottlenecks? Is it memory I/O? Computation? Is it different for each implementation? ### CPU -An Exclusive Prefix Sum (Scan) -Stream Compaction without scan +This section implemented an Exclusive Prefix Sum (Scan), a Stream Compaction without scan, and finally built up to a Stream Compaction with scan. + Stream Compaction with scan + 1) Map the input into a bools array of 0s and 1s + 2) Perform a prefix sum of the input array into the bool array + 3) The resulting scan (from step 2) will tell which index to scatter the input array to ### Naive Pseudocode from [GPU Gems 3 Chapter 39 (Section 39.2.1)](https://developer.nvidia.com/gpugems/gpugems3/part-vi-gpu-computing/chapter-39-parallel-prefix-sum-scan-cuda) -Performance -The primary hit to performance for the naive implementation could be the multiple accesses to global memory as well as the swapping needed to prevent race conditions. - +The primary hit to performance for the naive implementation could be the multiple accesses to global memory, additionally this implementation required to buffers to swap between in order to prevent race conditions since this algorithm was not intended to be done in-place. ### Work Efficient @@ -65,3 +68,61 @@ Thrust only image + +### Final Output +\\\ + +**************** +** SCAN TESTS ** +**************** + [ 35 47 37 8 44 39 23 37 0 6 11 25 35 ... 47 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 0.0009ms (std::chrono Measured) + [ 0 35 82 119 127 171 210 233 270 270 276 287 312 ... 6365 6412 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 0.0006ms (std::chrono Measured) + [ 0 35 82 119 127 171 210 233 270 270 276 287 312 ... 6304 6341 ] + passed +==== naive scan, power-of-two ==== + elapsed time: 0.354304ms (CUDA Measured) + passed +==== naive scan, non-power-of-two ==== + elapsed time: 0.027648ms (CUDA Measured) + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 0.082944ms (CUDA Measured) + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 0.040256ms (CUDA Measured) + passed +==== thrust scan, power-of-two ==== + elapsed time: 2.22134ms (CUDA Measured) + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 0.746208ms (CUDA Measured) + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 1 3 1 0 0 1 3 3 0 2 3 3 1 ... 3 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 0.001ms (std::chrono Measured) + [ 1 3 1 1 3 3 2 3 3 1 3 1 1 ... 1 3 ] + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 0.001ms (std::chrono Measured) + [ 1 3 1 1 3 3 2 3 3 1 3 1 1 ... 3 1 ] + passed +==== cpu compact with scan ==== + elapsed time: 0.0076ms (std::chrono Measured) + [ 1 3 1 1 3 3 2 3 3 1 3 1 1 ... 1 3 ] + passed +==== work-efficient compact, power-of-two ==== + elapsed time: 0.011264ms (CUDA Measured) + passed +==== work-efficient compact, non-power-of-two ==== + elapsed time: 0.009216ms (CUDA Measured) + passed +\\\ + From f8784573b755e3a309a24330999bb09ac7e0b580 Mon Sep 17 00:00:00 2001 From: 0cfernandes00 Date: Tue, 16 Sep 2025 11:47:30 -0400 Subject: [PATCH 11/24] Update README.md --- README.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 62f4e520..2c1217a1 100644 --- a/README.md +++ b/README.md @@ -32,9 +32,9 @@ Can you find the performance bottlenecks? Is it memory I/O? Computation? Is it d This section implemented an Exclusive Prefix Sum (Scan), a Stream Compaction without scan, and finally built up to a Stream Compaction with scan. Stream Compaction with scan - 1) Map the input into a bools array of 0s and 1s - 2) Perform a prefix sum of the input array into the bool array - 3) The resulting scan (from step 2) will tell which index to scatter the input array to +1) Map the input into a bools array of 0s and 1s +2) Perform a prefix sum of the input array into the bool array +3) The resulting scan (from step 2) will tell which index to scatter the input array to ### Naive @@ -70,8 +70,7 @@ Thrust only ### Final Output -\\\ - +``` **************** ** SCAN TESTS ** **************** @@ -124,5 +123,4 @@ Thrust only ==== work-efficient compact, non-power-of-two ==== elapsed time: 0.009216ms (CUDA Measured) passed -\\\ - +``` From 3329b0ceb3fadef9f7cc8ca32767907756a130f4 Mon Sep 17 00:00:00 2001 From: 0cfernandes00 Date: Tue, 16 Sep 2025 11:54:58 -0400 Subject: [PATCH 12/24] Update README.md --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2c1217a1..da0dd751 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,7 @@ CUDA Stream Compaction * [LinkedIn](https://www.linkedin.com/in/caroline-fernandes-0-/), [personal website](https://0cfernandes00.wixsite.com/visualfx) * Tested on: Windows 11, i9-14900HX @ 2.20GHz, Nvidia GeForce RTX 4070 -### Project Intro - -Features & Sections +### Features & Sections - CPU Scan and Stream Compaction - Naive GPU Scan - Work Efficient Scan and Compaction @@ -26,8 +24,6 @@ This implementation of stream compaction is for removing zeroes from an array of In this process, I first implemented these algorithms on the CPU including Scan(Prefix Sum) and built up to a naive, work efficient, and thrust implementation of stream compaction. I also optimized my work efficient scan bringing the time on a non-power-of-2 array from 0.2 ms to 0.02ms -Can you find the performance bottlenecks? Is it memory I/O? Computation? Is it different for each implementation? - ### CPU This section implemented an Exclusive Prefix Sum (Scan), a Stream Compaction without scan, and finally built up to a Stream Compaction with scan. @@ -36,6 +32,8 @@ Stream Compaction with scan 2) Perform a prefix sum of the input array into the bool array 3) The resulting scan (from step 2) will tell which index to scatter the input array to +The primary performance hit for this implementation was Memory I/O, multiple reads and writes were most impactful as well as multiple passes over the data. +Smaller arrays size made this implementation look fast since there was little computation overhead compared to their parallel counterparts. ### Naive Pseudocode from [GPU Gems 3 Chapter 39 (Section 39.2.1)](https://developer.nvidia.com/gpugems/gpugems3/part-vi-gpu-computing/chapter-39-parallel-prefix-sum-scan-cuda) From 5239403c9699f287b112709933528d15cb94e26d Mon Sep 17 00:00:00 2001 From: Caroline Fernandes Date: Tue, 16 Sep 2025 14:25:38 -0400 Subject: [PATCH 13/24] add chart images --- img/Algorithm Speeds vs. Array Size.png | Bin 0 -> 37856 bytes ...Speeds vs. Algorithm (smaller is better).png | Bin 0 -> 16832 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/Algorithm Speeds vs. Array Size.png create mode 100644 img/Scan Algorithm Speeds vs. Algorithm (smaller is better).png diff --git a/img/Algorithm Speeds vs. Array Size.png b/img/Algorithm Speeds vs. Array Size.png new file mode 100644 index 0000000000000000000000000000000000000000..0411d6331a3b1189582358a5b57f8801b557cd43 GIT binary patch literal 37856 zcmd?RWn5I@+b%jNil~5sijpFwlF|(d(xD(AF@!WD-3+B7h)T!MAte%{Ff;=QD%~-_ zz#tt%NRIS=2LJm#``y3u;e0qB&i)<0j0|f%>xnzA>$>kn*b_}9ii>m?ArJ_Kin4+> z1adYJ0y!go;XL@}$4UGn2qXxiqVVvUx5>%`nK#2w^~r`5VehO;tHzsaF>v{dDvrKq z2VURH3ZeYjwE^Uo+7Wd6-_T%-KMdIZhKt8Z4gt8^Yp@<)GHM&)<52E^UE5v1Uu5D2qh8;*qdA31>wU^3vJ=@tIdFY0fbogx10 z_ptHw(!Z~R$caDyIY&Z6{QQ0C3bG3#teOCqm^cl57tFb zmOX`hjg9V)BEP#Z7*xDW%KwxOMcluB{knj86RFQqE~3-s;O|Ui2OinLJCLUlyS!{) zTPKgdn^7=1eRS-_5$3mEv)pqX0=W&%l``Xn)(E-A6z~|D=`co!#fF_xIz zrsJc7xuyIJ$L&#HtXq#Xr_3u$7zBx}J zz?qm4uwSr8I3i3|s(p;`zB4usvv&-H@2`~gbi)1;8cuky6%K;Z7P`8+r9NBp%KS_s zFBAPMDGOQs@*G%j>wz|XL-k(ZsFc-J&*o9)!vB0HoBP(n6x-gex`lMa2N)?`zS)J& zo8PU>=S=r*stft_>CQpa?7~8d#mPRVVMU%%PwB7vQ9>)Bp={B9QW6Zs#*s_nc6_)u zAMDl|#bSN1)gvp4t(m;RV>UQA*gEpfqAN-Y-Oa_yDu3pc+~8PEjYN`^PpQ>>L2-Kqw5vy%UjfBFZnmnRc#;PWex=OF5Tef zm$ov@&)7(Ds=ud}z-{-;g6r;G{>ZKA4}4>xm;J+i{nl}4YssXAclrX8C(kE4Y+DAu z=oZeVdEp+&>Kq+r_{`thg3p+&FP)e5U-yN6(`f$0gqciAU^_sURi?m76zX-r=Gn^L zqe%2EE#VBuW00a){BW@#)(O3npgX#)@JxO*@OUeOgEMpOiTr`(_G;y%qjurygx6#^ z-98S!F1@vWmP+b&wqm%wdnX)=U1@O+mG#Ban)>zSXfjWh48S%%p&JTx@)g&ZKTygK z`uYdfdaYMbiB8EJw??z3NG;Gi)%7h3_FwrVFTN__uwU&XuX?9^pJBhO5-;=j_nTG+ zOr6hG@?fPCxYfb222VP*f#jv3~f541~-&#!!;Xf#^?J9n{ zwjO$5SU2CD28+;073-53R4AR4gx6N*QSWJju#)MY%WZapmNtdv(Q5es*ftdnyT#XjI1Eoj6A5C2OQohkkSfqfBHD^oL zjiuzGt3@g`;mhvRw+;jitDMbqhL2W+Kil0MXu+1l^x61%3{iIr4E-r5^3hfFqK-mH z^PT0PXp;vHysKA-9Vn*v6Zdab%i8!Ozg2yI3jc~8@4+3(pytI5V^#>V!vuk`2ZXW# zOfk|_R%eyPD+62p;^)OOt&_Vi=*65f#q%bA5{&>BfonOE58u`M@*hhuy>}^bAYV(A z^UavWd~UO#M*|a~R7+tZR?|uBnWNK(O3%h15^F4dOdL+10Mp9qKqJpTO*yLCtw5V{ zinuHZd)8=$@{M`m7W%W^t{rQnh&-lLMmDBFnziUK;^wx9~z6V5I42gT+u z*bgVmg-BH&pX$+!Rxe`iTjjDM(Sa{)TRL|n@PzN;E7l0R+xHF>p24f#Yjbjb=&+YM zP1bXiJMu+93o%7Y0joRi)r4@7zW4u@3ulAUnXUMG88us=B-YC#`_?ipP+XKadJ5m020dv&v? z2eiZT2k>XRM8DN?Oy>iNB*#VlFu#1T#NK*sYJLx~6o2iT#XiU>S3)rzBk;r{3*;$URMPjPKw6c}>b;If+noI=8V zu-MDaxvwqAT^UK(5Xy0!teQ8pPa&s-{y0f8} zWszFFK&E{%TCX#=(`Hrh?sx5BKlgDyOU%M3F9QPXYh~y#$7UKx@^S~NDvj<)4_JW@ zTw~myw^CnQOA$TJROxL$fzwYVD}bN`kx?v^%s$GJqb|(7NK`6KuP?GHMY4*ZR9k^Azg&uyPeYGamM$u6)hI zcvm=aEtm%ft5`Yk9c@`zRUlxoZEKa)Wnp8nBUR%}LQc-k%-DLx?zAf{wJUEAe8w=U zim}SYl1U%Y>Y?>{-nd%I!a+Lp8XuD*GIv*dxuNExx*D}VWs2!!Ao6+3I9|EjtH0c$ zC8E`T1^1#7@idS#fzQ;@5yl^`1grO2bMZ<A z9QKQGc)=vwIzs{9mg@+Mj4_$X#YisiyjUauQaMbaGG=kz;f8@z=C^gc6|-CD@>1A0 z1QatK0GAv+5+T%xr+u~ROnkuc)i%m`vU1mY$;Ii4GqaIw4+Xu5P||l@r`quy`kk$T zqp{|Enj+iClr;=HTTH=Fn7Mm~O#bjPtQRxAOXoXz(81U6vSKHabiWMKk|qtW7|ky$ z_|;60LXF1$`n$m((olb5@-3pefl5N~YXI4{gf@lunt$E*f!uYY2FbN3tE1HEK5$a5 za1M`x*ysN<+Lyx{-8nV;_^*Dbz4mID>wvAM+Jk>$K8-~ubX3@jF?n}T!H7(d?jTVz zPAi4iuFn|ic4}iv*?6m(oxbD%PaKYGJ)m|sJ5pv-%Js-*a=hjf9i{MdHl0Fgy}n_} zp{#;62gG@f+HMD&ilyPS34Wo(e<{AzZ3KxF5AZ)hzhK2vLsMUU(^3Nz1#P-tY8P%VWJ^CC#PiK=P;2wP;&Jb^HI9iMm{ zVH=sbYq@N(#B3{2)!$m zt`Z5Zg&;NQ`6q74WeYQkx`EEHW)v{@-UHqvx*OxbbV8$hd-b zqe_F4Qc}2RI5kmTmDOI8{-VncvTO(5ZMYs`+uqDXY+G+e`0+<@E#$TdNYJcG5pe(# z!@W{q9YIM&!}XL0$Ge^a+cw#8qZx4hX3KcuO#^uigP$(bo9ttj0Qau`k=I zCtW()f-X_Sar`c`|8}&UQN_#Xxei1}D06`AS~kHWJ}#~`?w-!54Lo?W}yIg0ud_y_3PKIBE-4=h=~aj4?OlWK>K=R`#U~y zXHcqeoVYI^ayg7)03u}Z>vBPHvG7A3d2EqES*NF_W<)ho4L&hk0_A!o*T`TB$Pu|N zuI0Ta9Pps%16_Un4lwJ^ib~J<&ZK#7A0Hpf1_WW_1)4bp#|Pm5?)oGjfaAkRQ>XNf z>pifo(#o0YKop_Ee(3&I8IfrQdFQa1Dbh0)qG5DQ*?o{_dV1E5Fv!5_`}gk^TT*6* zYm;k>(I4rQ(L&qRsNpqTln*oC@WHpGBhPgl_yI$|=u z`I*t%b7kb}Qkzk!W!Tc5+fo2rIUj*8mUrHHkf)Ji?Ms<*DISO2Pj<&*>tg2?D?)~z z*G1Cek48`>B_+J2#pV0H#v64ad~nJ110}fAzF@z3D{&{UM8=V-Gs-MeeB@nyjIDOd zuioY3;^Hcuq*VV_;o)5nqI#r{WFBP6z|C|`9RGep^(llKag^FOBHTsX9Iep&n(eYa z%#7-G`6xCFH<^oUmOQ*k9QlQcO5@;Ewl9yFo4c*G+rzK94r!nBN=pSw(EuS?Gk3t@ zKi*yKGBGMxS@@V&O?PlKvOR)B!&$NW`)JHdj{Px^?bg@(Gop`+h~wR6x<{T!WDEk5 zOMj-CyDY`VVDsIL%cWOB96fj@W%2a2_)Lyp0=HadNjdWc>2wyDBGHGQatw z!LfO7*y(v{**FcE6-XzkA$a4(-R2b{D!0enFBF}(6GdUMJQEGoggjZ+BLkw0ASXrK z{Hn$FcrNFL&RfhYc3-YKF^jv~)|o$wx!HGZMHBTG@* z(B&Uk8hcqAAzbpQbq`$m+*6D+LfqTXd@CSjq>$tz{^GznsAyXWDr3xq1VHiJI^kq<}#epv&$_njg^14fw(UeyhKODbw zb#q&tAb#Il6nE}a(2&DCYW)AQ^3g~O91(X;=sSTFQX>Mym>*L;fyZUnu3b~8;8ah% zE&KO7mF4u0uxNkZL%zU0HA_j8eX)(+8rv>myM8wD%~sY^1;Sl2y(Ka~j~y`TQgmT+ zFM$AbiLu(5fXR(v5BFWKmSd*!mV=enNg5)PSsE?NKb)p*h&otrFa>)?&qxTcmfi1* zoPB+XH;M>4B$zbZ4oET!LGYGiaIBg-pCse&Yk5#oyB70-uYTkZ-#;UY^R@u9*+}=U zc$UvuOUEsr^&}g+nwyJ3sP2y)9}^lx_gP=n%0eH**ZX$&ilx(84d||&{B4myd1)^H36?D{6~ zRbe+H`IPkF5~IrQLwtys^f6%3N!SCzI-(F+Zy2!GVcIT?F=l0FXOC{_r|H6&212`~ zwmMrY@ZqAksDPvW#}()oX_?F4Y`diA`)THNw4`+d2(^>K7dvsuz$vSb_wik@hP4`e zPF-Ey)3o}QnFz`5;E}diPNiLVMw#$y_$IaeMlU8lKHlp1iP^drk5Pqsx9o|Z`10rM z&K_Y_)@+pta?aG-AoPn??o7sNO0?D_GJSaz>XYj)hNC;sgvT1ETA{q$MgYixtlE(02(Z8jPH!?qd6-Q)0ebhN`k zxxTJ$8!(iu)(Zdeq45C7qCF7qYH|kB3zR>Xvq?%~Ny!MiRtTuIBVn;mK7rfdg(G1V ztDnFN1v?9@M!>fBcERV*{I6D~LYYefZx_h+9WG`^=AckQrNy{_1BdFp`IMh7pU7|t znorOzDYeBc${9ApMFy^i8!bx3KGR{GmVlaR>*!cCg;1953=<`uJTE1!`nodOTA93K0li#?ilJ@E&lKlVEfS^1An z*axYvt}f&rFu_+I&?J8X%8tJix&`VhTTF5O&Ai}{8B=kIa0HXD-6I~Rz`xDRcLL>X zBM3YA^;gF-OSU1lE$Cz{6$DB_LL-N;Bx_ADRI`V{SUKBzqzS2hn{Ax)6~_mif<1{? zpdffGk61*8ZyVY>*L`^3xDf> ztG@H;sBXo7*TyW+30;TXSNf>NTm8e2QexJ7u08%K{@;SV7kflxWgGfr{CoBfR_&K| z@CW5K?L!U|RFI{hAo5JLKn1i#oqYPh8>4UH^VqsG(LAJ9gn&blZ2_UlR_MD#cxzil%z zYp`QwpPMZ)B~a{QRY!eBaW(&Mbn*A)W-3{ssdlFQ<$g>F@*#Z5{lZsDl8<^ePO$Yw zfC{9QBqk1=6e`ge*I)ac688@T!zz%~J#y88 z*YQ`L`=8)u=vse;)7w0%l$?qr1TgNvOMQ3jw^}mo2J%!qJjxA96+-LbfeWiW-$k5o zQd>%Q(-@Q+s8U26VhT%Y?hEu?g}8fwaQsfk#3Wr@eAgs9&)tZCcR}nf8vD$}TR%@t ze_11MAMgKqd14rLh*A=wEB-KC*J4yt%!#IZvBPEvU;Z?-=-epdzn_@&php7FJzC{r zF(?5y;=H>*+Cz(P;-4|b?X={QiL+9!8=$8A2#-woU!$VirDs(RsX&8Um& z`GEtclsT>v6tGihnnWI1*WyuH2oU!KgV&qSg{*;EgPlo&b3jiQk+opFfApPd8VX$Dn#J#!mcoRKJO-#2sl{8cC= z7H=EWd4GfUD+Bwmw6Phm6`~7Q%xGp~ZGyM#|GSG_k$1WEGKeZO?3N$P+3@72>;)Va{FbEWOvK?UJG)tm$%Ta!!)-aMWpg37BHN}9bzPWK>IKz! zQ=JP_#pflK1Xs;RO)6^pT-}*PX*H@ehHp4kPzh5Pu6^wDpRKRvOZ;7Z zH_*zs#WQ}Pqkt8e;E-GUgZyN@I6kATOE5#qS;<}EKO^j<`XRXQJ$G1lyrVZ!pRB#L zKBu$hK+T^bneff${kZhPXzOmxG|wi%MO3k(Z|}4u86;HEkf$C&j~m$LPZ!)hUu`+P zT3YJ-271FQjqwf;dUTkJnRy~D(e~?#od2ME|44|xxa)SWnpO82yES~eLR~!YkcZke zHD~$7+t%kT6$vYGf-T$eX>;%u`9+0Oua=`Tf}&J3nf)Csjn2-fu==LpS<%zQAFkg? zk<>GWz9?B8gh};PpPEmQP=cw!-N3Fzo>xzLU*at#=@Z!qBkl`RXMaUC2Jc4u;qoknrx(dJ*fhI}4hisn5?#1XRg z_&N$Z$e8aw%2zxkA^pZCKTVeCDI){vJ&KJV?8uB7mo~3pvI;pP>-x7%etp?0mCpe> z6z0buUczIKI!&zAp=*Mf5oj?)YyaPiwZ(cyMqI+e!n=++w@%BrL3)KHB?(`?+=q+y z15F0pB3F2oKkHwdGYk(Re|$QPUVBpYyZ^a?)$GwfA41WQ(7ZogUgpq+#3!dm3@KJ@ z48CJVbU$0+GaT3c9}KB{X~44^fzw%wFKaPzVt)U;%I2-H)JBHuaALjd#I_O}^3!eC zmjO6|YWL|?*I$b=u1DKSR+S6Sf6d<`o-uuSCQaNcn80l6H&G$`mdmRw^aQ65?WJf~*Df3u(&q1G`i?=;YF3vcNMh;)T|doQ4eKt8KBzDA zRj#54e<^CyT+gudV2N_;rkuX~zx4(2A{SkzZmGRZKy*5DoV5huY@I*}U4b8ZyXCf zXR>UKl*kF#HRA4P!my?~)=gQvipy7q)HraCO*szMe-)~GP@$|?;qQimgXIEG*jYH) zXg@am+&24iQncS0{1~xoZ6Y-#BF>VnpDn>B&4OX-e=nig*!NBMoIP8?3o4Ry+uL)(iWvb0Fb!z;LV1F>cQUC%s@$?bnW;T3-{^cw~Xvt$d1U zzpk?$3!j(aCQ`^2Jt$U};lgEDWjR9lP z1J3@jHwM~9*1oc|3rKYgH+hx_!S|J)w8aI4Ju~STcE53-876 z98@H)Z}n=>%uRC1Bq)`d2*>Iz5&9|L_a*QCz&mdkS?>r+BYdSdM^bOiM{;93JX0nq zGR6OG(wwNV+N}%cx+-=B>>CGR-00zJPLA%-TobPX4?`p-=`p>Gk)aXO=t3^dMW3_t z!466DmW;L(6rOZ{gcj|75B$z2dD37+cR~2(nE3<4fy{zeI&bpNKcVI^7#( z0ii+LGgxbFXpnJBz1SqB;Ja?<^%{&vcZbpa{D``mr+kr=?1NDkf5hm2(@&r+5tY~Q zXf2?W9%A`iQx`$0QvT)zDsS>JcfF+G|Bo7NE_4SwtV%4<_)bQ{~Hqr2j!)AS1ziI*i|pZ1YO# zEr3}qSE!v`nQWP`9sa4X-`|$E?fZMQ_C`ul@Z|H2FsbC7^i<``2Tg4r(ygB2~NC*&@A;$nfgq^aiFS=y+Ilgx>5)&Cs zi=d2wFUaueYoblNZ%*W^Joz~6ZavkJKW>qL@^Ngd74V)=PD1%ta8J|@Uxt?32%neW z`Zw5@!a@Uu`b+({UW=|xS|@yK8H4gVfi2HRDCt-jn-0+K1$WjGWrCrUPuC7 zUwUa+=rWXIRO{01^Z(X(A#t@3Rq;qH7Yld6 z%rY5IF~YQ5nll`>Sz;LdL@9|b! zcn11dw@C`vI)spCOSpS@Jto1wKf`#MtB8B%YvpmhwAwPX6Zi{jg?c;)t?KE||Avf@ z@Vl2|zb1s1c+z_&6%1t+`c4uZFWRV{KeC$raAeLSes|!^BHOiV2}?tRI1LDt_TL#o zSRD^ceTQm3HK7fMNg*C~4Io6F~BoE`{%88h#5l&I4MH#uWkXb-WS<6oN17S_5& z1Z$Q%OCVP+{d;=B2R^g_M|xP3eg{dUwd{moN1W(OXOLM)G(=afW*ZmM_!qxOMgpIcOUiIm+@t za!CKJjgB7%gVC>E5|03?S!+KUW(9y^+2Aiud`mmDEF-!w569}i1=y1utyND%jaiSYAomXHDW>(38d-adzY%MT(Cw1D#_I)+sy4tTf0byzc%9@qEl zv?{h8GtqF;c?Op6@raPKvnL^E=eJt}QgkYeUtbEyu3V9a^s*DVTCtPAS~}>8+WRG1 z&!WWakD8sG9RZ9m^X$dq+NY0d&yUt-U!3!2`>rd^UiBIKim6jNL(O?_FPhHgBsC;+ zB-0bQ$658K=fPQPTL)9}x#JcbMUF8HzK7kvDM1Cu>M_3ISZ%F#UFIGipQyZLkL0>k zEl}^><-jbJosaq0`L|$Gfsq$O8|^$*(2W6tm-W7Q2~j5cFo&Lh!0EAyOERn#B~ zXy1t^TAsTR*KJOW(d=0h>nT$u)L&wx;k$`7tJunvn%)q}PLJ3xPaBKIZpdsLS&Ka{ zp>iT+M=c%yv0$){SRJp{0RoC~U`9xg!PBQ#eJBd`kvCe%Wu3YQrdk@h1|7z$zO}(} z`?UKKc#N#;WBYvfJPgv~x%3t7cRX)jvF-0zAKvrt3@AqZNSTk`RcusmJUN;?Njjl< zDxte4+OVfl2=KW3`By%&SMx2+v;8&qRLQ$f-jb)c)AQ@v63BKihTXENkMK_RQVJCh z%cK*t#{T%9v~2sGVSGy5>Xn-kj9?#_{Qf-j*&VgX&C62^xqRym+IOdvXxW^Z5Bu*K z^mOG{Sy#R5C6_I6z1`pF5x%6-OO&3!>k2m4W~BBNWp=emfRP*e z(81$!8WmvgW4eJmL;4+6#kOe>^vXat!|r)xDetu?&KrkDyL#7+uFKKA%SM={ zKAAaC9*}MFF8}$!ostL>qY^w5=Gw{!m||LP)bV=t_-O88;zrrSgCDU7(sTD-|G7LT zs?saG9>=&8+E^iAy(U|-+tsASQH#75pA)VCb7a(8Bzx8w*y54_J9ehZ|BEA$Pl zr+h8y#{5cm0*!!glJnkdlPKFYtNxhhVm{|z%y^NWQoEYE0?GL{mu7gf^IlW`tLRY+ zn(u9b|8;+FZa7XtqlTikGq|HtFTk2Pf}XQS?&V>G95Gh=TJ>VC>+Me{^Q}L#qJ2`H2wcNP0a$3{SGZQCpe5vgr-E=3h#bZ^V8Ld<{N_N zy)Wb2k}JfeKRH_i5a}uYaF_784xgKL{ygYB>b42heqP?gyAfaJlt3y#g=pM9!PGl| zAfKq*A*1_R?c_$F5mxCD4EdqK!C(84xYo}}&%oQ7IHirs>09Av{nU!>)nczO7l!HB zoY+pW{?A9;2P~$edd5*;YV!*pQ&h~DK|TyHXmk_FAwsm%+xY(SSVbjU+?KkSErVr~qV2%hDd`Akf5oTmrk^hl z7KA8Bz8T_LG~^XO-e_N%6#DVQ9`9&N7xM!3yHqeGXW4@G-x|=-wGh7<-Y+V>V z=+l>hAEK>KPh96YfPb3w9_8c+ug*261P(hv&D#tSB}iGjbeDI*u4E(EmC1x_lSBSK zFJ>zw&U`aeh#bt^7Q1!2xZ?y4u((USvX#VN-Z;!td53rsesu3n7ZGL3g;t6M#-|E> zsw78Hbq5-p$;yOIXP70CBGPo2d2RgVQ=42o&p|S8oi04fYR!vsZFa<5TBFL(XY^niH6o1c-+#j4Sgk^Cjo{z_WGFT10rj2ZPDX5u7iZQ`_z1)UiN8zEhXCP6e#0M&i zr`@WU{8Xu4HF(RyX5H{5;xFfu``@i>gt_H6HC!%oj$MZYv7N>R)uFd%HXG{@>QyT; z(-+I;tx^iw;(s^EihwI+r{j3axge0@)8*dNVJwQq+7N&T0x_ZE%cpS9FsIbbcRZl}L^>q(j*XEBcz~$Z4O-E6IDZm@^|6U^R+}HE3GTs-BZVUid z|2|8cudUYstbG=E0RPnHxQl38MCk+=`%x`fN|>K|m9d+Lw^A|m4CD_v5iOz$o4)wF zj^;>eRMmM;%d#V1AfeMKy~CVT-14P!56o{-Lu`#sx69E}|61!~8b`sYQp{{^?&q5D zkT1&uY_O6YZh3)LaONnI)2Gvl=T^IRkI<`E)y;n(%SBa;^KK|*D!f+fv3(vgYczdL z;~UrohhSoy9~2wV*G4DDN=E7T63qU8bBGG*pnI95(Ay-u_|iqqXqF??EO zqIt_F9=Ji5kDmP-56>{Z)Y7@BCwmP$v3uNy@?tO7h?vyj)Q0kgu{5(R7&oVCbskU7n;8eV8Vui z->D$Cg^7OH=tWa$)&8y77vzlP&F{PB8Di99n~Sfklq+QHXu)c35qI>j{olN{exi27 zJ82}?DYFv!q?i|u5*rjBa$B1G;Y(ME%u&LioqUe5t`*$Na@Z0OO|5zgJ{#2xdLD!ixA?nZ{I7=lBjmVec&+mWOm85qy@>?@9Nl238^)M zwye&|7{19)&>`P52U5ikjyLdok^o=-e0PM2$W4w+i5S%$%*D;Ok6Iu_r%Hin2@Jf6*G@R!c^ue5!U>e^IWeY5{PTrj zp!vJ*FT#LxS?S3ZTpR=g-)KMT0hbO>Gzzdmdc#gF`&q|sNo=f=2?(LmZW#z5LPGl` zG?gEvtT_P_yiGnQWuXrSJ(ad??{GOK9SUcIU>#|V=6J|yi$H09Hhf*^I~3ZHWP07E zC!gptG^b!fF>k#yW+wEcIk>|HQOC;C@=eV!zeM@<=mdQNi@0&Be;IL$IZt8B)fqQy z)k<>&fK2=EBUhS>=bt&mn++rB5?J<<07WA10OzTC|0^n-W-c*HTD^(^CDJT2Zm-$) zh`dw$lliR}3kCbl72<`bTgCCj{_9{+!NUQkZd@NQt{tM^(UK=%*#XW0b#I7V@<7&C zI$jUk6(Du(PU&4*^_v0vf_I|K*T~?!d+uFR%O0&Mi_ z;viC2ED$}4Rvw(oZHlE*RzQs>g4LiAmOvY*&GC4oOKt370OD!r`&e0GUUGj3-cT7D z8Y1?5h~taOW+f;0B8a6s*B@7vTB{e*x!#abC4g6`4tN2Vi?^5eaP1ji09eguHoo*F zvPZCbcrE^SOan2XGrH_{Re(?ieb#g}ZgCD47x@%HUoZGC;ty}dnw zfJ5)H6VN+Q@bTt@rh0ILvbJufqGQq!u;l?IQ!f1bN?;b#&m0qeADRwp&08d}7&rkN zs`(msu2YQ<{cLmdg_c%2XzZkgx<{kw!AnY6K&;wVhmQnzfYJh=k(%ci7$DA4#cY>= zZ=RdBcx=B#JS|#8>1iO;a`6Z=mYFjF_I)$(!)(Gju!5iWZnC^eI)O6t>KossF8T_> zrrqs15RI-U4O0qip z3IhB!NN>!zRKA;T02AC%KfoNnS)*FZ=JQ>ZyreD%SRgViRu%|7kesYIGIffWv*#~I zfsPD?8n1Q7U5Z-*3dh^|vIg-WteJq&)M1xh@?dJSqBB27;<*Ka4Ot=g`h(VIDnwZW zXZNuWaHQKB;KjF^X7e7gnaiWKUdT}b-t@%q254u|1z_D9M8oJc))Jwq&3YfcWDmY0 zaE@`m4>K@Y^EAi$l_U^na64eBC!G^%Je=0Xj!knkmnNf#s3|5-I)2Q;py6`cMjj_f z9H;UY^amg+1P44;0}w>oj7u=z-n__ zVHe`}v;_z{d-Y=M24G(yPr=4SFiH*=`Pi8Twh>F-3i+{wZBwbn;0~G)LQGOMh}t>g z*Xh~BPCkRU5pYj)&KhK}AnRPIpNs*2r(&X`SzgIC$_$!=*MB}hE<=>VK*21u%tUx< z6L|}5^*#N%r%He7ksDjoUK+@1vkK8;`#S|Bpsl%Gr{6r3k?5qmYm}?Av05D9jK-i2 zUp3d#PiYfSjzIyTQY~hFmMXfjQyzHLmkxzTy2Ne*9#tPzIw9LAqN`uLc=5-E3%aD@ z6B?19>Ut5FXK%^p)wP_V4IUIrqE(J?gQ#c0A?gFD=Q;cf#c<*DN8ek*3D66A2#cfp?Z<{%M7 zUD4J)GmcZcuGQGt(Gd$8s!tmXVjRnEbR}F;nt0hXH_Cd@KKNEJd5~=&fhUReXVQd5 zRZ-f8@MzudISyfBLjrzWV@nwh6K5}vW&-a0H^ggoj2*mg_YEy+^>1uaNT%@S{oVGT zG$$Z2S;el!p><_=mULq|zdvpnBp7##KT4%OvCcXN$*GLX&534JYJaN4XjRgXD&t>s z?fUhkB+IR>Evu$ra_f`Gz(b2$GJaM5n7D7Df2ajWAP!baqmJTE;~IcK3hxArf~p{b z?PtMrP9WzLW^{7m^{1chdGT;UAonzsLCCg_$q?+3(y8A{TW@_x#>h5#fFsPNx^+jt zI!l&3!+3p)8q%u=6nqYwh$UFl9EBiL?0bnoYj=-bE7jXufA*b|CZIVbt-K_VOkHIa z6=HfEYXZ0%$P9%bKl^(I7Elh4u&cQ2`fKPy*K2L2> zt%0=BlYp(sCX)=v_)sao(E*)>ef4Q07$xaA43n z5rgIQe&#V%t~4j6+^@@S2hOhco@&m0rbIu?63hJnvLIwkq5Z72on66r;K|YEK*sSi zN}0cAW$U1^9^ru>CWbtB9>AHnS}qq;A()ZO7R;LOb?Oz*Yz6d#Op5$j&`#`zu@wZb z=Moc*A9z)R`r_L=f@PF9`Q;*H_H7HPAweZGX+!erUk7m=SB>( zdPiITB}iMnc_4%|9Pc2NhHKr=<~atg!c4akNPuoiZ1l&UNZ7?N}~Yg1v;`O2ZAbRa0*F z&6Mhn3>d4txE99Lsh}h3Wq`8KFTmO^f)#+SSJxIsuhwWKrhB0buI~>2gv!RHIM%4V z|8Q&gEM!pvkX$LD6Dy#y(DfPJm_wq}sPj9biqPF&RtbaXoc3!$IBruh}5bXzYXOc{G(m8t5OxKRZVZA7)E2&k7K*h;Js zq_oEcATym@%@@Lg%ygR_?2uA89XlDLdsOvtzavkchdva=7dq6;5&tYtF? z_@2B|x)h|va}C$?eQN36K4lXo0P0g=nkHQ)S16l3;4@lx&SP5^jXRvi`5 zlIOqti7-69N6n`(Rlw@~HXajcU_kB4o!2QIvOo^*A~H+=bI1qKTF2A`^eO#J>m2| zWpE#O1w96I;3+?R_)3ft16t@M5C*k3+Q^&X000kuI#F&VA7v+ZY1a#upNk|;)*rA- zB1~HR3XX3T&s%*S1bYMZF&U!>#^HhB4*dj*8~O3E>tc^}*!b~AM3-<3X*&byO^TWZ zpzjfA>-Y~XG>{&YN&VWpM(9$I+3AQfK1~Rk#Eu%d*D}VUW27AxA-hppq94nsIJr@C z8-O^y^ly^649+dOG-!$PRe9)70fif&E`u)L6r|y;rKlwqjjWk9)j#XKhLy+we_o>^ z1{#U$+6)kgOD~?w^tl8`$TJ~?I3RqEvWJncAb$5Z5G4#AP-p=X2E<(gyb`qicvAinkJD%jcf1zNeN+4+T11rwdQ8j311yNMuP0bUzwG6^1 za>Rs^F$<`BVu|~fkW|joWhry%YR)OvvNg3a^L~FE_&~n* zWnaWw*ZmY&CSCawS(r{mlbaUfa79z<&E-dnkeZ4kVJp|U!2^K#L2fE7A31ZFS ziS!00fPeyQgNQDTQ)*PGOZ~z?Zpp-}`Sbk5#f;C=_W^syT7~HF3os}IvS=<*A3W)_ zFwq=!1^X6`+gzg{!^Q%;peI$&{D3vms$s1;BmO)yk1;T&Q$GtZDy+nP7SESZ~4I4k`UmZ~=5(J}{8NnJZ zb=>QU2N=by$tuH+O3lvUEtFa`-#+CQ`BQ*sBY)m=n&>P8MsOn^CAQQ7jaSXK*&&?ZP}OXlUvME&4uf)>)D!pLF6S@? zJ-8|bm!DzTT?Wkm?oSo~5OvJ0UDiQNjvYL?^w!&#Mfh#;fr8N7^4 zDryh&;lA^XUgq9mhVwh9S7wo4u8$_UZj!?pj@}(^K4U&&uUT+M?Sd3%`S)2HuOZnN zOMynq2o`b9L*{S+VhrRB4+`sMdFEgpNwMlZA>%5y)BPuG0yEb*coHGrH;`5QAhH_1 zDU?o1$kv96u9<)Dg>K!bzt-SFkrsoSH_Gi43>%s0_AupeT1EJK~@ z*hi6PNoW@7emSMEPlQ0No96HxM&I1uMU*`E_c;p8whkCFo&>2xf*1q(+rMhWHcgcR zUI98DDydqKC9NMnel`u6<=<-I2LzsxgvO5b=H=w`xBdOUdghQP5c}EWMKr%swPlMq>~f@l@T#VYrSQ0+0PmG zJp20Y2>TEbx!s4LFckQ+F8#5ZxUKORFW|e5-daf&f*rhJDP>+ClcL9hJLVR`NIQse zh1f)52Re{)n4zAt-_9XZoPA#WniJr2Du7Z~_I8UBli+dQ4bF3CA-5T?@<)pRYxFIk z7-~biWdP0R;2oFM5{?ZS>;A|(DW_F{4VzvDQkWdjUi*QZq|B`QimuvYxB--|u%BU8 z4jb0BY%*E*$xD_;L0Hb3UfCN5(G$W%s-8n}h9iopefj=u%~B)?w!0&EE0{{NM0MB~ zuDIVZvBabkA$A}@1b1dEW_KK}@V_cSR@Er@YE=X73v{qMk{yH*b{Cf~70UehlV#4W zB!ZyJ{b3-lKyF|BH=o6^i}yd|wB$$v`8v=;@|I@Xng2*Nj(5u2-aZ5SarNJRxI@Qu z3ZxV0c+1Ij-~zEz*FMHHcAk__A-H(2kn0hP+r)Mm;u;r|x9QZ-!`jWcCh!7`83!wB z#)G_5tO{Tpqh>onTVTvVH^3W&(owu%xf;U{i>w|TYU5w@J+~% zuzyEaa|4Re##9bE7vQ1GH3;%cdaBNIxq!j8G282d;Yk1Ia1X#afj+2epnicih}UhG zZHgzjzW?ML4DA@5B$ld)qq4pG&!{1Gl4Z01*feNzqIPAd&3UXj#{sIukB=;6wj!zX zU%UaC0}>50Nwl zU6lX^$i-YpRHiQ<%B4=+D|bHl0s?C^(9M62imI_GAUS$(T^<#C7;$S1NN-fb5h$vb zpZ8inpR5NNgv`D;{taSF5AlA@ArW$38IjV<4|CpXiM&zMiha_pGu0?A$siV+_?B8O zg|5oF>L33$PvIC1ouMAvXb1A4$aptkk*At_zgFh6)FyK3G4~8oT1JZmc3TFq6L5de z1+wnro!Ee2`&A`KZ-j~I@l*M#I(6XBR?LnDV#@ZJLJgBsK%E2H0}7bpmAhAM)}NC* z)G58bbTTgX(mrL!gPd1V?GZNpdOjPMUup6W?F$g&Qd?F=01lYX=u;<}I1lg7!wym&yYj;Xl=q=rNmPmuK@!BF?U z&n>9f9;i*n@sg8uM;(DlJ)tj(1#ujR-)*eOxVg9Z)tDPV4y-wRcO0?o%2vY-qJ%A+ zRQ>kT@^jO(REXYvqvlszq8evy<}2B&rq7VCdh4c^=1xhn)hjYboig~XPEHUUPZ?=hz;$+KChHQCORL_}-~?~Z zljVf0=&nHD*8!0(E`V=kkI@w>f$BR&nyqo zrEv-F(v1^5Nbukg+})i3!2`kF-K~K}{$lU<`^Ni^an9|zICa73hC$V; zC6CNC*E7wZ6FZVWCpK{0TTpASZ_CfKEGllcf@B8&NPqD595Hs&aLH-TZ}S?tp%}Zu z!EJ?9!{Dp|qPLHiJ$b}Nw zjahPUYk9eD-G8{CU0;Oa;^B=s{PLBa`0e~iIfjj$xRV!&uXPuU3=B2?aI0huQbyR( z{85{LQtzBn0wWuPtMcku7C(oq+RXM+kIqgsNCRx~$oVsosz=}l2n32#2b%Wz+tIQq z@`&N5m6lPo)JH}Ud(uS16xWq^wH$Z`U!rzBFmlfqG)yK}e>p*eZApKIZS&19x7)DH z4_*}=R-Y%z?7xXB*em7WfPYxbBfFA#t*c%!(l*qz_=A~9vgls2?DO(6_NL=0(l4%o!{)=+=IdqeC_&y*4bCujjA#Nb@6LF zY&j)5=Ao1Vn$0%D=x-X^BVH~$w8ps{npm^g>#EQ-7}UkNHulYUiw|uUF7e_iIduRX z^ebx`zcq2E2V`gFxpEhP$0t|-R=fyOc5SllLOMHGbKAI;#_1pECR<1$m{V_(oRdFh zZaSqBTb*1#PF&o)!JneBq!{ocYmc0zf(!F)(>HorLj?`i+HBL$3RJ%qOML>x9?zQ~nh;ZS?zI2;%G@>|@_)NoMt;Cz*>QF;8q?EE4R zs|YrpO~FqmQOd6I@uiI5;+xe}?km@P)uWVXsXzL`kYI|A9^0FW^ z9|{lP2?7+lLJ9-vo`06qaGvL$B)5kjos%F`$)TuB%FdR>$2m9Xp(yi?!Wn2R8HhPU zlSxWSL%De>e+x}5e8WlI4yntn)-EQna#cQ$vFspk`ciYDbzbQ8U~q}YZB5vT|M9dt z74K}+0X93otOx&*Z1o}(aZ7gamSnnp8ZB$fUaS5^v-x1)&m%=3gbgZRNNL^08>`vvi^uR-F|KM}#=QQg>f_fYk z;(bk~79aaohZ%vuiBd=YAg3$m@2^Ft30?W2!h=T3Xkn16FxLiR6mI5HwB`J!LzQv(w8$r;Q7zO`rB6z~d$YtdEui zFXFZ~t^L)zX>8q-zt5UU_f6vf#gK2c4;D z?Q(>doumm3Mse%Af{PK2!J zZON$@@ockfnD(PeHXK&?xznRMr@=;+n^%R#&_$re^2eO|{mq9$_j`W0Sw&9hF`3hY zgTdCzHy$h4F7xsZz`K3T(LS6hHgc?bdbiqau{TYZmh0#BI$k3K`nzQ!`f-iGQYc8E z#B22ow16&iA)2!Q(~3#NzKl#N9Xeq zjgqkCvGJ^OmF%UQYdXAWd{A6e#yFyStH|ODanpGnhJ4kYv;*7HoKMTJ#8aGK`=|H;iP>Grtd`C zCp5NQ_h7H|w>U@)c=Y+f5gmf#?`4o#tl z`Ja+1EQ zpwG9-g{of4k+Txr%5LnP!Um7dJk>l1Cb>{;@8-PX4{}i?IP@%#1M0tZc+}$YjfP;Q zIw{2L6osp5{t3?y2eB;HfA}oLNgQW?z2p6%6Ni63ViemO4PvQecgZh9l0ZFsrZ^1U zG68}t$K#I^bO1tr3LmaD4ozk$_uWd@a=s~& zzK3=#oDVKQ%18^Q=4EphzvZi*#x%7wR<(bdiSOa6Z5-EU*w5$W|X#%m(Hyu4cuN->( zz9XTs0LA4d!Ay$7YC+7?_>VnVyo>FXGF_%T3V##8X)x7YWjeUgay}CKRH=f!?b>Lz zuGG7`eP?EpkaNt*aekt2bDYbqu=cLxM&GnkrqSJ5a1tYoy22(;_=o*9C3?026YJDD z66^LK7efW8V3B3E0eUXe-aG#R@-f#|OXMh)Z@wNyEcWTlW0Q#_^ZGnjDWzBWKYw;D z2F=q~UAygZD?DG-pHFiSjmfFU6MFp}MN}nTk4sLV=|TO{uE^q}TD0UnJd}Md(x;H# zUfF1Yee0wM)|I^+0>;xP_Ahv2*pXw6OT#~#yA-Mrv z%%n^E5&rGp8~w49REfYD_d%d;#nw_Fsiq!+Q>UL=RhfM_>5_mUjGViLFudEifpW{3 zU7$hxkarj@vNYn^o^BIDkS!^j*OaGahNz|&sEimIg`Q9lc4Ih#cC+08C!fxQgsPK$ z+z=#W`dR#Fh&-fXgtXoAR~09z4$fVT`gz??cR(y~&j-yq9l=SKXbjtPt8FH3gXcnA zU-o^z%i&Fxgk`I$%Urw0y`q6#v1TDeU_V=9ll0>i&fYRby;?a~A^TI8uk>sO1?OUX zLMt-^)aJaXi+r|CBFwh+(?I$W&FTU<+;Kn-GfA?4`@A10&T`b2^z?#%v8--vSeMuv zdjwTSb5J_*3E6Q}C%qdDBTWZG)7GXQQY?_wh7cs8EJoD=_&_{>tFKU`nkjRr!-Cqtk>?z$9tM6tOm5bA zCZvQSY%zlLIz*zeqbrlJsW8;7o`ED(uAP0kv$!-^BhWTLJ zp+$$(!9T;7<>xPBR$?XMq=B}#WRdcVFvdOgbr(>YAr}feItpJ0D*yaW=C+y{|8sS~ z#R%0wsLsw7laY}z(H}!-w7yuZ%D2dvi?neYao5(CJD{sqfWBq;_DYpVhLP3;{I2aM zdaU5!@cvE{i8A1DvlFzL*xBoj>j6SaUEG0kXDyJm(dSzfH(^667NfqGuIh~J-BdZ< zz#T14g_XGz{qK*5cBgD$^oyBO9(goU4^>e0KRib?BCfs08Co50yJC^a5qX))Lq|-_mHRBVTmAuoNj3h~OXo z^!rzP;8)p$I(+Do#Yc*2f?AxJ8SD7e}E!jrO9wd9v+_Rr;`*E)r}nH zRxLs8J$+3)0MUT6Np{#d}cud30-kK@zt5)PHi(rsTgJkDg%!s|qk|iUsa;@}m{)Cs{ z(0OpX8lmCgw19FJ{jwT_LCK*AFFny9>Np9jq6L z1=AR-FC{!C>`hP)JN_hdzxAOWi+{AT*0;3fd=SoN8F{A{4(Y zeIa*oL)>hYz$#QR;N`GLLl_BcA()Z7Y&61N5AX@OGo1B~q9G9An__vcI;?plV7w~e zrcnEyYPS>_+x#4x2MjVsM|9#g& zc|WggqHiy4&I9m!QpMa>bgyMYZCg}o?vV~@c!ysU^{T6@$t>4)tNs%%|7gUqGRylk zf1iA>{iPY~V#hGx{y(n|gkxCG<%&3jqZze3+v%Hb5JFk`S)QPnT9DK6tHTalAfVbW zH>)}ebM!FnM`hLp3v97#IosDl6Mxl2gLqvy^B=96gESQ2I2 z?@1?tDudD&ihhgE>Ph*meZJBF3ZWH%5E~hPv|JkGTf|v=4SRvOZ5PquQC?JJ$u>Vm zj5wD0Qk6={#`x4#%gH2`l}(dT@ONqd_8FC&E57R=wj{1k#NXc`3rl$uLdRXKDD^yI5 z=@1EJe{AO-y?hJ-H!iiJD#hlZBH;tx6j7y5R_zg%10X`m&V!Q)Mri&I|yH3heA4g-gXrt5BA#2F8$3|P~ z2175`@+25P^_@6Pvs)M+Gi$yKuqpb&XmueqDS8Xj-j5{K2oZd_jbw~yATgR~+GLK_Z4ku5;j(PqSoFELhkdylMqTX%s z<>MTW5ldUO+R!=+v`Kcz*iEE-00#Mm{rO>l`@P45TcvnxyfBkKGlB6s925Ky(ZP62xgu9)= z$;_~^8jN6$#_DskJ7W(wXij>j<$N!?_RvaJyxNDkZOq~|!TtWGl*l+;=h7U>C>?4r z_bX|dAyoz56v$f=;h{IivOK~0pU&A_`4K5EohgUX1%N9+=cKi(qOg=?S)g=@Sc#}1 z9K>%@&G}V4Npz2o}HP+ds zYz|iZ>jF~|Wq?dRA3GCG*a_mn*RnTTARpNo7Y(nwG^Dlnwm}{VI4aIhgPDVfY^DdV zjQ_f}uP*r&bndK1gIsN6JHGWRb5~^SeP(I8Ol}B(PL?%G$xt=vV7&p@{bGS6rSEIA zmM4TPB+9b-$)+ZQYRISmZ0rJGKCL)C?+Byh=t2H9E_ob+;5Tw%SM|%3Z zqMHcskf5uG+vByJF__HL)hLMJc%JOMiQ(2S2qD%NA+{25{{iHTg#E6lj%8 z)c%t*desLXW}ue_gdJersZne*n|wF5kENTxm4SaQcQX+2wXbAy)$&q${?(E zrQ`;pZFY4EDp4MLODI?8GfD{>1ZWtG3eEl9EuUi5Ey_IjR5x!gKr=trgOL zFmni!WWiVOR^&;|+8TA#`iIaL`NNGtV2vxvtBK zbQIWr9H!GyzC@XA7SlnVxscsrudB;?|L99H5u;C9`FmBKiKTA^9 zG`1mDtNYQ@^106mp76@#9dBArOt@5uLTOEyS{JutpnM16E#3A5D+uvk_>Vi}NCJqJ z3=jYV!NgBJ6Gk5U2Yp(5S8l{@zVG(;NX>!Z3l+4B1d|1U_@wvUUS67qP*$2QtK!=BW#0-Y2vuRUk zH;=b!b#j<7t@$>-^3`9rrwDmPu4t8#^~ZOoDcRW1kTKLCgwQ*;+q>a&34PE?Q5o+B z?PYj+We+8fs41Od~6s3=>AX(RwW zPctn0%_}x)n(SKuv-oBZAMwxDMhB+dTqcBrP4l|3U~-e0_?9tBEq0!|NOCe2ZHQ1R zr|MXzD4Qa)9)I5hLCn-$wk)ouT`SGU%ps%UwFS2-r^M?PsF|A}Zd=`&F(DefjKU06 zOcf;Y8WgC?f}8Egj7ZH~h@Z<`25VdK1;WXK!_`!17U${O=I4Nk)5J~M>;30Rneq|jEqM<~=mH?JrTz8yRZuQBJ>JKt*wMkH#k#tWq_GA`%*doJsn-o3h6z7$A1zXc8 z`tzZ!-fPNl2eWUUf=ngyB+C`-@9N^417W=B8v8GT64+Hmuki4cu7F_k+ZqWc(Fhl| zJyq4{PxDVGLq#*`AINoy>TTYPA>D8#2H0&V7T#7U44I-OGI9DLxs$6>1GASN+zP9G zPl$_)&5D-83}RS0=tspg1$jK0D0UKLAzHO@8JMw`X6t(O-S&CY#~-(3K}upvxk7f4 zu16#cqdVdp_WDqTJ2qd0gj7)gM(^dQZ=;D{G3q3~rC5HRsY@2}9WlP6-Tdetii z7~&}1`|8D%O3R7es;4iq^XMj*psM?&8e>Nnupg-K92aCB0as`xUm9s2gJRcjya~4^?+@)x= zJaBNw2{br=l<64>31JfCGEn|>ik|enH09vtyD!pf%;{=~!=Im_dzIIwB6#GU#;3OV zD{D7<0L`v&2wJ@+3gKd*CTSA0k6jPT!m`MU76#TaD+UGUUtZq{WC{q{W zbx9^jSPVTA6{8c0m@|daQ$GtvB8#7C-gNODp0g7~*BVp$Sm<3+aC@zHszCa)O~b|K z0Eck6Cs|mj(Joql&U*(an~S`m*jU}yJ~g1Hw97feVIy)PJ^j7c+q4$$VUyBMPvZuI z_1pB;r4t0;hs~sfgd}qV7MIBZ;V)X0CBUR`9z&X~%k{DkZ!{$=7d1Z)mI>6fV*4>3 ze5~d-{-XV4-It}wCqsZLl~;BV6?-H!IZPFD%mze~s%i>DY-OJ98h5y}$ig>Fwtw&yb0RzVBsa6m*$^F)EEUx!Y*D%!!V(b~^8m zbgb*Tl$1K{x<#rj&q5>&JzTz7VQF%~tnSkl0+m30olatB<4jJX)n@A@hfG5uXQ%wiP6D*t zdYrw7Ygb%!ui`Bn=E{ViixSGt``l|8d;(iMOs#(eDV8eK@7CMn0aU!mK!0MdssXnU zLJuJQGE~P*YE-R1AN0CXcp2_asZ*@y?5@Dtk*Yh6-OZECOafVwRXy{yC<}Gu6RPDV zdh=V>VZXzdr=F`L&qfCDi^hjkAw6M*dBs0rOGlgaD^;o7%AV7oxrF1R3mB<@yi(nY z5E1=0Q`sW>*&yZ6MRz-1&`0C@r8A8TrAON%+%GVhC8zLY79C;FisTflh_+14@H&Z& zP@n1NZ3du?J@DijMo(Kl_qsJ4!Hk36lSh>9Se^^I-&!|3NBo_L9N}HLRBX!9;E|#N zXcow-LkdWwrl7}1n|-7eJBGiKzXF)+_GkC24M`lL0*~|}#$~iD%{m&q=R-g9H8iB% zjU$VebY{!zPqmlIA(4yJ%9k=r?tyV4Qy+^&JarDEz7t-Z$*ATB>d=n6fNY-qx|2d4 zD*A92#efz)eNm<^ZaMF{6I-=6=M`fke!Lao{ZsorY@jlO3#kUWPq*+uSs>A$kD#xdh_ zz%dKdPjsb%n=CFB>}}o|No%G*jAQ13=M8ReLzo`|z$37H6n;=bNY(Qv2%~+uT#Ny4 z?9?AD!Mf`Y{-nAkQBDh?`sbzUnshILLh1WOw zTYOe9&&6YJt!w`^N> zJ4hQ#{QIE(F8ic7y!a;msIg+ALUH!;3dgI;vYwxuoDi%}X7%9pK?tNoDaW;>Vlk4o zpl>u{m|oAHT^4Lu4xVS_`w>eNFDQCi=m8K;w3uaK-*m~SW(iqT$ot&M$d4 zUENZfp+IrBbyO~Fa5Yy~`XN^5+hE2m&FjXS)AQue9 zJ(Q&SDQFJC{jQ}GbFq^d-X&AnzmnrZnGf;txVa127uSOZ`U%wgB0YaJQq$Od!x*6L zzT*;3l5e=n%BqFIR`R_k=M{#5!&+N6B%Pob%FGpJtvX+~-WQ@HVF$Aj9Mo z9XE;R?8Ub{P!+}4ZZ_M6`5a7Jrs)Abz$+F6BB7nkg{J_Iiv0$bV}kv#8p!T@*=>Bx>(7qJVaom#2^S7wRM3%iM+IzKyic|VKMOKjc-N6i zC#j%Hk%G+ilQZ^nAv}!NXI>Hv;;67|^GX-RYwIX=n| zC4s-Aihf4Tu^o0I%6^0OEVk3~u_LXeAgZqk&^*hty>}cPR+ysLnE1mOOq_`8!^d!w z3_Rvaif~i6@;BU3@ZLF7w1ycTcX=r=Y5a9t=vzG}j3fwW=F~l=9EtgrjO#utK*J#< zqEWN*CLV716L_9rOiX@tfQhzpT{d?S@QhV>u+xfkQlfKfar}%NDnz53!E!H3Cr7Y2wB zUaqXP0{(%ozJ;g(01Bsu_?JQE9~5pkICm$ZcwH=Kmc=79&h-mNyj?rP0~gR&myTlt zvOr(Oy#)rPOj)m~&%aPg6Jsj;T+^yEA%uBPh2nkj?={UqemWwR=r*v~b0z2J&gA$y zKN8+zJatmx2u6VwrjOn^qJdpjUYh|<+!XfBhlZ9sw_4IRKmO#T3Hb?f?pohMLP8mf z8>3UNcVf&-kdIF^qrhn}F%_L!`33-y+z}{q?;ySK`E*t$Gu(?GX51IHn|!Y zypJ=#q{=PstaFG*jM>P;v3`&#Q#@<9&u_>4MQ%mGK0R5PUb``xPV2J3$NdE}X<{Q+ z;AwLCFrOoypoDqhTCfp%11XHAx##X$lRoQzoec_8c% zN`z2UzjaN27UV-mnr@{gLTf1>DcLb06Q;&=5kdNfP#7FDF7GD2T1(V}`V{rMmd1&~ z8t?=}qdQ6p@n>uG=O~c4$Jt&Iu&^YG|0w(srDbGval~hY*7h-;m6ZjvegpML@BKj|6@Mohp|y zq#xse{{e3Ow2J^(qOYpkDDDxfeH@nB!?!LYzM-q-JMq6-o)rfZ*w}nF%y_d;Q-nI% zG_1@1AUixU_FN8Ai5p7at|+d-^_5UuYu!I*jPrs}+<@!lD{&*P_piiFLf<0bq=&Yg zz7u0HAvfhV`zg|!Rh zwH2Psp9LL%-&?;4pCI9k7)1)(&J4j0+s!P%4%=@Kf10#e%mV>yLQLZUM#4;U;&J`| znrb}6C*P;tQI742cZ>KgKg4H&*K*b6F^6lfrTM1MhlT#oPW>aEAHLzRs7Fbh@QuM; zr*lGG4AfS>F$4lhWRl0b-Y;LJS&#jEa9CkV&TyAK7o}0tN0B#=(*#9*Zy^mIu)a((vw&c55KeFe z4mry+<@4?Ua~iw5Z@5p8B^t55`-7K<1L~c{cVWSGG4ZOPEZ-x}m=fyfCUN;Hb>SKx zU3Zx&d&OgHQ|T1E>_tNkEta-s7u^sOs}^SFKIjY?A@hE1Hg|;U+|Cd-zL9v=Fu2p=Bd%)ILS$m%U=A#Xu4| zAB8H~qB)3Q7}BT?&hy{NsWo)@Q9Y^Fmd-@*-1*yQ$8&lKOS95w*`7vDa^CQ`!qg&3Wb=q{!vdrG4hrQi6AyZmZFfntci2B(pd zCYZvwW!mNQBI6atP*TYjVLjD~idr<6mB&90nYy4XAk$+IE>io772T>;NFWp4au;FU z>77kBdSwH47Yp-S!NePqHqIPUC8xgs>Qx}?l>4cn-izYm_BQ}wwr2UDwZ`BJCF^X! z2jazye6i;AmDZ@}>pzO;5GNjqjUGEI*hkGnKEA8h2=PCbiHW}HNM5ym`S>F_)}ZaJ z(!2j2FyPi(mSc5NU6D zXnW868isW-czLW^OsR}HO>Y_b-%}N^O}cCgq)LP5nw)O<2n1Q2-~ZcD28x?DEm-K* zJ%y(k0pC_;=kPd1(+QQ&c{?dM6Ro2LdhZJMxY7~`l*DcD97Es6i{{9BSLP*Dc13Zx zAHz~8P8nDk%!bY)<@ZC<#>BWFujJ>yjXB@7rk<+L8&O>#r%CQ0e>wkqit0(!s(JgZs zJL1T9*L9mwWY*JH&AZ@>SW-7>zdO#laMXwEGCcgpOP3FncN68_nhr#z0!vt;<147I zi-m6+^#iqw4UcLFZO24XsKQ<}xPwQ0_c80Qxqg$_ay=$9=@E0j0CF%ZV6iyWUS{S6 zm23YY3l$S`q2S35elGkYR8E&bz4fhcSXG0tYKBB}UA@Dzh0**gX=KAVgjiB>>00)A zoG(?*!CH&NofyIqXr{!yUfqJHhU`k+-ZRU4g})A0?jxz3N-}{h8Fj^4(kr*;ACSe& zKY$FJpGzUjz>FdvoDf(=gW`2?}zOoK2$QGIWSRHmyKiJJBZdH2k^ey1S zg_seg8O;dgP)H?47Xvz0C;Ga30|Uc}HQ1wnh)co|4+>_d>Kl<}YtP13^V? zG8zZm@QM(mtA)D_af3y1lgc~ke1&`F4Oij=jqOn7K&m(P6;aPP8F{n4uXi5xq|{h@ z|JdEltYTC5lLooF-3*nZD;SQ@ZOPME7_ier4oH~xg0fCVaD#HgQ>n39yGL+&%}lKu z?k&u$j}On6C!T|9;HW)UOL@259j6x8*iIrmEsv>Dt+1S#m4{=A+Sd9h=&)tM(4prd zXHoY}Q^HO1HuU?y8v#Hv24rD`XyK&zpJwOc3zk6)oIrAATEBBqXFiJtIf zz#G(n?opY(&8-SUcsCD(qf-FU`z&ZwlGEbVRn|cel8t#K`OtokA3Zh?*GqVi+d7Ui z0r$&qAIBJVNA*}y#jC=Li77*$#kZ!dx^Az|Ea|XHZXRTTaN6E&WS!N&Ll%LnSs$0a z`!Hobb2C;GX6fW*`VTY>a1EX!g%}D>A?))``;M@5RLokHRyOV)$1jQMJYt! zv2IRREm3O356>>@kP?46*xABP?g=TalmUTeBY^#%=l{kjV@ST4VU))7{~DCGo4&b)_l_pOX%25J!7RN zHXa_g-cwThe*GGwyS+qu|D2~!UcC$6^|9Yr>Z@R4wT5HFVi$?X0mk76Y`>ry0Dq547CKpAav9PeM0+0c*z55PPWp^|TD z34iCS0Ii5~g}J0wdI z1W(FR!)tih``Y&i0M_gT(D){#N>I|cMhX0IP*c^>et9aI@7fLJJC>Wq?+G{;@>o?m zy(b5)w*g_tRY7K04q-Z%BxV$z>ELNYJ>~m=J;RaX0ry#4L=sJ)`UF9WH0Yx$=VFiJ zi5A@clN6YQB3d%&Cf7#z6U)NscLmD(g>n%_s$tARDo0J$;D2FerJ!y{1T=S48LR2i zE_@U|cgpH<%s}z&N$kg-1&*(Ms6k1sMLUKLRD4uc-5&*P;aOQ`ie6=AJ5;2vtow{f z+vg7YKO*4oJLt4_cZR^V#!sVn5vrLp2baV?s~?9Be8Va;;_ro?CU_UNPpeg?;sIY% zXk!4ObcGuybf6cE0N^J_vm0@Y=a3hP3O(dCvb>gt;2ja_0a}#<2<6@J=YuMc7lA zkEK7}1@j0_WBUEnNXo)BL^jMG-I((zLL)(AxFo^nRnDz4RjId~1YKcO5(W9b8J_=e>|`bC^!pNH`S}68 zpP8*eB{>aEb{?>Y9Fp7`q7L*g#t7{N+nm|+NolL$%rG+)iLb<8`+|die7qcqQo#`` ztefKQ_Tg&zi{49I6$+<%4=m#X@E+wubNS4HS}A6ZsNy6eaJHa?`CFub5kUw#OhJF#Qvvl>gc!xMd$0vbAMCL=8j$ENC6%|ufXF*y!b$4ut_wH{a7pZ8p4jZ z_k5HqfEmJ53Le1*Ud_&1^fEfpvU#1>Nly*78A|H!2v0WRZ;j}K?Y2Z0VSYIV_8-zlMn{37XPX>l!az>~R}~S!(-eBRULXG{i35=P5~jh>&jPLoJ4=E8{GG{) z3*fZxO%^{1bR``7Ji?2zS*Ln{@p!rbeC*$c0bU1VH>vDv@1Jd5#Kx^?wiJ z?0g6*`hz{#eKk;7Q4!b8qlw?{9Xa-3=Er~ys>kbKFD+Z!vb(dy_BiQS25B|5c)1J_ zJ@3 zvHz3|nkvgMWjeh{c`M*$51 z0+&^PakqM~x+f0|QgW0F*b zqGf!~+z%@IjIN-72xU%FlQuw}&d0`#aadxwI-ajD*Y&>HyfVE;^4|E32N!yprB6a} zJ-TKNK0&NcT_-TrPAd4Dnq zvFhNfjk@5?M(k#cEPLn=-hjc9X!93=V$wM87c!_ZM1A54BQK9bVyAhso!6IR+`;n& zhV(u#T+`?XGTtW@w?!hxc#FrU+F!%;&n`0gf`OAFFSn^2?kuf`-#LIIMW>SU3jYG~ zYFkk?@Yfvz$3oBS?PQ-jnVhgx{{=K0Cv-{cK^a-9^iAxdJ`*$etsJfHhsRH|<-|^! z6&R6|mSt)X$usfS0xo+w*fJ{LtskH2S6va&Tmd4g5BSw-1=J0Xip$>c!z%mLuB5?J zmTGQTPD6v{{b^l8`LW3HMlF`2CaQQ$stE9&4gP}tBI1Qou6o`N1zhw{eTMbgcHr%T z)*ie^r`qXVY<{kH!zsjoL%8IZSiB3F437C-Rz5?Y0a@+fWQCJCt8(eSNQ%W~+}t!c z4mb0&Z2Zh~$2)vs&ujb3rC%*1suR`!^Hk24FPuyi{mKDiyxOz7n^7P3{i)Jw*y%0i zWY2yRFv7;C5PgQVf1khc@AJXH0y*^##^rWMl8WRIFh5_bef*CVQWyWEI5ysz2f!av z7wHnzNZXqQWphPpENWQgfQ@mjRkPP$_FC$sjo zb}kvwv+wmIWcmS^RHVw;Fm0X(w$r&!eK`6q|JpSfjOTLyzy6fXdN!${-~Xh0tM7AP z3sni2t+h(5v7S|y7d(7_v#a34{A3lMq{##+6`HMo?)W6@;cx&_v&E+QJ@y>j<6a;C?Q~r3%asHe_o_{kgiE_|@vjFmzP5pJ(W7;9$gjEwYR8Rnx@wDgSHJ>loyc4D48#nPZ-$lZA;|p7$f>P212x zh4-4$b@E!b`YB`2y>?JCsPCX!ClB522tcQtKWsfQiHt9H#>Rmq;&OYtU!KTi+&eRG z|N2Qi_YDh+tUG0=!@*2tk((KyP3gGx!@Owl@v_{fA5aX*k@o@ggU4H;Za{zFKBx4$ zP`bH0A3a?CDj$lyhWBd8eI3iCNvGbn%3=MJ%QErYK4q1~m$B?XK+>~MBx=6(@d2LO z(xNMJy@KR%(usO#6D9i409in5LsQsM3k2k^l>sq}Z26zlgxwJ66~Ghs0d#-&AS;(i z3*{94*dvlZl`fNY{QB8utuPyg8Pnax0I4U_g$9Q`9=0?Amzalpc=5BKzoB4-lcorh za!I{ur@@+Op;=>plk%S`|2YzMbu(LSUc9;j#9Jjtb_&3W&sRq+=kg?gTN4llitIM- zmo*>Q@Flrk@idMK26h|5SD?G&xsHo2(}jQ0%K186S=iYDDdwhvCHe~)8mUr1&3frb zBwA8o2~erF!1;U!)S%_~E(J>KH8oFjNpNzTAN9U^=c4~=fgPfTAguNjaUI(H<9e2u zt>Hk_QY^2KA+ng>?a__J`x~gAn*%{bh`?jUS3}GU3_krT$DOGbitbrQ0lC6x`;Xq;IH?a(#mGc)-fmFPvbP) z+X`D^0erX3kg2}+P3{7qp1xNDH<)pl0QgE)n*HWT#| z06SPjDTj=@EyTTF$60>#!#ur`qh9Flq`S)d9^%3oMcu~qH5M&MLm-%C&6TSUyEXf` z6_$?P`AR5nwL7@jBQOa%oh6P6CEMCCd|3BIK$`HlU^W7;2p+c>AFn^H!9}3lbTRsJ zrsOEINNmWo)d4UWJ%-3UVT*2R_I-QKkV zbVbkFwoOVeRHC&nzBVnpzwGx{cYcMcmjcu7{EoUa-THj>Ub#4MS#k%MBl9m$dQ;0) z@&Dod24LP&{r3&n|M9vAjHKma^YU{z&S>09;=Sl2Ca~gR%IEBT_5bTc?e5w?5fDtB z{pPQ?gNsXM<2=vRmwK|0&-md&=Bdp2?TMxfHZrxh2teO;!!-Sk}_IGP0lOGOFw lq@d~u_PB^;2HDCY$ literal 0 HcmV?d00001 diff --git a/img/Scan Algorithm Speeds vs. Algorithm (smaller is better).png b/img/Scan Algorithm Speeds vs. Algorithm (smaller is better).png new file mode 100644 index 0000000000000000000000000000000000000000..cd943f0a2c67c7540bd8b8ba3e5def830a6b48c4 GIT binary patch literal 16832 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 Z=M`@n-FfVdJ3u^$)p6TnxTEL){2!-i0&M^Q literal 0 HcmV?d00001 From f4e1d6746b0c034584e14f68ece6420d45301582 Mon Sep 17 00:00:00 2001 From: Caroline Fernandes Date: Tue, 16 Sep 2025 14:29:00 -0400 Subject: [PATCH 14/24] changed image names --- ...ithm (smaller is better).png => diagram_one.png} | Bin ...hm Speeds vs. Array Size.png => diagram_two.png} | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename img/{Scan Algorithm Speeds vs. Algorithm (smaller is better).png => diagram_one.png} (100%) rename img/{Algorithm Speeds vs. Array Size.png => diagram_two.png} (100%) diff --git a/img/Scan Algorithm Speeds vs. Algorithm (smaller is better).png b/img/diagram_one.png similarity index 100% rename from img/Scan Algorithm Speeds vs. Algorithm (smaller is better).png rename to img/diagram_one.png diff --git a/img/Algorithm Speeds vs. Array Size.png b/img/diagram_two.png similarity index 100% rename from img/Algorithm Speeds vs. Array Size.png rename to img/diagram_two.png From 91a807e0083f9fd1d011079dc7a3a57722b8977f Mon Sep 17 00:00:00 2001 From: 0cfernandes00 Date: Tue, 16 Sep 2025 14:39:48 -0400 Subject: [PATCH 15/24] Update README.md --- README.md | 57 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index da0dd751..12a20d05 100644 --- a/README.md +++ b/README.md @@ -14,15 +14,19 @@ CUDA Stream Compaction - Thrust Scan - Optimization - Final Output + +![](img/diagram_two.png) + +![](img/diagram_one.png) The overarching goals for this project were to 1) Understand and implement Stream Compaction on the GPU -2) Practice converting algorithms to be parallel +2) Practice converting algorithms to be parallel This implementation of stream compaction is for removing zeroes from an array of ints but this algorithm will be useful for removing unhelpful rays for a path tracer. -In this process, I first implemented these algorithms on the CPU including Scan(Prefix Sum) and built up to a naive, work efficient, and thrust implementation of stream compaction. -I also optimized my work efficient scan bringing the time on a non-power-of-2 array from 0.2 ms to 0.02ms +In this process, I first implemented these algorithms on the CPU including Scan(Prefix Sum) and built up to a naive, work efficient, and the thrust implementation of stream compaction. +I also optimized my work efficient scan bringing the time on a power-of-2 array from 0.23 ms to 0.08ms for an array size of 2 to the power of 8. ### CPU This section implemented an Exclusive Prefix Sum (Scan), a Stream Compaction without scan, and finally built up to a Stream Compaction with scan. @@ -42,10 +46,9 @@ The primary hit to performance for the naive implementation could be the multipl ### Work Efficient -The Work Efficient Compaction utilized an parallel reduction up-sweep kernel and a down-sweep kernel as part of the sum, provided again from the book. - -I had originally expected this to be the fastest implementation. +The Work Efficient Compaction utilized a parallel reduction up-sweep kernel and a down-sweep kernel as part of the sum, provided again from the book. +I tried a few different methods for optimization. I originally implemented it according to the book and lecture slides keeping the kernels seperate. I also tried combining the two operations into a single kernel to reduce the time going to the memory copy I currently do before performing the downsweep. The preformance change that ended up making a difference was to reduce the number of blocks that are launched based on the number of threads needed for the current iteration of the loop. The NSight Compute report seemed to suggest that the bottleneck was largely in computation usage for this algorithm. I had originally implemented this algorithm using the pseudocode from the book and slides. However combining the upsweep and downsweep kernels into a single kernel (as well as removing the memory copy I was using in my approach), proved to be a benefit in reducing the amount of time. ![](img/workeff_scan_compute.png) @@ -67,58 +70,58 @@ Thrust only image -### Final Output +### Final Output (for Size = 2 ^ 8) ``` **************** ** SCAN TESTS ** **************** - [ 35 47 37 8 44 39 23 37 0 6 11 25 35 ... 47 0 ] + [ 10 43 13 38 6 1 25 30 0 26 9 46 40 ... 19 0 ] ==== cpu scan, power-of-two ==== - elapsed time: 0.0009ms (std::chrono Measured) - [ 0 35 82 119 127 171 210 233 270 270 276 287 312 ... 6365 6412 ] -==== cpu scan, non-power-of-two ==== elapsed time: 0.0006ms (std::chrono Measured) - [ 0 35 82 119 127 171 210 233 270 270 276 287 312 ... 6304 6341 ] + [ 0 10 53 66 104 110 111 136 166 166 192 201 247 ... 6452 6471 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 0.0008ms (std::chrono Measured) + [ 0 10 53 66 104 110 111 136 166 166 192 201 247 ... 6385 6400 ] passed ==== naive scan, power-of-two ==== - elapsed time: 0.354304ms (CUDA Measured) + elapsed time: 0.446464ms (CUDA Measured) passed ==== naive scan, non-power-of-two ==== - elapsed time: 0.027648ms (CUDA Measured) + elapsed time: 0.105472ms (CUDA Measured) passed ==== work-efficient scan, power-of-two ==== - elapsed time: 0.082944ms (CUDA Measured) + elapsed time: 0.19968ms (CUDA Measured) passed ==== work-efficient scan, non-power-of-two ==== - elapsed time: 0.040256ms (CUDA Measured) + elapsed time: 0.137216ms (CUDA Measured) passed ==== thrust scan, power-of-two ==== - elapsed time: 2.22134ms (CUDA Measured) + elapsed time: 2.11613ms (CUDA Measured) passed ==== thrust scan, non-power-of-two ==== - elapsed time: 0.746208ms (CUDA Measured) + elapsed time: 0.871744ms (CUDA Measured) passed ***************************** ** STREAM COMPACTION TESTS ** ***************************** - [ 1 3 1 0 0 1 3 3 0 2 3 3 1 ... 3 0 ] + [ 2 3 1 0 0 1 3 2 0 0 3 2 0 ... 1 0 ] ==== cpu compact without scan, power-of-two ==== - elapsed time: 0.001ms (std::chrono Measured) - [ 1 3 1 1 3 3 2 3 3 1 3 1 1 ... 1 3 ] + elapsed time: 0.0009ms (std::chrono Measured) + [ 2 3 1 1 3 2 3 2 3 1 3 1 1 ... 2 1 ] passed ==== cpu compact without scan, non-power-of-two ==== - elapsed time: 0.001ms (std::chrono Measured) - [ 1 3 1 1 3 3 2 3 3 1 3 1 1 ... 3 1 ] + elapsed time: 0.0006ms (std::chrono Measured) + [ 2 3 1 1 3 2 3 2 3 1 3 1 1 ... 1 2 ] passed ==== cpu compact with scan ==== - elapsed time: 0.0076ms (std::chrono Measured) - [ 1 3 1 1 3 3 2 3 3 1 3 1 1 ... 1 3 ] + elapsed time: 0.0036ms (std::chrono Measured) + [ 2 3 1 1 3 2 3 2 3 1 3 1 1 ... 2 1 ] passed ==== work-efficient compact, power-of-two ==== - elapsed time: 0.011264ms (CUDA Measured) + elapsed time: 0.175104ms (CUDA Measured) passed ==== work-efficient compact, non-power-of-two ==== - elapsed time: 0.009216ms (CUDA Measured) + elapsed time: 0.182464ms (CUDA Measured) passed ``` From c47e63f17130013d6a6a720edd0c783b8646ae82 Mon Sep 17 00:00:00 2001 From: 0cfernandes00 Date: Tue, 16 Sep 2025 15:11:45 -0400 Subject: [PATCH 16/24] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 12a20d05..624f5450 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Stream Compaction with scan 3) The resulting scan (from step 2) will tell which index to scatter the input array to The primary performance hit for this implementation was Memory I/O, multiple reads and writes were most impactful as well as multiple passes over the data. -Smaller arrays size made this implementation look fast since there was little computation overhead compared to their parallel counterparts. +Smaller array sizes made this implementation look fast since there was little computation overhead compared to their parallel counterparts. ### Naive Pseudocode from [GPU Gems 3 Chapter 39 (Section 39.2.1)](https://developer.nvidia.com/gpugems/gpugems3/part-vi-gpu-computing/chapter-39-parallel-prefix-sum-scan-cuda) @@ -50,7 +50,7 @@ The Work Efficient Compaction utilized a parallel reduction up-sweep kernel and I tried a few different methods for optimization. I originally implemented it according to the book and lecture slides keeping the kernels seperate. I also tried combining the two operations into a single kernel to reduce the time going to the memory copy I currently do before performing the downsweep. The preformance change that ended up making a difference was to reduce the number of blocks that are launched based on the number of threads needed for the current iteration of the loop. -The NSight Compute report seemed to suggest that the bottleneck was largely in computation usage for this algorithm. I had originally implemented this algorithm using the pseudocode from the book and slides. However combining the upsweep and downsweep kernels into a single kernel (as well as removing the memory copy I was using in my approach), proved to be a benefit in reducing the amount of time. +The NSight Compute report seemed to suggest that the bottleneck was largely in computation usage for this algorithm. ![](img/workeff_scan_compute.png) ### Thrust From 7f96a429fe3c1231b0ac45dae5502976318cd118 Mon Sep 17 00:00:00 2001 From: 0cfernandes00 Date: Tue, 16 Sep 2025 21:37:30 -0400 Subject: [PATCH 17/24] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 624f5450..16a65936 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ CUDA Stream Compaction - Work Efficient Scan and Compaction - Thrust Scan - Optimization + - Work Efficient Scan Speedup - Final Output ![](img/diagram_two.png) @@ -48,7 +49,7 @@ The primary hit to performance for the naive implementation could be the multipl ### Work Efficient The Work Efficient Compaction utilized a parallel reduction up-sweep kernel and a down-sweep kernel as part of the sum, provided again from the book. -I tried a few different methods for optimization. I originally implemented it according to the book and lecture slides keeping the kernels seperate. I also tried combining the two operations into a single kernel to reduce the time going to the memory copy I currently do before performing the downsweep. The preformance change that ended up making a difference was to reduce the number of blocks that are launched based on the number of threads needed for the current iteration of the loop. +I tried a few different methods for optimization. I originally implemented it according to the book and lecture slides keeping the kernels seperate. I also tried combining the two operations into a single kernel to reduce the time going to the memory copy I currently do before performing the downsweep. The performance change that ended up making a difference was to reduce the number of blocks that are launched based on the number of threads needed for the current iteration of the loop, as well as using the threads needed for launch as a verification check on larger array sizes. The NSight Compute report seemed to suggest that the bottleneck was largely in computation usage for this algorithm. ![](img/workeff_scan_compute.png) From f426b7f885cc14b0407031654b42581db1cd9851 Mon Sep 17 00:00:00 2001 From: Caroline Fernandes Date: Tue, 16 Sep 2025 21:42:39 -0400 Subject: [PATCH 18/24] final code push --- src/main.cpp | 29 ++++++++++-- stream_compaction/cpu.cu | 51 ++++++++++++++++++++- stream_compaction/cpu.h | 2 + stream_compaction/efficient.cu | 72 ++++++++++++++++------------- stream_compaction/naive.cu | 83 +++++++++++++++++----------------- stream_compaction/naive.h | 2 + stream_compaction/thrust.cu | 25 +++++++--- 7 files changed, 180 insertions(+), 84 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 3d5c8820..9b58ba68 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 8; // feel free to change the size of array +const int SIZE = 1 << 24; // 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]; @@ -46,13 +46,14 @@ int main(int argc, char* argv[]) { printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); printArray(NPOT, c, true); printCmpResult(NPOT, b, c); - + zeroArray(SIZE, c); printDesc("naive scan, power-of-two"); StreamCompaction::Naive::scan(SIZE, c, a); 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); @@ -60,12 +61,14 @@ int main(int argc, char* argv[]) { StreamCompaction::Naive::scan(SIZE, c, a); printArray(SIZE, c, true); */ + zeroArray(SIZE, c); printDesc("naive scan, non-power-of-two"); StreamCompaction::Naive::scan(NPOT, c, a); printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(SIZE, c, true); printCmpResult(NPOT, b, c); + zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); @@ -80,7 +83,9 @@ int main(int argc, char* argv[]) { 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); @@ -94,7 +99,9 @@ int main(int argc, char* argv[]) { printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(NPOT, c, true); printCmpResult(NPOT, b, c); - + */ + + printf("\n"); printf("*****************************\n"); printf("** STREAM COMPACTION TESTS **\n"); @@ -147,6 +154,22 @@ int main(int argc, char* argv[]) { //printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); + /* + zeroArray(SIZE, c); + printDesc("cpu radix sort, power-of-two"); + //StreamCompaction::CPU::cpuRadixSort(SIZE, c, a); + //printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + //printArray(SIZE, c, true); + printCmpLenResult(SIZE, SIZE, a, c); + + zeroArray(SIZE, c); + printDesc("radix sort, power-of-two"); + StreamCompaction::Naive::radixSort(SIZE, c, a); + printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); + //printArray(SIZE, c, true); + printCmpLenResult(SIZE, SIZE, a, c); + */ + system("pause"); // stop Win32 console from closing on exit delete[] a; delete[] b; diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index bdabdc69..ef38cd89 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -14,6 +14,53 @@ namespace StreamCompaction { return timer; } + /* + // counting sort implementation + void count_sort(int arr[], int n, int pos) + { + + // we declare a count array and initialize the array by + // 0 + int count[10] = { 0 }; + + // we count the frequency of each distinct digit at + // given place for every element in the original array + for (int i = 0; i < n; i++) { + count[(arr[i] / pos) % 10]++; + } + + // we perform prefix sum and update the count array + for (int i = 1; i < 10; i++) { + count[i] = count[i] + count[i - 1]; + } + + // we store our answer in the ans array + int ans[n]; + for (int i = n - 1; i >= 0; i--) { + ans[--count[(arr[i] / pos) % 10]] = arr[i]; + } + + // here we copy the contents of ans array to our + // original array + for (int i = 0; i < n; i++) { + arr[i] = ans[i]; + } + } + */ + + //void cpuRadixSort(int n, int* odata, const int* idata) { + /* + void cpuRadixSort(int n, int arr[]) + { + // max_element() is a c++ stl function to find the + // maximum element from an array + int k = *std::max_element(arr, arr + n); + + for (int pos = 1; (k / pos) > 0; pos *= 10) { + //count_sort(arr, n, pos); + } + }*/ + /** * CPU scan (prefix sum). * For performance analysis, this is supposed to be a simple for loop. @@ -111,10 +158,12 @@ namespace StreamCompaction { } } + timer().endCpuTimer(); + + delete[] bools; delete[] indices; - timer().endCpuTimer(); return count; } diff --git a/stream_compaction/cpu.h b/stream_compaction/cpu.h index 873c0476..dcfe0ac1 100644 --- a/stream_compaction/cpu.h +++ b/stream_compaction/cpu.h @@ -6,6 +6,8 @@ namespace StreamCompaction { namespace CPU { StreamCompaction::Common::PerformanceTimer& timer(); + void cpuRadixSort(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); diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index c6bac3e1..0acfcd9c 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -17,36 +17,42 @@ namespace StreamCompaction { __global__ void kernDownSweepEfficientScan(int n, int d, int* odata) { int k = threadIdx.x + (blockIdx.x * blockDim.x); + int stride = 1 << (d + 1); - int stride = 1 << (d + 1); // 2^(d+1) + int threadsNeeded = n >> (d + 1); + if (k >= threadsNeeded) return; - if (k * stride >= n) return; - int leftIdx = stride * k + (1 << d) - 1; - int rightIdx = stride * k + stride - 1; + int baseIdx = stride * k; + int leftIdx = baseIdx + (1 << d) - 1; + int rightIdx = baseIdx + stride - 1; - int t = odata[leftIdx]; - //if (rightIdx < n) { + if (rightIdx < n) { + int t = odata[leftIdx]; + odata[leftIdx] = odata[rightIdx]; odata[rightIdx] += t; - //} + } + } __global__ void kernUpSweepEfficientScan(int n, int d, int* odata) { - int index = (blockIdx.x * blockDim.x + threadIdx.x); - int stride = 1 << (d + 1); // 2^(d+1) + int index = (blockIdx.x * blockDim.x) + threadIdx.x; + int stride = 1 << (d + 1); - // Only use every 2^(d+1)th thread - if (index * stride >= n) return; + int threadsNeeded = n >> (d + 1); + if (index >= threadsNeeded) return; - int leftIdx = stride * index + (1 << d) - 1; // Left child - int rightIdx = stride * index + stride - 1; // Right child + int baseIdx = stride * index; + int leftIdx = baseIdx + (1 << d) - 1; + int rightIdx = baseIdx + stride - 1; if (rightIdx < n) { odata[rightIdx] += odata[leftIdx]; - } + } + } /** @@ -60,46 +66,48 @@ namespace StreamCompaction { int logceilN = ilog2ceil(paddedN); cudaMalloc((void**)&d_data, paddedN * sizeof(int)); - cudaMemcpy(d_data, idata, paddedN * sizeof(int), cudaMemcpyHostToDevice); + cudaMemcpy(d_data, idata, n * sizeof(int), cudaMemcpyHostToDevice); + + if (paddedN > n) { + cudaMemset(d_data + n, 0, (paddedN - n) * sizeof(int)); + } // TODO - int blockSize = 64; - int numBlocks = (paddedN + blockSize - 1) / blockSize; + int blockSize = 256; timer().startGpuTimer(); - for (int d = 0; d < logceilN; ++d) { - //int threadsNeeded = n / (1 << (d + 1)); - //if (threadsNeeded == 0) break; // No more work to do - //int numBlocksLevel = (threadsNeeded + blockSize - 1) / blockSize; + for (int d = 0; d < logceilN; ++d) { + int threadsNeeded = paddedN >> (d + 1); + if (threadsNeeded == 0) break; + int numBlocksLevel = (threadsNeeded + blockSize - 1) / blockSize; - kernUpSweepEfficientScan << > > (n, d, d_data); - cudaDeviceSynchronize(); + kernUpSweepEfficientScan << > > (paddedN, d, d_data); + } int setNMinusOne_ToZero = 0; cudaMemcpy(d_data + paddedN - 1, &setNMinusOne_ToZero, sizeof(int), cudaMemcpyHostToDevice); + for (int d = logceilN - 1; d > -1; --d) { - //int threadsNeeded = (paddedN)/ (1 << (d + 1)); - //if (threadsNeeded == 0) break; + int threadsNeeded = paddedN >> (d + 1); + if (threadsNeeded == 0) break; + + int numBlocksLevel = (threadsNeeded + blockSize - 1) / blockSize; - //int numBlocksLevel = (threadsNeeded + blockSize - 1) / blockSize; + kernDownSweepEfficientScan << > > (paddedN, d, d_data); - kernDownSweepEfficientScan << > > (paddedN, d, d_data); - cudaDeviceSynchronize(); } timer().endGpuTimer(); - cudaMemcpy(odata, d_data, paddedN * sizeof(int), cudaMemcpyDeviceToHost); - + cudaMemcpy(odata, d_data, n * sizeof(int), cudaMemcpyDeviceToHost); + cudaFree(d_data); - - } /** diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index ef5e12bb..7fc74a20 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -13,22 +13,22 @@ namespace StreamCompaction { static PerformanceTimer timer; return timer; } - // TODO: __global__ __global__ void kernNaiveScan(int n, int d, int* odata, const int* idata) { int index = threadIdx.x + (blockIdx.x * blockDim.x); - if (index >= n) return; int val = 1 << (d-1); + /* if (index == 0) { odata[0] = idata[0]; - //return; + return; } + */ if (index >= val ) { - odata[index] = idata[index - val] + idata[index]; + odata[index] = idata[index] + idata[index - val]; } else { odata[index] = idata[index]; @@ -36,36 +36,17 @@ namespace StreamCompaction { } - // This uses the "Naive" algorithm from GPU Gems 3, Section 39.2.1. - // Example 39-1 uses shared memory. This is not required in this project. - // You can simply use global memory. As a result of this, you will have to do ilog2ceil(n) separate kernel invocations. - - // Since your individual GPU threads are not guaranteed to run simultaneously, - // you can't generally operate on an array in-place on the GPU; - // it will cause race conditions. Instead, create two device arrays. - // Swap them at each iteration: read from A and write to B, read from B and write to A, and so on. - - __global__ void exclusiveShift(int n, int* odata, const int* idata) { - // TODO int index = threadIdx.x + (blockIdx.x * blockDim.x); if (index >= n || index < 0) return; + if (index == 0) odata[0] = idata[0]; + odata[index] = idata[index - 1]; } - int ilog2ceil(int n) { - int log = 0; - int pow2 = 1; - while (pow2 < n) { - log++; - pow2 *= 2; - } - return log; - } - /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ @@ -77,36 +58,54 @@ namespace StreamCompaction { cudaMalloc((void**)&d_A, n * sizeof(int)); cudaMalloc((void**)&d_B, n * sizeof(int)); cudaMemcpy(d_A, idata, n * sizeof(int), cudaMemcpyHostToDevice); - cudaMemcpy(d_B, odata, n * sizeof(int), cudaMemcpyHostToDevice); - - timer().startGpuTimer(); - // TODO - - int blockSize = 32; + + int blockSize = 256; int numBlocks = (n + blockSize - 1) / blockSize; - int swapBuffer = 0; - for (int d = 1; d <= ilog2ceil(n); ++d) { - kernNaiveScan << > > (n, d, d_B, d_A); - cudaDeviceSynchronize(); + int* tmp_A; + int* tmp_B; - int* temp; + timer().startGpuTimer(); + for(int d = 1; d <= ilog2ceil(n); d++) { + tmp_A = d % 2 == 1 ? d_A : d_B; + tmp_B = d % 2 == 1 ? d_B : d_A; + kernNaiveScan<<>>(n, d, tmp_B, tmp_A); + cudaDeviceSynchronize(); - std::swap(d_A, d_B); + } + timer().endGpuTimer(); + + cudaMemcpy(odata, tmp_B, n * sizeof(int), cudaMemcpyDeviceToHost); + for (int i = n - 1; i > 0; i--) { + odata[i] = odata[i - 1]; } + odata[0] = 0; - exclusiveShift << > > (n, d_B, d_A); - timer().endGpuTimer(); - cudaMemcpy(odata, d_B, n * sizeof(int), cudaMemcpyDeviceToHost); + cudaFree(d_A); + cudaFree(d_B); + } + __global__ void kernRadixSort(int n, int* odata, const int* idata, int bit) { + int index = threadIdx.x + (blockIdx.x * blockDim.x); + if (index >= n) return; + int lsb = (idata[index] >> bit) & 1; - cudaFree(d_A); - cudaFree(d_B); + } + + /** + * Performs prefix-sum (aka scan) on idata, storing the result into odata. + */ + void radixSort(int n, int* odata, const int* idata) { + + // get the least significant bit + //int lsb = idata & 1; + + return; } } } diff --git a/stream_compaction/naive.h b/stream_compaction/naive.h index 37dcb064..11e11bd0 100644 --- a/stream_compaction/naive.h +++ b/stream_compaction/naive.h @@ -7,5 +7,7 @@ namespace StreamCompaction { StreamCompaction::Common::PerformanceTimer& timer(); void scan(int n, int *odata, const int *idata); + + void radixSort(int n, int* odata, const int* idata); } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 550b151f..6cad23f4 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -18,20 +18,33 @@ namespace StreamCompaction { * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + + timer().startGpuTimer(); // TODO use `thrust::exclusive_scan` // example: for device_vectors dv_in and dv_out: // thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); - thrust::device_vector dv_in(n); - thrust::device_vector dv_out(n); + + thrust::device_vector dv(idata, idata + n); + thrust::exclusive_scan(dv.begin(), dv.end(), dv.begin()); + thrust::copy(dv.begin(), dv.end(), odata); + + /* + const size_t chunk_size = 1024 * 1024; // Adjust based on available memory + thrust::device_vector dv_chunk(chunk_size); - thrust::copy(idata, idata + n, dv_in.begin()); - thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); - - thrust::copy(dv_out.begin(), dv_out.end(), odata); + for (size_t i = 0; i < n; i += chunk_size) { + size_t current_chunk = std::min(chunk_size, n - i); + dv_chunk.resize(current_chunk); + thrust::copy(idata + i, idata + i + current_chunk, dv_chunk.begin()); + thrust::exclusive_scan(dv_chunk.begin(), dv_chunk.end(), dv_chunk.begin()); + thrust::copy(dv_chunk.begin(), dv_chunk.end(), odata + i); + } + */ timer().endGpuTimer(); + } } } From 5a8263e23c524fdaca1d681f5d64a60dcea7c150 Mon Sep 17 00:00:00 2001 From: Caroline Fernandes Date: Tue, 16 Sep 2025 22:40:17 -0400 Subject: [PATCH 19/24] cleanup on code and final images --- img/diagram_one.png | Bin 16832 -> 19129 bytes img/diagram_two.png | Bin 37856 -> 36556 bytes src/main.cpp | 6 +++--- stream_compaction/naive.cu | 6 ------ stream_compaction/thrust.cu | 12 ------------ 5 files changed, 3 insertions(+), 21 deletions(-) diff --git a/img/diagram_one.png b/img/diagram_one.png index cd943f0a2c67c7540bd8b8ba3e5def830a6b48c4..fb7b11f38c402ed5362a70d1c81e72f5d938826a 100644 GIT binary patch literal 19129 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 Z=M`@n-FfVdJ3u^$)p6TnxTEL){2!-i0&M^Q diff --git a/img/diagram_two.png b/img/diagram_two.png index 0411d6331a3b1189582358a5b57f8801b557cd43..df82638473468804aa54ba90861eab0af2264302 100644 GIT binary patch literal 36556 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 KughfLfBs)Qm=0tB literal 37856 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 lq@d~u_PB^;2HDCY$ diff --git a/src/main.cpp b/src/main.cpp index 9b58ba68..6a022469 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,7 +13,7 @@ #include #include "testing_helpers.hpp" -const int SIZE = 1 << 24; // feel free to change the size of array +const int SIZE = 1 << 22;// feel free to change the size of array const int NPOT = SIZE - 3; // Non-Power-Of-Two int *a = new int[SIZE]; int *b = new int[SIZE]; @@ -85,7 +85,7 @@ int main(int argc, char* argv[]) { printCmpResult(NPOT, b, c); - /* + zeroArray(SIZE, c); printDesc("thrust scan, power-of-two"); StreamCompaction::Thrust::scan(SIZE, c, a); @@ -99,7 +99,7 @@ int main(int argc, char* argv[]) { printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); //printArray(NPOT, c, true); printCmpResult(NPOT, b, c); - */ + printf("\n"); diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 7fc74a20..8835e652 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -20,12 +20,6 @@ namespace StreamCompaction { if (index >= n) return; int val = 1 << (d-1); - /* - if (index == 0) { - odata[0] = idata[0]; - return; - } - */ if (index >= val ) { odata[index] = idata[index] + idata[index - val]; diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 6cad23f4..c145a73a 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -30,18 +30,6 @@ namespace StreamCompaction { thrust::exclusive_scan(dv.begin(), dv.end(), dv.begin()); thrust::copy(dv.begin(), dv.end(), odata); - /* - const size_t chunk_size = 1024 * 1024; // Adjust based on available memory - thrust::device_vector dv_chunk(chunk_size); - - for (size_t i = 0; i < n; i += chunk_size) { - size_t current_chunk = std::min(chunk_size, n - i); - dv_chunk.resize(current_chunk); - thrust::copy(idata + i, idata + i + current_chunk, dv_chunk.begin()); - thrust::exclusive_scan(dv_chunk.begin(), dv_chunk.end(), dv_chunk.begin()); - thrust::copy(dv_chunk.begin(), dv_chunk.end(), odata + i); - } - */ timer().endGpuTimer(); From c2b7b5d86a6b8c565ff45d33245e2d2673c07ba8 Mon Sep 17 00:00:00 2001 From: 0cfernandes00 Date: Tue, 16 Sep 2025 22:51:59 -0400 Subject: [PATCH 20/24] Update README.md --- README.md | 49 +++++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 16a65936..ef856690 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,9 @@ CUDA Stream Compaction * [LinkedIn](https://www.linkedin.com/in/caroline-fernandes-0-/), [personal website](https://0cfernandes00.wixsite.com/visualfx) * Tested on: Windows 11, i9-14900HX @ 2.20GHz, Nvidia GeForce RTX 4070 + ### Features & Sections -- CPU Scan and Stream Compaction +- [CPU Scan and Stream Compaction](#cpu-scan) - Naive GPU Scan - Work Efficient Scan and Compaction - Thrust Scan @@ -29,6 +30,7 @@ This implementation of stream compaction is for removing zeroes from an array of In this process, I first implemented these algorithms on the CPU including Scan(Prefix Sum) and built up to a naive, work efficient, and the thrust implementation of stream compaction. I also optimized my work efficient scan bringing the time on a power-of-2 array from 0.23 ms to 0.08ms for an array size of 2 to the power of 8. +#Cpu Scan ### CPU This section implemented an Exclusive Prefix Sum (Scan), a Stream Compaction without scan, and finally built up to a Stream Compaction with scan. @@ -51,7 +53,7 @@ The Work Efficient Compaction utilized a parallel reduction up-sweep kernel and I tried a few different methods for optimization. I originally implemented it according to the book and lecture slides keeping the kernels seperate. I also tried combining the two operations into a single kernel to reduce the time going to the memory copy I currently do before performing the downsweep. The performance change that ended up making a difference was to reduce the number of blocks that are launched based on the number of threads needed for the current iteration of the loop, as well as using the threads needed for launch as a verification check on larger array sizes. -The NSight Compute report seemed to suggest that the bottleneck was largely in computation usage for this algorithm. +The NSight Compute report seemed to suggest that the bottleneck was largely in computation usage for this algorithm. The memory overhead and number of writes and reads seemed similar to earlier implementations. The computation and branching considerations for scaling block sizes on kernel launch seemed to have the greatest impact on performance. ![](img/workeff_scan_compute.png) ### Thrust @@ -67,62 +69,61 @@ Thrust only thrust_events ### Optimization Analysis - +I was able to use Nsight Systems as well as Nsight Compute to get a better look at the kernels and api calls. One thing it called out was that the grid size was too small and unoptimal for performance. This message was not super suprising since I was running smaller arrays. image ### Final Output (for Size = 2 ^ 8) -``` **************** ** SCAN TESTS ** **************** - [ 10 43 13 38 6 1 25 30 0 26 9 46 40 ... 19 0 ] + [ 44 31 15 33 34 41 21 45 49 9 38 49 30 ... 19 0 ] ==== cpu scan, power-of-two ==== - elapsed time: 0.0006ms (std::chrono Measured) - [ 0 10 53 66 104 110 111 136 166 166 192 201 247 ... 6452 6471 ] + elapsed time: 11.6663ms (std::chrono Measured) + [ 0 44 75 90 123 157 198 219 264 313 322 360 409 ... 102732619 102732638 ] ==== cpu scan, non-power-of-two ==== - elapsed time: 0.0008ms (std::chrono Measured) - [ 0 10 53 66 104 110 111 136 166 166 192 201 247 ... 6385 6400 ] + elapsed time: 17.8068ms (std::chrono Measured) + [ 0 44 75 90 123 157 198 219 264 313 322 360 409 ... 102732514 102732560 ] passed ==== naive scan, power-of-two ==== - elapsed time: 0.446464ms (CUDA Measured) + elapsed time: 2.49738ms (CUDA Measured) passed ==== naive scan, non-power-of-two ==== - elapsed time: 0.105472ms (CUDA Measured) + elapsed time: 2.09478ms (CUDA Measured) passed ==== work-efficient scan, power-of-two ==== - elapsed time: 0.19968ms (CUDA Measured) + elapsed time: 1.50678ms (CUDA Measured) passed ==== work-efficient scan, non-power-of-two ==== - elapsed time: 0.137216ms (CUDA Measured) + elapsed time: 1.06701ms (CUDA Measured) passed ==== thrust scan, power-of-two ==== - elapsed time: 2.11613ms (CUDA Measured) + elapsed time: 9.5096ms (CUDA Measured) passed ==== thrust scan, non-power-of-two ==== - elapsed time: 0.871744ms (CUDA Measured) + elapsed time: 7.08781ms (CUDA Measured) passed ***************************** ** STREAM COMPACTION TESTS ** ***************************** - [ 2 3 1 0 0 1 3 2 0 0 3 2 0 ... 1 0 ] + [ 2 3 1 3 2 2 3 2 2 3 0 1 3 ... 3 0 ] ==== cpu compact without scan, power-of-two ==== - elapsed time: 0.0009ms (std::chrono Measured) - [ 2 3 1 1 3 2 3 2 3 1 3 1 1 ... 2 1 ] + elapsed time: 31.6045ms (std::chrono Measured) + [ 2 3 1 3 2 2 3 2 2 3 1 3 1 ... 2 3 ] passed ==== cpu compact without scan, non-power-of-two ==== - elapsed time: 0.0006ms (std::chrono Measured) - [ 2 3 1 1 3 2 3 2 3 1 3 1 1 ... 1 2 ] + elapsed time: 42.2566ms (std::chrono Measured) + [ 2 3 1 3 2 2 3 2 2 3 1 3 1 ... 2 2 ] passed ==== cpu compact with scan ==== - elapsed time: 0.0036ms (std::chrono Measured) - [ 2 3 1 1 3 2 3 2 3 1 3 1 1 ... 2 1 ] + elapsed time: 82.0855ms (std::chrono Measured) + [ 2 3 1 3 2 2 3 2 2 3 1 3 1 ... 2 3 ] passed ==== work-efficient compact, power-of-two ==== - elapsed time: 0.175104ms (CUDA Measured) + elapsed time: 0.819008ms (CUDA Measured) passed ==== work-efficient compact, non-power-of-two ==== - elapsed time: 0.182464ms (CUDA Measured) + elapsed time: 0.769312ms (CUDA Measured) passed ``` From 5f25785953020e7125d477d1308888e6bcec0eb2 Mon Sep 17 00:00:00 2001 From: 0cfernandes00 Date: Tue, 16 Sep 2025 22:53:58 -0400 Subject: [PATCH 21/24] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ef856690..f072678d 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ CUDA Stream Compaction ### Features & Sections -- [CPU Scan and Stream Compaction](#cpu-scan) -- Naive GPU Scan +- [CPU Scan and Stream Compaction](https://github.com/0cfernandes00/Project2-Stream-Compaction/blob/main/README.md#cpu) +- [Naive GPU Scan](https://github.com/0cfernandes00/Project2-Stream-Compaction/blob/main/README.md#naive) - Work Efficient Scan and Compaction - Thrust Scan - Optimization @@ -30,7 +30,7 @@ This implementation of stream compaction is for removing zeroes from an array of In this process, I first implemented these algorithms on the CPU including Scan(Prefix Sum) and built up to a naive, work efficient, and the thrust implementation of stream compaction. I also optimized my work efficient scan bringing the time on a power-of-2 array from 0.23 ms to 0.08ms for an array size of 2 to the power of 8. -#Cpu Scan + ### CPU This section implemented an Exclusive Prefix Sum (Scan), a Stream Compaction without scan, and finally built up to a Stream Compaction with scan. From 06a785c358ec37c256e132e624ce8d22f8853be0 Mon Sep 17 00:00:00 2001 From: 0cfernandes00 Date: Tue, 16 Sep 2025 22:55:54 -0400 Subject: [PATCH 22/24] Update README.md --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f072678d..791a207d 100644 --- a/README.md +++ b/README.md @@ -11,11 +11,10 @@ CUDA Stream Compaction ### Features & Sections - [CPU Scan and Stream Compaction](https://github.com/0cfernandes00/Project2-Stream-Compaction/blob/main/README.md#cpu) - [Naive GPU Scan](https://github.com/0cfernandes00/Project2-Stream-Compaction/blob/main/README.md#naive) -- Work Efficient Scan and Compaction -- Thrust Scan -- Optimization - - Work Efficient Scan Speedup -- Final Output +- [Work Efficient Scan and Compaction](https://github.com/0cfernandes00/Project2-Stream-Compaction/blob/main/README.md#work-efficient) +- [Thrust Scan](https://github.com/0cfernandes00/Project2-Stream-Compaction/blob/main/README.md#thrust) +- [Optimization Profiling](https://github.com/0cfernandes00/Project2-Stream-Compaction/blob/main/README.md#optimization-analysis) +- [Final Output](https://github.com/0cfernandes00/Project2-Stream-Compaction/blob/main/README.md#final-output-for-size--2--8) ![](img/diagram_two.png) @@ -74,6 +73,7 @@ I was able to use Nsight Systems as well as Nsight Compute to get a better look ### Final Output (for Size = 2 ^ 8) +``` **************** ** SCAN TESTS ** **************** @@ -122,6 +122,7 @@ I was able to use Nsight Systems as well as Nsight Compute to get a better look passed ==== work-efficient compact, power-of-two ==== elapsed time: 0.819008ms (CUDA Measured) +``` passed ==== work-efficient compact, non-power-of-two ==== elapsed time: 0.769312ms (CUDA Measured) From 294f7daf36d4413e28ec399d455b5783a1063af5 Mon Sep 17 00:00:00 2001 From: 0cfernandes00 Date: Tue, 16 Sep 2025 22:58:53 -0400 Subject: [PATCH 23/24] Update README.md --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 791a207d..1fcdafec 100644 --- a/README.md +++ b/README.md @@ -22,9 +22,9 @@ CUDA Stream Compaction The overarching goals for this project were to 1) Understand and implement Stream Compaction on the GPU -2) Practice converting algorithms to be parallel +2) Practice parallelizing algorithms -This implementation of stream compaction is for removing zeroes from an array of ints but this algorithm will be useful for removing unhelpful rays for a path tracer. +This implementation of stream compaction is for removing zeroes from an array of ints, but this algorithm will be useful for future uses in removing unhelpful rays from a path tracer. In this process, I first implemented these algorithms on the CPU including Scan(Prefix Sum) and built up to a naive, work efficient, and the thrust implementation of stream compaction. I also optimized my work efficient scan bringing the time on a power-of-2 array from 0.23 ms to 0.08ms for an array size of 2 to the power of 8. @@ -44,13 +44,13 @@ Smaller array sizes made this implementation look fast since there was little co ### Naive Pseudocode from [GPU Gems 3 Chapter 39 (Section 39.2.1)](https://developer.nvidia.com/gpugems/gpugems3/part-vi-gpu-computing/chapter-39-parallel-prefix-sum-scan-cuda) -The primary hit to performance for the naive implementation could be the multiple accesses to global memory, additionally this implementation required to buffers to swap between in order to prevent race conditions since this algorithm was not intended to be done in-place. +The primary hit to performance for the naive implementation could be the multiple accesses to global memory, additionally this implementation required buffers to swap between in order to prevent race conditions since this algorithm was not intended to be done in-place. ### Work Efficient The Work Efficient Compaction utilized a parallel reduction up-sweep kernel and a down-sweep kernel as part of the sum, provided again from the book. -I tried a few different methods for optimization. I originally implemented it according to the book and lecture slides keeping the kernels seperate. I also tried combining the two operations into a single kernel to reduce the time going to the memory copy I currently do before performing the downsweep. The performance change that ended up making a difference was to reduce the number of blocks that are launched based on the number of threads needed for the current iteration of the loop, as well as using the threads needed for launch as a verification check on larger array sizes. +I tried a few different methods for optimization. I originally implemented it according to the book and lecture slides keeping the kernels seperate. I also tried combining the two operations into a single kernel to reduce the time cost to the memory copy I currently do before performing the downsweep. The performance change that ended up making a difference was to reduce the number of blocks that are launched based on the number of threads needed for the current iteration of the loop, as well as using the threads needed for launch as a verification check on larger array sizes. The NSight Compute report seemed to suggest that the bottleneck was largely in computation usage for this algorithm. The memory overhead and number of writes and reads seemed similar to earlier implementations. The computation and branching considerations for scaling block sizes on kernel launch seemed to have the greatest impact on performance. ![](img/workeff_scan_compute.png) @@ -122,7 +122,6 @@ I was able to use Nsight Systems as well as Nsight Compute to get a better look passed ==== work-efficient compact, power-of-two ==== elapsed time: 0.819008ms (CUDA Measured) -``` passed ==== work-efficient compact, non-power-of-two ==== elapsed time: 0.769312ms (CUDA Measured) From ccc28b0160eabec03cc0a4715282493e2c74b825 Mon Sep 17 00:00:00 2001 From: Caroline Fernandes Date: Tue, 16 Sep 2025 23:02:35 -0400 Subject: [PATCH 24/24] updated chart --- img/diagram_two.png | Bin 36556 -> 36891 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/diagram_two.png b/img/diagram_two.png index df82638473468804aa54ba90861eab0af2264302..ad799f323c9a7f2e967073200d1266b50487334b 100644 GIT binary patch literal 36891 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 KughfLfBs)Qm=0tB