From ab99d649855db354bd0a6476c2748cb61ee15ff5 Mon Sep 17 00:00:00 2001 From: Pontusun Date: Sun, 13 Sep 2015 23:22:30 -0400 Subject: [PATCH 1/3] project 2 done --- README.md | 291 ++++++++++----------------------- images/image1.png | Bin 0 -> 105665 bytes src/main.cpp | 18 +- stream_compaction/common.cu | 18 +- stream_compaction/cpu.cu | 44 ++++- stream_compaction/efficient.cu | 125 +++++++++++++- stream_compaction/naive.cu | 64 +++++++- stream_compaction/thrust.cu | 22 ++- 8 files changed, 348 insertions(+), 234 deletions(-) create mode 100644 images/image1.png diff --git a/README.md b/README.md index a82ea0f..c107457 100644 --- a/README.md +++ b/README.md @@ -3,211 +3,86 @@ CUDA Stream Compaction **University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 2** -* (TODO) YOUR NAME HERE -* Tested on: (TODO) Windows 22, i7-2222 @ 2.22GHz 22GB, GTX 222 222MB (Moore 2222 Lab) - -### (TODO: Your README) - -Include analysis, etc. (Remember, this is public, so don't put -anything here that you don't want to share with the world.) - -Instructions (delete me) -======================== - -This is due Sunday, September 13 at midnight. - -**Summary:** In this project, you'll implement GPU stream compaction in CUDA, -from scratch. This algorithm is widely used, and will be important for -accelerating your path tracer project. - -Your stream compaction implementations in this project will simply remove `0`s -from an array of `int`s. In the path tracer, you will remove terminated paths -from an array of rays. - -In addition to being useful for your path tracer, this project is meant to -reorient your algorithmic thinking to the way of the GPU. On GPUs, many -algorithms can benefit from massive parallelism and, in particular, data -parallelism: executing the same code many times simultaneously with different -data. - -You'll implement a few different versions of the *Scan* (*Prefix Sum*) -algorithm. First, you'll implement a CPU version of the algorithm to reinforce -your understanding. Then, you'll write a few GPU implementations: "naive" and -"work-efficient." Finally, you'll use some of these to implement GPU stream -compaction. - -**Algorithm overview & details:** There are two primary references for details -on the implementation of scan and stream compaction. - -* The [slides on Parallel Algorithms](https://github.com/CIS565-Fall-2015/cis565-fall-2015.github.io/raw/master/lectures/2-Parallel-Algorithms.pptx) - for Scan, Stream Compaction, and Work-Efficient Parallel Scan. -* GPU Gems 3, Chapter 39 - [Parallel Prefix Sum (Scan) with CUDA](http://http.developer.nvidia.com/GPUGems3/gpugems3_ch39.html). - -Your GPU stream compaction implementation will live inside of the -`stream_compaction` subproject. This way, you will be able to easily copy it -over for use in your GPU path tracer. - - -## Part 0: The Usual - -This project (and all other CUDA projects in this course) requires an NVIDIA -graphics card with CUDA capability. Any card with Compute Capability 2.0 -(`sm_20`) or greater will work. Check your GPU on this -[compatibility table](https://developer.nvidia.com/cuda-gpus). -If you do not have a personal machine with these specs, you may use those -computers in the Moore 100B/C which have supported GPUs. - -**HOWEVER**: If you need to use the lab computer for your development, you will -not presently be able to do GPU performance profiling. This will be very -important for debugging performance bottlenecks in your program. - -### Useful existing code - -* `stream_compaction/common.h` - * `checkCUDAError` macro: checks for CUDA errors and exits if there were any. - * `ilog2ceil(x)`: computes the ceiling of log2(x), as an integer. -* `main.cpp` - * Some testing code for your implementations. - - -## Part 1: CPU Scan & Stream Compaction - -This stream compaction method will remove `0`s from an array of `int`s. - -In `stream_compaction/cpu.cu`, implement: - -* `StreamCompaction::CPU::scan`: compute an exclusive prefix sum. -* `StreamCompaction::CPU::compactWithoutScan`: stream compaction without using - the `scan` function. -* `StreamCompaction::CPU::compactWithScan`: stream compaction using the `scan` - function. Map the input array to an array of 0s and 1s, scan it, and use - scatter to produce the output. You will need a **CPU** scatter implementation - for this (see slides or GPU Gems chapter for an explanation). - -These implementations should only be a few lines long. - - -## Part 2: Naive GPU Scan Algorithm - -In `stream_compaction/naive.cu`, implement `StreamCompaction::Naive::scan` - -This uses the "Naive" algorithm from GPU Gems 3, Section 39.2.1. We haven't yet -taught shared memory, and you **shouldn't use it yet**. Example 39-1 uses -shared memory, but is limited to operating on very small arrays! Instead, write -this using global memory only. As a result of this, you will have to do -`ilog2ceil(n)` separate kernel invocations. - -Beware of errors in Example 39-1 in the book; both the pseudocode and the CUDA -code in the online version of Chapter 39 are known to have a few small errors -(in superscripting, missing braces, bad indentation, etc.) - -Since the parallel scan algorithm operates on a binary tree structure, it works -best with arrays with power-of-two length. Make sure your implementation works -on non-power-of-two sized arrays (see `ilog2ceil`). This requires extra memory -- your intermediate array sizes will need to be rounded to the next power of -two. - - -## Part 3: Work-Efficient GPU Scan & Stream Compaction - -### 3.1. Scan - -In `stream_compaction/efficient.cu`, implement -`StreamCompaction::Efficient::scan` - -All of the text in Part 2 applies. - -* This uses the "Work-Efficient" algorithm from GPU Gems 3, Section 39.2.2. -* Beware of errors in Example 39-2. -* Test non-power-of-two sized arrays. - -### 3.2. Stream Compaction - -This stream compaction method will remove `0`s from an array of `int`s. - -In `stream_compaction/efficient.cu`, implement -`StreamCompaction::Efficient::compact` - -For compaction, you will also need to implement the scatter algorithm presented -in the slides and the GPU Gems chapter. - -In `stream_compaction/common.cu`, implement these for use in `compact`: - -* `StreamCompaction::Common::kernMapToBoolean` -* `StreamCompaction::Common::kernScatter` - - -## Part 4: Using Thrust's Implementation - -In `stream_compaction/thrust.cu`, implement: - -* `StreamCompaction::Thrust::scan` - -This should be a very short function which wraps a call to the Thrust library -function `thrust::exclusive_scan(first, last, result)`. - -To measure timing, be sure to exclude memory operations by passing -`exclusive_scan` a `thrust::device_vector` (which is already allocated on the -GPU). You can create a `thrust::device_vector` by creating a -`thrust::host_vector` from the given pointer, then casting it. - - -## Part 5: Radix Sort (Extra Credit) (+10) - -Add an additional module to the `stream_compaction` subproject. Implement radix -sort using one of your scan implementations. Add tests to check its correctness. - - -## Write-up - -1. Update all of the TODOs at the top of this README. -2. Add a description of this project including a list of its features. -3. Add your performance analysis (see below). - -All extra credit features must be documented in your README, explaining its -value (with performance comparison, if applicable!) and showing an example how -it works. For radix sort, show how it is called and an example of its output. - -Always profile with Release mode builds and run without debugging. - -### Questions - -* Roughly optimize the block sizes of each of your implementations for minimal - run time on your GPU. - * (You shouldn't compare unoptimized implementations to each other!) - -* Compare all of these GPU Scan implementations (Naive, Work-Efficient, and - Thrust) to the serial CPU version of Scan. Plot a graph of the comparison - (with array size on the independent axis). - * You should use CUDA events for timing. Be sure **not** to include any - explicit memory operations in your performance measurements, for - comparability. - * To guess at what might be happening inside the Thrust implementation, take - a look at the Nsight timeline for its execution. - -* Write a brief explanation of the phenomena you see here. - * Can you find the performance bottlenecks? Is it memory I/O? Computation? Is - it different for each implementation? - -* Paste the output of the test program into a triple-backtick block in your - README. - * If you add your own tests (e.g. for radix sort or to test additional corner - cases), be sure to mention it explicitly. - -These questions should help guide you in performance analysis on future -assignments, as well. - -## Submit - -If you have modified any of the `CMakeLists.txt` files at all (aside from the -list of `SOURCE_FILES`), you must test that your project can build in Moore -100B/C. Beware of any build issues discussed on the Google Group. - -1. Open a GitHub pull request so that we can see that you have finished. - The title should be "Submission: YOUR NAME". -2. Send an email to the TA (gmail: kainino1+cis565@) with: - * **Subject**: in the form of `[CIS565] Project 2: PENNKEY` - * Direct link to your pull request on GitHub - * In the form of a grade (0-100+) with comments, evaluate your own - performance on the project. - * Feedback on the project itself, if any. +* Guan Sun +* Tested on: Mac OS X Yosemite 10.10.5, Intel Core i7 @ 2.3GHz 8GB, GeForce GT 650M 1024MB (Personal Laptop) + +## Project Description: + +In this project, the widely used GPU stream compaction is implemented in CUDA from scratch. The code of this project implemented the following: +* CPU Scan & Stream Campaction +* Naive GPU Scan Algorithm +* Work-Efficient GPU Scan & Stream Compaction +* Tested Thrust's Implementation + +## Performance Analysis: + +After optimizing the block sizes of each of the implementations for minimal run time. The comparision of different scan implementations are shown in the folloing figure. The X axis is the log of the array length, and the Y axis is the run time in ms. + +![](images/image1.png) + +* For the GPU Naive implemention, it need to invoke the kernal funciton for `ilog2ceil(x)` times and each time the input data memory and output data memory on the GPU need to be swapped. This should be the bottleneck. +* For the GPU Work-Efficient implementation, it need to sweep up first and then sweep down, that means it will need to invoke both of them `ilog2ceil(x)` times, and each time the input and output data memory also need to be swapped. Besides, after the up-sweep, the result need to be copied to host memory to insert 0 and then copy to device memory. All these factors limits the performance of the Work-Efficient implementation. + + +## Test Output: + +''' +**************** +** SCAN TESTS ** +**************** + [ 30 41 15 22 11 41 10 37 48 41 44 30 26 ... 14 0 ] +==== cpu scan, power-of-two ==== +CPU scan time is 0.0279 ms + [ 0 30 71 86 108 119 160 170 207 255 296 340 370 ... 101214 101228 ] +==== cpu scan, non-power-of-two ==== +CPU scan time is 0.0109 ms + [ 0 30 71 86 108 119 160 170 207 255 296 340 370 ... 101145 101172 ] + passed +==== naive scan, power-of-two ==== +GPU naive scan time is 0.3535 ms + [ 0 30 71 86 108 119 160 170 207 255 296 340 370 ... 101214 101228 ] + passed +==== naive scan, non-power-of-two ==== +GPU naive scan time is 0.4841 ms + [ 0 30 71 86 108 119 160 170 207 255 296 340 370 ... 101172 101172 ] + passed +==== work-efficient scan, power-of-two ==== +GPU work-efficient scan time is 1.8733 ms + [ 0 30 71 86 108 119 160 170 207 255 296 340 370 ... 101214 101228 ] + passed +==== work-efficient scan, non-power-of-two ==== +GPU work-efficient scan time is 1.7858 ms + [ 0 30 71 86 108 119 160 170 207 255 296 340 370 ... 101145 101172 ] + passed +==== thrust scan, power-of-two ==== +Thrust scan time is 12.0354 ms + [ 0 30 71 86 108 119 160 170 207 255 296 340 370 ... 101214 101228 ] + passed +==== thrust scan, non-power-of-two ==== +Thrust scan time is 10.5153 ms + [ 0 30 71 86 108 119 160 170 207 255 296 340 370 ... 101145 101172 ] + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 2 3 3 0 1 1 2 1 2 1 2 0 2 ... 0 0 ] +==== cpu compact without scan, power-of-two ==== + [ 2 3 3 1 1 2 1 2 1 2 2 2 3 ... 3 1 ] + passed +==== cpu compact without scan, non-power-of-two ==== + [ 2 3 3 1 1 2 1 2 1 2 2 2 3 ... 1 3 ] + passed +==== cpu compact with scan ==== +CPU scan time is 0.0162 ms + [ 2 3 3 1 1 2 1 2 1 2 2 2 3 ... 3 1 ] + passed +==== work-efficient compact, power-of-two ==== +GPU work-efficient scan time is 0.5802 ms + [ 2 3 3 1 1 2 1 2 1 2 2 2 3 ... 3 1 ] + passed +==== work-efficient compact, non-power-of-two ==== +GPU work-efficient scan time is 0.5833 ms + [ 2 3 3 1 1 2 1 2 1 2 2 2 3 ... 1 3 ] + passed +''' \ No newline at end of file diff --git a/images/image1.png b/images/image1.png new file mode 100644 index 0000000000000000000000000000000000000000..2a440b7bf5cc12d3d4c404cb2b295598f9bacf0b GIT binary patch literal 105665 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 literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp index 675da35..0eca358 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,7 +14,7 @@ #include "testing_helpers.hpp" int main(int argc, char* argv[]) { - const int SIZE = 1 << 8; + const int SIZE = 1 << 12; const int NPOT = SIZE - 3; int a[SIZE], b[SIZE], c[SIZE]; @@ -43,37 +43,37 @@ int main(int argc, char* argv[]) { zeroArray(SIZE, c); printDesc("naive scan, power-of-two"); StreamCompaction::Naive::scan(SIZE, c, a); - //printArray(SIZE, c, true); + printArray(SIZE, c, true); printCmpResult(SIZE, b, c); zeroArray(SIZE, c); printDesc("naive scan, non-power-of-two"); StreamCompaction::Naive::scan(NPOT, c, a); - //printArray(SIZE, c, true); + printArray(SIZE, c, true); printCmpResult(NPOT, b, c); zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); StreamCompaction::Efficient::scan(SIZE, c, a); - //printArray(SIZE, c, true); + printArray(SIZE, c, true); printCmpResult(SIZE, b, c); zeroArray(SIZE, c); printDesc("work-efficient scan, non-power-of-two"); StreamCompaction::Efficient::scan(NPOT, c, a); - //printArray(NPOT, c, true); + printArray(NPOT, c, true); printCmpResult(NPOT, b, c); zeroArray(SIZE, c); printDesc("thrust scan, power-of-two"); StreamCompaction::Thrust::scan(SIZE, c, a); - //printArray(SIZE, c, true); + printArray(SIZE, c, true); printCmpResult(SIZE, b, c); zeroArray(SIZE, c); printDesc("thrust scan, non-power-of-two"); StreamCompaction::Thrust::scan(NPOT, c, a); - //printArray(NPOT, c, true); + printArray(NPOT, c, true); printCmpResult(NPOT, b, c); printf("\n"); @@ -112,12 +112,12 @@ int main(int argc, char* argv[]) { zeroArray(SIZE, c); printDesc("work-efficient compact, power-of-two"); count = StreamCompaction::Efficient::compact(SIZE, c, a); - //printArray(count, c, true); + printArray(count, c, true); printCmpLenResult(count, expectedCount, b, c); zeroArray(SIZE, c); printDesc("work-efficient compact, non-power-of-two"); count = StreamCompaction::Efficient::compact(NPOT, c, a); - //printArray(count, c, true); + printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); } diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index fe872d4..e529766 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -23,7 +23,15 @@ namespace Common { * which map to 0 will be removed, and elements which map to 1 will be kept. */ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { - // TODO + int index = threadIdx.x + (blockIdx.x * blockDim.x); + + if( index0 && (index+1)%(1<>>(n_new, j, dev_odata, dev_idata); + //cudaMemcpy(dev_idata, dev_odata, n_new * sizeof(int), cudaMemcpyDeviceToDevice); + dev_idata = dev_odata; + } + cudaMemcpy(idata_new, dev_odata, n_new * sizeof(int), cudaMemcpyDeviceToHost); + + idata_new[n_new-1] = 0; + cudaMemcpy(dev_idata, idata_new, n_new * sizeof(int), cudaMemcpyHostToDevice); + for(int k=ilog2ceil(n)-1; k>=0; k--) { + gpu_scan_down<<>>(n_new, k, dev_odata, dev_idata); + //cudaMemcpy(dev_idata, dev_odata, n_new * sizeof(int), cudaMemcpyDeviceToDevice); + dev_idata = dev_odata; + } + cudaEventRecord(stop); + + cudaEventSynchronize(stop); + cudaEventElapsedTime(&time, start, stop); + printf("GPU work-efficient scan time is %.4f ms \n", time); + + cudaMemcpy(odata, dev_odata, n_new * sizeof(int), cudaMemcpyDeviceToHost); + cudaFree(dev_idata); + cudaFree(dev_odata); } /** @@ -26,8 +103,46 @@ void scan(int n, int *odata, const int *idata) { * @returns The number of elements remaining after compaction. */ int compact(int n, int *odata, const int *idata) { - // TODO - return -1; + + int *dev_idata; + int *dev_odata; + int *dev_bools; + int *dev_indices; + + int hst_bools[n]; + int hst_indices[n]; + + int blockSize = 1024; + + dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); + + cudaMalloc((void**)&dev_idata, n * sizeof(int)); + cudaMalloc((void**)&dev_odata, n * sizeof(int)); + cudaMalloc((void**)&dev_bools, n * sizeof(int)); + cudaMalloc((void**)&dev_indices, n * sizeof(int)); + + cudaMemcpy(dev_idata, idata, n * sizeof(int), cudaMemcpyHostToDevice); + Common::kernMapToBoolean<<>>(n, dev_bools, dev_idata); + cudaMemcpy(hst_bools, dev_bools, n * sizeof(int), cudaMemcpyDeviceToHost); + + scan(n, hst_indices, hst_bools); + //printf("n is %d \n", n); + + cudaMemcpy(dev_indices, hst_indices, n * sizeof(int), cudaMemcpyHostToDevice); + Common::kernScatter<<>>(n, dev_odata, dev_idata, dev_bools, dev_indices); + cudaMemcpy(odata, dev_odata, n * sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(dev_idata); + cudaFree(dev_odata); + cudaFree(dev_bools); + cudaFree(dev_indices); + + if(idata[n-1] == 0) { + return hst_indices[n-1]; + } else { + return hst_indices[n-1] + 1; + } + } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 3d86b60..c0056e7 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -3,17 +3,75 @@ #include "common.h" #include "naive.h" + namespace StreamCompaction { namespace Naive { -// TODO: __global__ +__global__ void gpu_scan(int n, int d, int *odata, int *idata) { + int index = threadIdx.x + (blockIdx.x * blockDim.x); + + if( index < n ) { + if( index >= (1 << (d-1)) ) { + odata[index] = idata[index] + idata[index-(1 << (d-1))]; + } else { + odata[index] = idata[index]; + } + } +} /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { - // TODO - printf("TODO\n"); + int *dev_idata; + int *dev_odata; + int blockSize=1024; + +// int idata_new[n]; +// idata_new[0] = 0; +// for(int k=0; k>>(n_new, i, dev_odata, dev_idata); + cudaMemcpy(dev_idata, dev_odata, n_new * sizeof(int), cudaMemcpyDeviceToDevice); + //dev_idata = dev_odata; + } + cudaEventRecord(stop); + + cudaEventSynchronize(stop); + cudaEventElapsedTime(&time, start, stop); + printf("GPU naive scan time is %.4f ms \n", time); + + cudaMemcpy(odata, dev_odata, n_new * sizeof(int), cudaMemcpyDeviceToHost); + cudaFree(dev_idata); + cudaFree(dev_odata); + } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index d8dbb32..51340a2 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -13,9 +13,25 @@ namespace Thrust { * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { - // 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::host_vector thrustHst_idata(idata, idata+n); + thrust::device_vector thrustDev_idata(thrustHst_idata); + thrust::device_vector thrustDev_odata(n); + + float time = 0; + cudaEvent_t start, stop; + cudaEventCreate(&start); + cudaEventCreate(&stop); + + cudaEventRecord(start); + thrust::exclusive_scan(thrustDev_idata.begin(), thrustDev_idata.end(), thrustDev_odata.begin()); + cudaEventRecord(stop); + + cudaEventSynchronize(stop); + cudaEventElapsedTime(&time, start, stop); + printf("Thrust scan time is %.4f ms \n", time); + + thrust::copy(thrustDev_odata.begin(), thrustDev_odata.end(), odata); } } From 294cb163e4018f290f21a6de47fabf01ac03ea4f Mon Sep 17 00:00:00 2001 From: Pontusun Date: Sun, 13 Sep 2015 23:31:07 -0400 Subject: [PATCH 2/3] readme.md updated --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c107457..802c701 100644 --- a/README.md +++ b/README.md @@ -20,13 +20,14 @@ After optimizing the block sizes of each of the implementations for minimal run ![](images/image1.png) -* For the GPU Naive implemention, it need to invoke the kernal funciton for `ilog2ceil(x)` times and each time the input data memory and output data memory on the GPU need to be swapped. This should be the bottleneck. +* For the GPU Naive implemention, it needs to invoke the kernal funciton for `ilog2ceil(x)` times and each time the input data memory and output data memory on the GPU need to be swapped. This should be the bottleneck. * For the GPU Work-Efficient implementation, it need to sweep up first and then sweep down, that means it will need to invoke both of them `ilog2ceil(x)` times, and each time the input and output data memory also need to be swapped. Besides, after the up-sweep, the result need to be copied to host memory to insert 0 and then copy to device memory. All these factors limits the performance of the Work-Efficient implementation. +* For the Thrust's Implementation, since the run time is longer than all others, it is possible that there are time cosuming memory allocationa and memory copy operations inside it. While the time these operations in GPU Naive and GPU Work-Efficient are not included in the run time. ## Test Output: -''' +``` **************** ** SCAN TESTS ** **************** @@ -85,4 +86,4 @@ GPU work-efficient scan time is 0.5802 ms GPU work-efficient scan time is 0.5833 ms [ 2 3 3 1 1 2 1 2 1 2 2 2 3 ... 1 3 ] passed -''' \ No newline at end of file +``` \ No newline at end of file From 4ce92118fd9730e54e385718fe7aeee3e810166d Mon Sep 17 00:00:00 2001 From: Pontusun Date: Sun, 13 Sep 2015 23:34:53 -0400 Subject: [PATCH 3/3] readme.md updated --- README.md | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 802c701..8c4f0c7 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ After optimizing the block sizes of each of the implementations for minimal run * For the GPU Naive implemention, it needs to invoke the kernal funciton for `ilog2ceil(x)` times and each time the input data memory and output data memory on the GPU need to be swapped. This should be the bottleneck. * For the GPU Work-Efficient implementation, it need to sweep up first and then sweep down, that means it will need to invoke both of them `ilog2ceil(x)` times, and each time the input and output data memory also need to be swapped. Besides, after the up-sweep, the result need to be copied to host memory to insert 0 and then copy to device memory. All these factors limits the performance of the Work-Efficient implementation. -* For the Thrust's Implementation, since the run time is longer than all others, it is possible that there are time cosuming memory allocationa and memory copy operations inside it. While the time these operations in GPU Naive and GPU Work-Efficient are not included in the run time. +* For the Thrust's Implementation, since the run time is longer than all others, it is possible that there are time cosuming memory allocationa and memory copy operations inside it. While the time of these operations in GPU Naive and GPU Work-Efficient are not included in the run time. ## Test Output: @@ -33,34 +33,34 @@ After optimizing the block sizes of each of the implementations for minimal run **************** [ 30 41 15 22 11 41 10 37 48 41 44 30 26 ... 14 0 ] ==== cpu scan, power-of-two ==== -CPU scan time is 0.0279 ms +CPU scan time is 0.0110 ms [ 0 30 71 86 108 119 160 170 207 255 296 340 370 ... 101214 101228 ] ==== cpu scan, non-power-of-two ==== -CPU scan time is 0.0109 ms +CPU scan time is 0.0114 ms [ 0 30 71 86 108 119 160 170 207 255 296 340 370 ... 101145 101172 ] passed ==== naive scan, power-of-two ==== -GPU naive scan time is 0.3535 ms +GPU naive scan time is 0.3148 ms [ 0 30 71 86 108 119 160 170 207 255 296 340 370 ... 101214 101228 ] passed ==== naive scan, non-power-of-two ==== -GPU naive scan time is 0.4841 ms +GPU naive scan time is 0.3000 ms [ 0 30 71 86 108 119 160 170 207 255 296 340 370 ... 101172 101172 ] passed ==== work-efficient scan, power-of-two ==== -GPU work-efficient scan time is 1.8733 ms +GPU work-efficient scan time is 0.5871 ms [ 0 30 71 86 108 119 160 170 207 255 296 340 370 ... 101214 101228 ] passed ==== work-efficient scan, non-power-of-two ==== -GPU work-efficient scan time is 1.7858 ms +GPU work-efficient scan time is 0.5866 ms [ 0 30 71 86 108 119 160 170 207 255 296 340 370 ... 101145 101172 ] passed ==== thrust scan, power-of-two ==== -Thrust scan time is 12.0354 ms +Thrust scan time is 8.9855 ms [ 0 30 71 86 108 119 160 170 207 255 296 340 370 ... 101214 101228 ] passed ==== thrust scan, non-power-of-two ==== -Thrust scan time is 10.5153 ms +Thrust scan time is 9.9013 ms [ 0 30 71 86 108 119 160 170 207 255 296 340 370 ... 101145 101172 ] passed @@ -79,11 +79,12 @@ CPU scan time is 0.0162 ms [ 2 3 3 1 1 2 1 2 1 2 2 2 3 ... 3 1 ] passed ==== work-efficient compact, power-of-two ==== -GPU work-efficient scan time is 0.5802 ms +GPU work-efficient scan time is 1.8664 ms [ 2 3 3 1 1 2 1 2 1 2 2 2 3 ... 3 1 ] passed ==== work-efficient compact, non-power-of-two ==== -GPU work-efficient scan time is 0.5833 ms +GPU work-efficient scan time is 1.8314 ms [ 2 3 3 1 1 2 1 2 1 2 2 2 3 ... 1 3 ] passed + ``` \ No newline at end of file