From 71d88b6c982975d9d47bc340e9362e0df52f575d Mon Sep 17 00:00:00 2001 From: ACskyline Date: Tue, 18 Sep 2018 15:13:14 -0400 Subject: [PATCH 1/9] basic --- src/main.cpp | 4 +- stream_compaction/CMakeLists.txt | 2 +- stream_compaction/common.cu | 11 +++ stream_compaction/common.h | 4 + stream_compaction/cpu.cu | 40 ++++++++- stream_compaction/efficient.cu | 145 ++++++++++++++++++++++++++++++- stream_compaction/naive.cu | 51 ++++++++++- stream_compaction/thrust.cu | 10 ++- 8 files changed, 257 insertions(+), 10 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 1850161..2dc8a5b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -137,14 +137,14 @@ int main(int argc, char* argv[]) { printDesc("work-efficient compact, power-of-two"); count = StreamCompaction::Efficient::compact(SIZE, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(count, c, true); + printArray(count, c, true); printCmpLenResult(count, expectedCount, b, c); zeroArray(SIZE, c); printDesc("work-efficient compact, non-power-of-two"); count = StreamCompaction::Efficient::compact(NPOT, c, a); printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(count, c, true); + printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); system("pause"); // stop Win32 console from closing on exit diff --git a/stream_compaction/CMakeLists.txt b/stream_compaction/CMakeLists.txt index cdbef77..48e2f35 100644 --- a/stream_compaction/CMakeLists.txt +++ b/stream_compaction/CMakeLists.txt @@ -13,5 +13,5 @@ set(SOURCE_FILES cuda_add_library(stream_compaction ${SOURCE_FILES} - OPTIONS -arch=sm_20 + OPTIONS -arch=sm_60 ) diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 8fc0211..6de0ca7 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -24,6 +24,10 @@ namespace StreamCompaction { */ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { // TODO + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) return; + + bools[index] = (int)(idata[index] != 0); } /** @@ -33,6 +37,13 @@ namespace StreamCompaction { __global__ void kernScatter(int n, int *odata, const int *idata, const int *bools, const int *indices) { // TODO + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) return; + + if (bools[index]) + { + odata[indices[index]] = idata[index]; + } } } diff --git a/stream_compaction/common.h b/stream_compaction/common.h index 99a1b04..95746c4 100644 --- a/stream_compaction/common.h +++ b/stream_compaction/common.h @@ -13,6 +13,10 @@ #define FILENAME (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) #define checkCUDAError(msg) checkCUDAErrorFn(msg, FILENAME, __LINE__) +#define blocksize 128 + +#define SYNC_GRID + /** * Check for CUDA errors; print and exit if there was a problem. */ diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 05ce667..53e6b0c 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -20,6 +20,13 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + + odata[0] = 0; + for (int i = 1; i < n; i++) + { + odata[i] = odata[i - 1] + idata[i - 1]; + } + timer().endCpuTimer(); } @@ -31,8 +38,18 @@ namespace StreamCompaction { int compactWithoutScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + + int count = 0; + for (int i = 0; i < n; i++) + { + if (idata[i] != 0) + { + odata[count++] = idata[i]; + } + } + timer().endCpuTimer(); - return -1; + return count; } /** @@ -43,8 +60,27 @@ namespace StreamCompaction { int compactWithScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + int count = 0; + + //scan + odata[0] = 0; + for (int i = 1; i < n; i++) + { + odata[i] = odata[i - 1] + (idata[i - 1]!=0);//map to boolean + } + + //scatter + for (int i = 0; i < n; i++) + { + if (idata[i] != 0) + { + odata[odata[i]] = idata[i]; + count++; + } + } + timer().endCpuTimer(); - return -1; + return count; } } } diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 36c5ef2..10ce147 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -12,13 +12,75 @@ namespace StreamCompaction { return timer; } + __global__ void kernUpSweep(int n, int POT, int POT_EX, int *data) + { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) return; + if (index % POT_EX != 0) return; + + data[index + POT_EX - 1] += data[index + POT - 1]; + } + + __global__ void kernDownSweep(int n, int POT, int POT_EX, int *data) + { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) return; + if (index % POT_EX != 0) return; + + int temp = data[index + POT - 1]; + data[index + POT - 1] = data[index + POT_EX - 1]; + data[index + POT_EX - 1] += temp; + } + + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + int count = ilog2ceil(n); + int number = 1 << count; + int *dev_data; + dim3 gridsize((number - 1) / blocksize + 1); + + cudaMalloc((void**)&dev_data, number * sizeof(int)); + checkCUDAErrorFn("malloc dev_data"); + + cudaMemcpy(dev_data, idata, n * sizeof(int), cudaMemcpyHostToDevice); + if (number > n) + { + cudaMemset(dev_data + n, 0, (number - n) * sizeof(int)); + checkCUDAErrorFn("set dev_data"); + } + + //start ticking timer().startGpuTimer(); - // TODO + for (int i = 0; i < count; i++) + { + kernUpSweep << > > (number, 1 << i, 1 << i + 1, dev_data); +#ifdef SYNC_GRID + cudaThreadSynchronize(); +#endif + } + + //set data[number-1] to 0 + cudaMemset((void*)(dev_data + (number - 1)), 0, sizeof(int)); + checkCUDAErrorFn("set dev_data[number-1]"); + + for (int i = count - 1; i >= 0; i--) + { + kernDownSweep << > > (number, 1 << i, 1 << i + 1, dev_data); +#ifdef SYNC_GRID + cudaThreadSynchronize(); +#endif + } + + //stop ticking timer().endGpuTimer(); + + cudaMemcpy(odata, dev_data, n * sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(dev_data); + checkCUDAErrorFn("free dev_data"); } /** @@ -31,10 +93,87 @@ namespace StreamCompaction { * @returns The number of elements remaining after compaction. */ int compact(int n, int *odata, const int *idata) { + int result = 0; + int count = ilog2ceil(n); + int number = 1 << count; + int *dev_idata; + int *dev_odata; + int *dev_indices; + int *dev_bools; + dim3 gridsize((number - 1) / blocksize + 1); + dim3 gridsize_EXACT((n - 1) / blocksize + 1); + + cudaMalloc((void**)&dev_idata, n * sizeof(int)); + checkCUDAErrorFn("malloc dev_idata"); + + cudaMalloc((void**)&dev_odata, n * sizeof(int)); + checkCUDAErrorFn("malloc dev_odata"); + + cudaMalloc((void**)&dev_indices, number * sizeof(int)); + checkCUDAErrorFn("malloc dev_indices"); + + cudaMalloc((void**)&dev_bools, n * sizeof(int)); + checkCUDAErrorFn("malloc dev_bools"); + + + cudaMemcpy(dev_idata, idata, n * sizeof(int), cudaMemcpyHostToDevice); + checkCUDAErrorFn("memcpy dev_idata"); + + Common::kernMapToBoolean << > > (n, dev_bools, dev_idata); + + cudaMemcpy(dev_indices, dev_bools, n * sizeof(int), cudaMemcpyDeviceToDevice); + + if (number > n) + { + cudaMemset(dev_indices + n, 0, (number - n) * sizeof(int)); + checkCUDAErrorFn("set dev_indices"); + } + + //start ticking timer().startGpuTimer(); - // TODO + + for (int i = 0; i < count; i++) + { + kernUpSweep << > > (number, 1 << i, 1 << i + 1, dev_indices); +#ifdef SYNC_GRID + cudaThreadSynchronize(); +#endif + } + + //set data[number-1] to 0 + cudaMemset((void*)(dev_indices + (number - 1)), 0, sizeof(int)); + checkCUDAErrorFn("set dev_indices[number-1]"); + + + for (int i = count - 1; i >= 0; i--) + { + kernDownSweep << > > (number, 1 << i, 1 << i + 1, dev_indices); +#ifdef SYNC_GRID + cudaThreadSynchronize(); +#endif + } + + Common::kernScatter << > > (n, dev_odata, dev_idata, dev_bools, dev_indices); + + //stop ticking timer().endGpuTimer(); - return -1; + + cudaMemcpy(&result, dev_indices + (n - 1), sizeof(int), cudaMemcpyDeviceToHost); + result += (int)(idata[n - 1] != 0); + cudaMemcpy(odata, dev_odata, n * sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(dev_idata); + checkCUDAErrorFn("free dev_idata"); + + cudaFree(dev_odata); + checkCUDAErrorFn("free dev_odata"); + + cudaFree(dev_indices); + checkCUDAErrorFn("free dev_indices"); + + cudaFree(dev_bools); + checkCUDAErrorFn("free dev_bools"); + return result; } } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 9218f8e..0d97c8d 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -12,14 +12,63 @@ namespace StreamCompaction { return timer; } // TODO: __global__ + __global__ void kernScan(int n, int POT, int *odata, int *idata) + { + int index = blockIdx.x * blockDim.x + threadIdx.x; + if (index >= n) return; + if (index >= POT) + { + odata[index] = idata[index] + idata[index - POT]; + } + 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) { + int count = ilog2ceil(n); + int *dev_odata; + int *dev_idata; + dim3 gridsize((n - 1) / blocksize + 1); + + cudaMalloc((void**)&dev_odata, n * sizeof(int)); + checkCUDAErrorFn("malloc dev_odata"); + + cudaMalloc((void**)&dev_idata, n * sizeof(int)); + checkCUDAErrorFn("malloc dev_idata"); + + cudaMemcpy(dev_idata, idata, n * sizeof(int), cudaMemcpyHostToDevice); + timer().startGpuTimer(); - // TODO + for (int i = 0; i < count; i++) + { + kernScan << > > (n, 1 << i, dev_odata, dev_idata); +#ifdef SYNC_GRID + cudaThreadSynchronize(); +#endif + if (i != count - 1)//if not last time, exchange buffer for next kern + { + int *temp = dev_odata; + dev_odata = dev_idata; + dev_idata = temp; + } + } timer().endGpuTimer(); + + //shift right and insert identity + cudaMemcpy(odata + 1, dev_odata, (n - 1) * sizeof(int), cudaMemcpyDeviceToHost); + odata[0] = 0; + + cudaFree(dev_odata); + checkCUDAErrorFn("free dev_odata"); + + cudaFree(dev_idata); + checkCUDAErrorFn("free dev_idata"); + } } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 36b732d..781ebcc 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -18,11 +18,19 @@ 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(thrust::host_vector(idata, idata + n)); + thrust::device_vector dv_out(thrust::host_vector(odata, odata + n)); + + timer().startGpuTimer(); + thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); timer().endGpuTimer(); + + cudaMemcpy(odata, dv_out.data().get(), sizeof(int) * n, cudaMemcpyDeviceToHost); + checkCUDAErrorFn("memcpy back failed!"); + } } } From 62fb67eb9b61e8d033549455a810ff27a67c5d12 Mon Sep 17 00:00:00 2001 From: ACskyline Date: Tue, 18 Sep 2018 19:15:33 -0400 Subject: [PATCH 2/9] for in kernel --- stream_compaction/common.cu | 1 - stream_compaction/common.h | 2 +- stream_compaction/efficient.cu | 143 ++++++++++++++++----------------- 3 files changed, 71 insertions(+), 75 deletions(-) diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 6de0ca7..3ae0084 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -14,7 +14,6 @@ void checkCUDAErrorFn(const char *msg, const char *file, int line) { exit(EXIT_FAILURE); } - namespace StreamCompaction { namespace Common { diff --git a/stream_compaction/common.h b/stream_compaction/common.h index 95746c4..d2c2d49 100644 --- a/stream_compaction/common.h +++ b/stream_compaction/common.h @@ -15,7 +15,7 @@ #define blocksize 128 -#define SYNC_GRID +//#define SYNC_GRID /** * Check for CUDA errors; print and exit if there was a problem. diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 10ce147..538137a 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -4,39 +4,59 @@ #include "efficient.h" namespace StreamCompaction { - namespace Efficient { - using StreamCompaction::Common::PerformanceTimer; - PerformanceTimer& timer() - { - static PerformanceTimer timer; - return timer; - } - - __global__ void kernUpSweep(int n, int POT, int POT_EX, int *data) + namespace Efficient { + using StreamCompaction::Common::PerformanceTimer; + PerformanceTimer& timer() + { + static PerformanceTimer timer; + return timer; + } + + __global__ void kernUpSweep(int n, int count, int *data) { int index = blockIdx.x * blockDim.x + threadIdx.x; if (index >= n) return; - if (index % POT_EX != 0) return; - data[index + POT_EX - 1] += data[index + POT - 1]; + for (int i = 0; i < count; i++) + { + int POT = 1 << i; + int POT_EX = 1 << i + 1; + if (index % POT_EX == 0) + { + data[index + POT_EX - 1] += data[index + POT - 1]; + } + else + { + return; + } + __syncthreads(); + } } - - __global__ void kernDownSweep(int n, int POT, int POT_EX, int *data) + + __global__ void kernDownSweep(int n, int count, int *data) { int index = blockIdx.x * blockDim.x + threadIdx.x; if (index >= n) return; - if (index % POT_EX != 0) return; - - int temp = data[index + POT - 1]; - data[index + POT - 1] = data[index + POT_EX - 1]; - data[index + POT_EX - 1] += temp; + + for (int i = count - 1; i >= 0; i--) + { + int POT = 1 << i; + int POT_EX = 1 << i + 1; + if (index % POT_EX == 0) + { + int temp = data[index + POT - 1]; + data[index + POT - 1] = data[index + POT_EX - 1]; + data[index + POT_EX - 1] += temp; + } + __syncthreads(); + } } - /** - * Performs prefix-sum (aka scan) on idata, storing the result into odata. - */ - void scan(int n, int *odata, const int *idata) { + /** + * Performs prefix-sum (aka scan) on idata, storing the result into odata. + */ + void scan(int n, int *odata, const int *idata) { int count = ilog2ceil(n); int number = 1 << count; int *dev_data; @@ -53,46 +73,35 @@ namespace StreamCompaction { } //start ticking - timer().startGpuTimer(); - for (int i = 0; i < count; i++) - { - kernUpSweep << > > (number, 1 << i, 1 << i + 1, dev_data); -#ifdef SYNC_GRID - cudaThreadSynchronize(); -#endif - } + timer().startGpuTimer(); + //up sweep + kernUpSweep << > > (number, count, dev_data); //set data[number-1] to 0 cudaMemset((void*)(dev_data + (number - 1)), 0, sizeof(int)); checkCUDAErrorFn("set dev_data[number-1]"); - - for (int i = count - 1; i >= 0; i--) - { - kernDownSweep << > > (number, 1 << i, 1 << i + 1, dev_data); -#ifdef SYNC_GRID - cudaThreadSynchronize(); -#endif - } + //down sweep + kernDownSweep << > > (number, count, dev_data); //stop ticking - timer().endGpuTimer(); + timer().endGpuTimer(); cudaMemcpy(odata, dev_data, n * sizeof(int), cudaMemcpyDeviceToHost); cudaFree(dev_data); checkCUDAErrorFn("free dev_data"); - } - - /** - * Performs stream compaction on idata, storing the result into odata. - * All zeroes are discarded. - * - * @param n The number of elements in idata. - * @param odata The array into which to store elements. - * @param idata The array of elements to compact. - * @returns The number of elements remaining after compaction. - */ - int compact(int n, int *odata, const int *idata) { + } + + /** + * Performs stream compaction on idata, storing the result into odata. + * All zeroes are discarded. + * + * @param n The number of elements in idata. + * @param odata The array into which to store elements. + * @param idata The array of elements to compact. + * @returns The number of elements remaining after compaction. + */ + int compact(int n, int *odata, const int *idata) { int result = 0; int count = ilog2ceil(n); int number = 1 << count; @@ -130,33 +139,21 @@ namespace StreamCompaction { } //start ticking - timer().startGpuTimer(); - - for (int i = 0; i < count; i++) - { - kernUpSweep << > > (number, 1 << i, 1 << i + 1, dev_indices); -#ifdef SYNC_GRID - cudaThreadSynchronize(); -#endif - } + timer().startGpuTimer(); + //up sweep + kernUpSweep << > > (number, count, dev_indices); //set data[number-1] to 0 cudaMemset((void*)(dev_indices + (number - 1)), 0, sizeof(int)); checkCUDAErrorFn("set dev_indices[number-1]"); + //down sweep + kernDownSweep << > > (number, count, dev_indices); - - for (int i = count - 1; i >= 0; i--) - { - kernDownSweep << > > (number, 1 << i, 1 << i + 1, dev_indices); -#ifdef SYNC_GRID - cudaThreadSynchronize(); -#endif - } Common::kernScatter << > > (n, dev_odata, dev_idata, dev_bools, dev_indices); //stop ticking - timer().endGpuTimer(); + timer().endGpuTimer(); cudaMemcpy(&result, dev_indices + (n - 1), sizeof(int), cudaMemcpyDeviceToHost); result += (int)(idata[n - 1] != 0); @@ -173,7 +170,7 @@ namespace StreamCompaction { cudaFree(dev_bools); checkCUDAErrorFn("free dev_bools"); - return result; - } - } -} + return result; + } + } +} \ No newline at end of file From ef4348d622f5f45b15bb2f1d6fe1643f5ae6b9df Mon Sep 17 00:00:00 2001 From: ACskyline Date: Tue, 18 Sep 2018 21:17:34 -0400 Subject: [PATCH 3/9] readme --- README.md | 384 ++++++++++++++++++++++++++++++++- stream_compaction/common.h | 2 +- stream_compaction/efficient.cu | 77 +++---- 3 files changed, 419 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 0e38ddb..1e31898 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,384 @@ 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) +* Xiao Zhang + * [LinkedIn](https://www.linkedin.com/in/xiao-zhang-674bb8148/) +* Tested on: Windows 10, i7-7700K @ 4.20GHz 16.0GB, GTX 1080 15.96GB (my own PC) -### (TODO: Your README) +### Analysis -Include analysis, etc. (Remember, this is public, so don't put -anything here that you don't want to share with the world.) +#### Power-of-two +![](images/1.JPG) + +#### Non-power-of-two + +![](images/2.JPG) + +### Q&A + +#### 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? + +The first phenomenon is that all GPU algorithm is slower than CPU algorithm. This may be because of there is context changing between GPU and CPU for GPU algorithms whereas there is not for the CPU algorithm. + +The second phenomenon is that efficient GPU algorithm is not faster than naive GPU algorithm. This may be because the naive GPU algorithm contains only one pass and the efficient GPU algorithm contains two pass, and during those two passes, the scheduling is not reliable, which means early termination somehow does not alleviate the idling of some GPU threads. Cache may be another reason why naive algorithm is faster. In naive algorithm, we are accessing the array sequentially, where in efficient algorithm, we are accessing the array with a changing step. Also, we are doing more global reading and writing in the efficienet algorithm. + +The third phenomenon is that thrust scan algorithm is slower than any other algorithm. One possible reason is that the blocksize and gridsize is not set properly and thrust just uses some default value, which is not optimal for my hardware condition. + +The last phenomenon is that for arrays whose size is a non-power-of-two number, the efficient algorithm suffers alot in terms of performance. This may be becasue my implementation is not optimal. I use cudaMemset to set all the extra elements to zero but if the code just submit the command to GPU and returned immediately, the clock start to tick, the next kernel function is also submitted but the last cudaMemset is still running, then there is still some time before the actual scan algorithm starting to execute. The way that I set the last element of the array to zero after the up sweep kernel is also through cudaMemset. If there is some delay way doing this, it will also affect the performance of the efficient algorithm in general, with non-power-of-two-sized array or not. + +### Output + +#### Arraysize 256 + +``` +**************** +** SCAN TESTS ** +**************** + [ 0 24 44 11 9 38 36 25 14 28 41 25 49 ... 14 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 0.000487ms (std::chrono Measured) + [ 0 0 24 68 79 88 126 162 187 201 229 270 295 ... 6301 6315 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 0.000244ms (std::chrono Measured) + [ 0 0 24 68 79 88 126 162 187 201 229 270 295 ... 6179 6221 ] + passed +==== naive scan, power-of-two ==== + elapsed time: 0.018368ms (CUDA Measured) + passed +==== naive scan, non-power-of-two ==== + elapsed time: 0.018432ms (CUDA Measured) + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 0.053824ms (CUDA Measured) + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 0.047712ms (CUDA Measured) + passed +==== thrust scan, power-of-two ==== + elapsed time: 0.05184ms (CUDA Measured) + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 0.053024ms (CUDA Measured) + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 0 0 0 3 3 0 2 3 2 0 1 3 1 ... 0 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 0.000975ms (std::chrono Measured) + [ 3 3 2 3 2 1 3 1 2 2 3 1 3 ... 3 1 ] + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 0.000731ms (std::chrono Measured) + [ 3 3 2 3 2 1 3 1 2 2 3 1 3 ... 2 3 ] + passed +==== cpu compact with scan ==== + elapsed time: 0.000975ms (std::chrono Measured) + [ 3 3 2 3 2 1 3 1 2 2 3 1 3 ... 3 1 ] + passed +==== work-efficient compact, power-of-two ==== + elapsed time: 0.01984ms (CUDA Measured) + [ 3 3 2 3 2 1 3 1 2 2 3 1 3 ... 3 1 ] + passed +==== work-efficient compact, non-power-of-two ==== + elapsed time: 0.048096ms (CUDA Measured) + [ 3 3 2 3 2 1 3 1 2 2 3 1 3 ... 2 3 ] + passed +``` + +#### Arraysize 512 + +``` +**************** +** SCAN TESTS ** +**************** + [ 18 21 27 21 8 35 44 5 29 41 31 26 43 ... 2 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 0.001219ms (std::chrono Measured) + [ 0 18 39 66 87 95 130 174 179 208 249 280 306 ... 12340 12342 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 0.000732ms (std::chrono Measured) + [ 0 18 39 66 87 95 130 174 179 208 249 280 306 ... 12322 12334 ] + passed +==== naive scan, power-of-two ==== + elapsed time: 0.024256ms (CUDA Measured) + passed +==== naive scan, non-power-of-two ==== + elapsed time: 0.022368ms (CUDA Measured) + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 0.027712ms (CUDA Measured) + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 0.036288ms (CUDA Measured) + passed +==== thrust scan, power-of-two ==== + elapsed time: 0.130304ms (CUDA Measured) + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 0.127424ms (CUDA Measured) + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 2 3 3 1 0 3 0 3 3 3 3 2 1 ... 0 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 0.001463ms (std::chrono Measured) + [ 2 3 3 1 3 3 3 3 3 2 1 2 1 ... 1 2 ] + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 0.001707ms (std::chrono Measured) + [ 2 3 3 1 3 3 3 3 3 2 1 2 1 ... 1 1 ] + passed +==== cpu compact with scan ==== + elapsed time: 0.001951ms (std::chrono Measured) + [ 2 3 3 1 3 3 3 3 3 2 1 2 1 ... 1 2 ] + passed +==== work-efficient compact, power-of-two ==== + elapsed time: 0.021376ms (CUDA Measured) + [ 2 3 3 1 3 3 3 3 3 2 1 2 1 ... 1 2 ] + passed +==== work-efficient compact, non-power-of-two ==== + elapsed time: 0.08528ms (CUDA Measured) + [ 2 3 3 1 3 3 3 3 3 2 1 2 1 ... 1 1 ] + passed +``` + +#### Arraysize 1024 + +``` +**************** +** SCAN TESTS ** +**************** + [ 14 15 34 28 40 12 1 9 34 5 7 19 38 ... 20 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 0.001463ms (std::chrono Measured) + [ 0 14 29 63 91 131 143 144 153 187 192 199 218 ... 24828 24848 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 0.001462ms (std::chrono Measured) + [ 0 14 29 63 91 131 143 144 153 187 192 199 218 ... 24782 24798 ] + passed +==== naive scan, power-of-two ==== + elapsed time: 0.026752ms (CUDA Measured) + passed +==== naive scan, non-power-of-two ==== + elapsed time: 0.024864ms (CUDA Measured) + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 0.031584ms (CUDA Measured) + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 0.047456ms (CUDA Measured) + passed +==== thrust scan, power-of-two ==== + elapsed time: 0.143456ms (CUDA Measured) + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 0.118656ms (CUDA Measured) + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 2 3 2 0 2 2 3 3 2 3 1 1 2 ... 0 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 0.002195ms (std::chrono Measured) + [ 2 3 2 2 2 3 3 2 3 1 1 2 1 ... 1 1 ] + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 0.002438ms (std::chrono Measured) + [ 2 3 2 2 2 3 3 2 3 1 1 2 1 ... 2 1 ] + passed +==== cpu compact with scan ==== + elapsed time: 0.003901ms (std::chrono Measured) + [ 2 3 2 2 2 3 3 2 3 1 1 2 1 ... 1 1 ] + passed +==== work-efficient compact, power-of-two ==== + elapsed time: 0.021216ms (CUDA Measured) + [ 2 3 2 2 2 3 3 2 3 1 1 2 1 ... 1 1 ] + passed +==== work-efficient compact, non-power-of-two ==== + elapsed time: 0.058272ms (CUDA Measured) + [ 2 3 2 2 2 3 3 2 3 1 1 2 1 ... 2 1 ] + passed +``` + +#### Arraysize 2048 + +``` +**************** +** SCAN TESTS ** +**************** + [ 32 17 14 2 39 38 27 46 8 8 40 41 48 ... 48 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 0.002926ms (std::chrono Measured) + [ 0 32 49 63 65 104 142 169 215 223 231 271 312 ... 49750 49798 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 0.002682ms (std::chrono Measured) + [ 0 32 49 63 65 104 142 169 215 223 231 271 312 ... 49659 49671 ] + passed +==== naive scan, power-of-two ==== + elapsed time: 0.03088ms (CUDA Measured) + passed +==== naive scan, non-power-of-two ==== + elapsed time: 0.029824ms (CUDA Measured) + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 0.022848ms (CUDA Measured) + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 0.044128ms (CUDA Measured) + passed +==== thrust scan, power-of-two ==== + elapsed time: 0.105312ms (CUDA Measured) + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 0.10768ms (CUDA Measured) + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 2 1 0 2 1 0 1 2 0 0 2 1 0 ... 0 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 0.004632ms (std::chrono Measured) + [ 2 1 2 1 1 2 2 1 1 2 2 3 3 ... 3 2 ] + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 0.004876ms (std::chrono Measured) + [ 2 1 2 1 1 2 2 1 1 2 2 3 3 ... 2 3 ] + passed +==== cpu compact with scan ==== + elapsed time: 0.007071ms (std::chrono Measured) + [ 2 1 2 1 1 2 2 1 1 2 2 3 3 ... 3 2 ] + passed +==== work-efficient compact, power-of-two ==== + elapsed time: 0.022496ms (CUDA Measured) + [ 2 1 2 1 1 2 2 1 1 2 2 3 3 ... 3 2 ] + passed +==== work-efficient compact, non-power-of-two ==== + elapsed time: 0.044096ms (CUDA Measured) + [ 2 1 2 1 1 2 2 1 1 2 2 3 3 ... 2 3 ] + passed +``` + +#### Arraysize 4096 + +``` +**************** +** SCAN TESTS ** +**************** + [ 47 2 37 17 33 33 40 22 29 11 42 36 31 ... 17 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 0.005607ms (std::chrono Measured) + [ 0 47 49 86 103 136 169 209 231 260 271 313 349 ... 100624 100641 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 0.005364ms (std::chrono Measured) + [ 0 47 49 86 103 136 169 209 231 260 271 313 349 ... 100522 100558 ] + passed +==== naive scan, power-of-two ==== + elapsed time: 0.028512ms (CUDA Measured) + passed +==== naive scan, non-power-of-two ==== + elapsed time: 0.02624ms (CUDA Measured) + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 0.0424ms (CUDA Measured) + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 0.056768ms (CUDA Measured) + passed +==== thrust scan, power-of-two ==== + elapsed time: 0.123552ms (CUDA Measured) + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 0.127488ms (CUDA Measured) + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 1 2 3 1 3 3 0 0 3 3 2 0 3 ... 3 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 0.009753ms (std::chrono Measured) + [ 1 2 3 1 3 3 3 3 2 3 3 1 1 ... 2 3 ] + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 0.009508ms (std::chrono Measured) + [ 1 2 3 1 3 3 3 3 2 3 3 1 1 ... 1 2 ] + passed +==== cpu compact with scan ==== + elapsed time: 0.014873ms (std::chrono Measured) + [ 1 2 3 1 3 3 3 3 2 3 3 1 1 ... 2 3 ] + passed +==== work-efficient compact, power-of-two ==== + elapsed time: 0.049856ms (CUDA Measured) + [ 1 2 3 1 3 3 3 3 2 3 3 1 1 ... 2 3 ] + passed +==== work-efficient compact, non-power-of-two ==== + elapsed time: 0.09104ms (CUDA Measured) + [ 1 2 3 1 3 3 3 3 2 3 3 1 1 ... 1 2 ] + passed +``` + +#### Arraysize 8192 + +``` +**************** +** SCAN TESTS ** +**************** + [ 49 14 14 29 11 26 29 9 23 49 26 45 40 ... 15 0 ] +==== cpu scan, power-of-two ==== + elapsed time: 0.010972ms (std::chrono Measured) + [ 0 49 63 77 106 117 143 172 181 204 253 279 324 ... 200832 200847 ] +==== cpu scan, non-power-of-two ==== + elapsed time: 0.010971ms (std::chrono Measured) + [ 0 49 63 77 106 117 143 172 181 204 253 279 324 ... 200773 200788 ] + passed +==== naive scan, power-of-two ==== + elapsed time: 0.032864ms (CUDA Measured) + passed +==== naive scan, non-power-of-two ==== + elapsed time: 0.03248ms (CUDA Measured) + passed +==== work-efficient scan, power-of-two ==== + elapsed time: 0.051232ms (CUDA Measured) + passed +==== work-efficient scan, non-power-of-two ==== + elapsed time: 0.093952ms (CUDA Measured) + passed +==== thrust scan, power-of-two ==== + elapsed time: 0.117088ms (CUDA Measured) + passed +==== thrust scan, non-power-of-two ==== + elapsed time: 0.11424ms (CUDA Measured) + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 1 2 0 1 3 2 1 1 1 3 0 3 2 ... 1 0 ] +==== cpu compact without scan, power-of-two ==== + elapsed time: 0.016335ms (std::chrono Measured) + [ 1 2 1 3 2 1 1 1 3 3 2 1 3 ... 1 1 ] + passed +==== cpu compact without scan, non-power-of-two ==== + elapsed time: 0.017066ms (std::chrono Measured) + [ 1 2 1 3 2 1 1 1 3 3 2 1 3 ... 3 3 ] + passed +==== cpu compact with scan ==== + elapsed time: 0.026332ms (std::chrono Measured) + [ 1 2 1 3 2 1 1 1 3 3 2 1 3 ... 1 1 ] + passed +==== work-efficient compact, power-of-two ==== + elapsed time: 0.106496ms (CUDA Measured) + [ 1 2 1 3 2 1 1 1 3 3 2 1 3 ... 1 1 ] + passed +==== work-efficient compact, non-power-of-two ==== + elapsed time: 0.059904ms (CUDA Measured) + [ 1 2 1 3 2 1 1 1 3 3 2 1 3 ... 3 3 ] + passed +``` diff --git a/stream_compaction/common.h b/stream_compaction/common.h index d2c2d49..a4ff249 100644 --- a/stream_compaction/common.h +++ b/stream_compaction/common.h @@ -13,7 +13,7 @@ #define FILENAME (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) #define checkCUDAError(msg) checkCUDAErrorFn(msg, FILENAME, __LINE__) -#define blocksize 128 +#define blocksize 512 //#define SYNC_GRID diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 538137a..3c05105 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -12,44 +12,24 @@ namespace StreamCompaction { return timer; } - __global__ void kernUpSweep(int n, int count, int *data) + __global__ void kernUpSweep(int n, int POT, int POT_EX, int *data) { int index = blockIdx.x * blockDim.x + threadIdx.x; if (index >= n) return; + if (index % POT_EX != 0) return; - for (int i = 0; i < count; i++) - { - int POT = 1 << i; - int POT_EX = 1 << i + 1; - if (index % POT_EX == 0) - { - data[index + POT_EX - 1] += data[index + POT - 1]; - } - else - { - return; - } - __syncthreads(); - } + data[index + POT_EX - 1] += data[index + POT - 1]; } - - __global__ void kernDownSweep(int n, int count, int *data) + + __global__ void kernDownSweep(int n, int POT, int POT_EX, int *data) { int index = blockIdx.x * blockDim.x + threadIdx.x; if (index >= n) return; + if (index % POT_EX != 0) return; - for (int i = count - 1; i >= 0; i--) - { - int POT = 1 << i; - int POT_EX = 1 << i + 1; - if (index % POT_EX == 0) - { - int temp = data[index + POT - 1]; - data[index + POT - 1] = data[index + POT_EX - 1]; - data[index + POT_EX - 1] += temp; - } - __syncthreads(); - } + int temp = data[index + POT - 1]; + data[index + POT - 1] = data[index + POT_EX - 1]; + data[index + POT_EX - 1] += temp; } @@ -74,14 +54,25 @@ namespace StreamCompaction { //start ticking timer().startGpuTimer(); + for (int i = 0; i < count; i++) + { + kernUpSweep << > > (number, 1 << i, 1 << i + 1, dev_data); +#ifdef SYNC_GRID + cudaThreadSynchronize(); +#endif + } - //up sweep - kernUpSweep << > > (number, count, dev_data); //set data[number-1] to 0 cudaMemset((void*)(dev_data + (number - 1)), 0, sizeof(int)); checkCUDAErrorFn("set dev_data[number-1]"); - //down sweep - kernDownSweep << > > (number, count, dev_data); + + for (int i = count - 1; i >= 0; i--) + { + kernDownSweep << > > (number, 1 << i, 1 << i + 1, dev_data); +#ifdef SYNC_GRID + cudaThreadSynchronize(); +#endif + } //stop ticking timer().endGpuTimer(); @@ -141,15 +132,27 @@ namespace StreamCompaction { //start ticking timer().startGpuTimer(); - //up sweep - kernUpSweep << > > (number, count, dev_indices); + for (int i = 0; i < count; i++) + { + kernUpSweep << > > (number, 1 << i, 1 << i + 1, dev_indices); +#ifdef SYNC_GRID + cudaThreadSynchronize(); +#endif + } + //set data[number-1] to 0 cudaMemset((void*)(dev_indices + (number - 1)), 0, sizeof(int)); checkCUDAErrorFn("set dev_indices[number-1]"); - //down sweep - kernDownSweep << > > (number, count, dev_indices); + for (int i = count - 1; i >= 0; i--) + { + kernDownSweep << > > (number, 1 << i, 1 << i + 1, dev_indices); +#ifdef SYNC_GRID + cudaThreadSynchronize(); +#endif + } + Common::kernScatter << > > (n, dev_odata, dev_idata, dev_bools, dev_indices); //stop ticking From c1c5da02b03c3c3888eb4a3dfcb8ad36c45d5ccf Mon Sep 17 00:00:00 2001 From: ACskyline Date: Tue, 18 Sep 2018 21:19:15 -0400 Subject: [PATCH 4/9] readme2 --- README.md | 4 ++-- img/1.JPG | Bin 0 -> 94115 bytes img/2.JPG | Bin 0 -> 92855 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 img/1.JPG create mode 100644 img/2.JPG diff --git a/README.md b/README.md index 1e31898..5d06baa 100644 --- a/README.md +++ b/README.md @@ -11,11 +11,11 @@ CUDA Stream Compaction #### Power-of-two -![](images/1.JPG) +![](img/1.JPG) #### Non-power-of-two -![](images/2.JPG) +![](img/2.JPG) ### Q&A diff --git a/img/1.JPG b/img/1.JPG new file mode 100644 index 0000000000000000000000000000000000000000..c44168abb3108395d1603730bafda15eb62f02e0 GIT binary patch literal 94115 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 MXW*BtSAS0aH>Q1Mz5oCK literal 0 HcmV?d00001 From 9f888ad8d4efd8de08d5c448170029dc8ceb7969 Mon Sep 17 00:00:00 2001 From: ACskyline Date: Tue, 18 Sep 2018 21:24:02 -0400 Subject: [PATCH 5/9] readme3 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5d06baa..f6e95b0 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ CUDA Stream Compaction #### 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? -The first phenomenon is that all GPU algorithm is slower than CPU algorithm. This may be because of there is context changing between GPU and CPU for GPU algorithms whereas there is not for the CPU algorithm. +The first phenomenon is that all GPU algorithm is slower than CPU algorithm. This may be because of there is context changing between GPU and CPU for GPU algorithms whereas there is not for the CPU algorithm. The msvc compiler may also did some optimization to the C++ code. The second phenomenon is that efficient GPU algorithm is not faster than naive GPU algorithm. This may be because the naive GPU algorithm contains only one pass and the efficient GPU algorithm contains two pass, and during those two passes, the scheduling is not reliable, which means early termination somehow does not alleviate the idling of some GPU threads. Cache may be another reason why naive algorithm is faster. In naive algorithm, we are accessing the array sequentially, where in efficient algorithm, we are accessing the array with a changing step. Also, we are doing more global reading and writing in the efficienet algorithm. From 943727d689604d76ffe43ab7506909b083dbed8b Mon Sep 17 00:00:00 2001 From: ACskyline Date: Tue, 18 Sep 2018 21:32:01 -0400 Subject: [PATCH 6/9] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f6e95b0..176c153 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ CUDA Stream Compaction * [LinkedIn](https://www.linkedin.com/in/xiao-zhang-674bb8148/) * Tested on: Windows 10, i7-7700K @ 4.20GHz 16.0GB, GTX 1080 15.96GB (my own PC) -### Analysis +### Analysis (the pictures shown are the time in millisecond to execute the scan only) #### Power-of-two From c889df6816498d1907e26c751317d54484acd6ea Mon Sep 17 00:00:00 2001 From: ACskyline Date: Tue, 18 Sep 2018 21:33:55 -0400 Subject: [PATCH 7/9] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 176c153..5a553e1 100644 --- a/README.md +++ b/README.md @@ -21,13 +21,13 @@ CUDA Stream Compaction #### 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? -The first phenomenon is that all GPU algorithm is slower than CPU algorithm. This may be because of there is context changing between GPU and CPU for GPU algorithms whereas there is not for the CPU algorithm. The msvc compiler may also did some optimization to the C++ code. +* The first phenomenon is that all GPU algorithm is slower than CPU algorithm. This may be because of there is context changing between GPU and CPU for GPU algorithms whereas there is not for the CPU algorithm. The msvc compiler may also did some optimization to the C++ code. -The second phenomenon is that efficient GPU algorithm is not faster than naive GPU algorithm. This may be because the naive GPU algorithm contains only one pass and the efficient GPU algorithm contains two pass, and during those two passes, the scheduling is not reliable, which means early termination somehow does not alleviate the idling of some GPU threads. Cache may be another reason why naive algorithm is faster. In naive algorithm, we are accessing the array sequentially, where in efficient algorithm, we are accessing the array with a changing step. Also, we are doing more global reading and writing in the efficienet algorithm. +* The second phenomenon is that efficient GPU algorithm is not faster than naive GPU algorithm. This may be because the naive GPU algorithm contains only one pass and the efficient GPU algorithm contains two pass, and during those two passes, the scheduling is not reliable, which means early termination somehow does not alleviate the idling of some GPU threads. Cache may be another reason why naive algorithm is faster. In naive algorithm, we are accessing the array sequentially, where in efficient algorithm, we are accessing the array with a changing step. Also, we are doing more global reading and writing in the efficienet algorithm. -The third phenomenon is that thrust scan algorithm is slower than any other algorithm. One possible reason is that the blocksize and gridsize is not set properly and thrust just uses some default value, which is not optimal for my hardware condition. +* The third phenomenon is that thrust scan algorithm is slower than any other algorithm. One possible reason is that the blocksize and gridsize is not set properly and thrust just uses some default value, which is not optimal for my hardware condition. -The last phenomenon is that for arrays whose size is a non-power-of-two number, the efficient algorithm suffers alot in terms of performance. This may be becasue my implementation is not optimal. I use cudaMemset to set all the extra elements to zero but if the code just submit the command to GPU and returned immediately, the clock start to tick, the next kernel function is also submitted but the last cudaMemset is still running, then there is still some time before the actual scan algorithm starting to execute. The way that I set the last element of the array to zero after the up sweep kernel is also through cudaMemset. If there is some delay way doing this, it will also affect the performance of the efficient algorithm in general, with non-power-of-two-sized array or not. +* The last phenomenon is that for arrays whose size is a non-power-of-two number, the efficient algorithm suffers alot in terms of performance. This may be becasue my implementation is not optimal. I use cudaMemset to set all the extra elements to zero but if the code just submit the command to GPU and returned immediately, the clock start to tick, the next kernel function is also submitted but the last cudaMemset is still running, then there is still some time before the actual scan algorithm starting to execute. The way that I set the last element of the array to zero after the up sweep kernel is also through cudaMemset. If there is some delay way doing this, it will also affect the performance of the efficient algorithm in general, with non-power-of-two-sized array or not. ### Output From 2ca2a705b16cfd892f8613c7b86813ed045cab3a Mon Sep 17 00:00:00 2001 From: ACskyline Date: Wed, 19 Sep 2018 22:47:32 -0400 Subject: [PATCH 8/9] gtx 1080 has a problem with thurst? --- README.md | 2 ++ stream_compaction/thrust.cu | 68 ++++++++++++++++++++++++++++++------- 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index f6e95b0..b7abe09 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +# IT SEEMS MY GPU HAS SOME ISSUE WITH THRUST. BECAUSE I CHANGED CUDA9.2 TO CUDA8.0 BUT THE THRUST SCAN IS STILL SLOW. MY GPU IS GTX 1080. + CUDA Stream Compaction ====================== diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 781ebcc..0a31d9f 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -17,20 +17,64 @@ namespace StreamCompaction { /** * 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::device_vector dv_in(thrust::host_vector(idata, idata + n)); - thrust::device_vector dv_out(thrust::host_vector(odata, odata + n)); + 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()); - timer().startGpuTimer(); - thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); - timer().endGpuTimer(); + ////////////////////////////////////////////////////////////// - cudaMemcpy(odata, dv_out.data().get(), sizeof(int) * n, cudaMemcpyDeviceToHost); - checkCUDAErrorFn("memcpy back failed!"); + // NOT WORKING, TOO SLOW - } + //thrust::device_vector dv_in(thrust::host_vector(idata, idata + n)); + //thrust::device_vector dv_out(thrust::host_vector(odata, odata + n)); + + //timer().startGpuTimer(); + //thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); + //timer().endGpuTimer(); + + //cudaMemcpy(odata, dv_out.data().get(), sizeof(int) * n, cudaMemcpyDeviceToHost); + //checkCUDAErrorFn("memcpy back failed!"); + + ////////////////////////////////////////////////////////////// + + // NOT WORKING, TOO SLOW + + //int *dev_in, *dev_out; + + //cudaMalloc((void**)&dev_in, n * sizeof(int)); + //checkCUDAError("cudaMalloc dev_in failed!"); + + //cudaMalloc((void**)&dev_out, n * sizeof(int)); + //checkCUDAError("cudaMalloc dev_out failed!"); + + //cudaMemcpy(dev_in, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + + //thrust::device_ptr dv_in_ptr(dev_in); + //thrust::device_ptr dv_out_ptr(dev_out); + + //thrust::device_vector dv_in(dev_in, dev_in + n); + //thrust::device_vector dv_out(dev_out, dev_out + n); + + //timer().startGpuTimer(); + //thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); + //timer().endGpuTimer(); + + //cudaMemcpy(odata, dv_out.data().get(), sizeof(int) * n, cudaMemcpyDeviceToHost); + + //cudaFree(dev_in); + //cudaFree(dev_out); + + ////////////////////////////////////////////////////////////////////////// + + // NOT WORKING, TOO SLOW, MUST BE GPU ISSUE + + thrust::device_vector d_data_in(idata, idata + n); + thrust::device_vector d_data_out(odata, odata + n); + timer().startGpuTimer(); + thrust::exclusive_scan(d_data_in.begin(), d_data_in.end(), d_data_out.begin()); + timer().endGpuTimer(); + thrust::copy(d_data_out.begin(), d_data_out.end(), odata); + } } } From eed8724f4e5364fe0c32c828fa33d69490a06911 Mon Sep 17 00:00:00 2001 From: ACskyline Date: Wed, 19 Sep 2018 23:00:28 -0400 Subject: [PATCH 9/9] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c4db37a..50192a2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# IT SEEMS MY GPU HAS SOME ISSUE WITH THRUST. BECAUSE I CHANGED CUDA9.2 TO CUDA8.0 BUT THE THRUST SCAN IS STILL SLOW. MY GPU IS GTX 1080. +# IT SEEMS MY GPU HAS SOME ISSUE WITH THRUST. BECAUSE I CHANGED CUDA9.2 TO CUDA8.0 BUT THE THRUST SCAN IS STILL SLOW. MY GPU IS GTX 1080. DRIVER VERSION IS 411.63(NEWEST). CUDA Stream Compaction ======================