From 83694aea671b4bade80ef939bddf4d0f0f906f69 Mon Sep 17 00:00:00 2001 From: ibm5100 <910570820@qq.com> Date: Tue, 19 Sep 2023 22:45:30 +0800 Subject: [PATCH 01/13] update --- stream_compaction/common.cu | 24 ++++++ stream_compaction/cpu.cu | 55 ++++++++++++- stream_compaction/efficient.cu | 144 ++++++++++++++++++++++++++++++++- stream_compaction/naive.cu | 83 +++++++++++++++++++ stream_compaction/thrust.cu | 21 +++++ 5 files changed, 320 insertions(+), 7 deletions(-) diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 2ed6d63..410061c 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -24,6 +24,20 @@ namespace StreamCompaction { */ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { // TODO + int idx = (blockIdx.x * blockDim.x) + threadIdx.x; + if (idx >= n) { + return; + } + if (idata[idx] > 0) { + bools[idx] = 1; + } + else{ + bools[idx] = 0; + } + + + + } /** @@ -33,6 +47,16 @@ namespace StreamCompaction { __global__ void kernScatter(int n, int *odata, const int *idata, const int *bools, const int *indices) { // TODO + int idx = (blockIdx.x * blockDim.x) + threadIdx.x; + if (idx >= n) { + return; + } + if (bools[idx] > 0) { + odata[indices[idx]] = idata[idx]; + } + + + } } diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 719fa11..9082bd6 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -18,9 +18,17 @@ namespace StreamCompaction { * (Optional) For better understanding before starting moving to GPU, you can simulate your GPU scan in this function first. */ void scan(int n, int *odata, const int *idata) { - timer().startCpuTimer(); + // TODO - timer().endCpuTimer(); + odata[0] = 0; + for (int i = 1; i < n; i++) { + odata[i] = odata[i - 1] + idata[i - 1]; + + } + + + + } /** @@ -31,8 +39,17 @@ namespace StreamCompaction { int compactWithoutScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); // TODO + int output = 0; + for (int i = 0; i < n; i++) { + if (idata[i] != 0) { + odata[output] = idata[i]; + output += 1; + } + } + + timer().endCpuTimer(); - return -1; + return output; } /** @@ -41,10 +58,40 @@ namespace StreamCompaction { * @returns the number of elements remaining after compaction. */ int compactWithScan(int n, int *odata, const int *idata) { + timer().startCpuTimer(); // TODO + + int* checked = new int[n]; + int* preCheck = new int[n]; + int counter = 0; + + for (int i = 0; i < n; i++) { + if (idata[i] != 0) { + preCheck[i] = 1; + counter += 1; + } + else { + preCheck[i] = 0; + } + } + + scan(n, checked, preCheck); + + for (int i = 0; i < n; i++) { + if (preCheck[i]==1) { + odata[checked[i]] = idata[i]; + } + + } + + delete[] checked; + delete[] preCheck; + timer().endCpuTimer(); - return -1; + return counter; + + } } } diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 2db346e..276038d 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -3,6 +3,7 @@ #include "common.h" #include "efficient.h" +#define blockSize 128 namespace StreamCompaction { namespace Efficient { using StreamCompaction::Common::PerformanceTimer; @@ -11,6 +12,57 @@ namespace StreamCompaction { static PerformanceTimer timer; return timer; } + __global__ void upSweep(int n, int base, int* idata) { + int idx = (blockIdx.x * blockDim.x) + threadIdx.x; + if (idx >= n) { + return; + } + int k = idx * (1 << base + 1); + if (k >= n) { + return; + } + + idata[k + (1 << base + 1) - 1] += idata[k + (1 << base) - 1]; + } + // referemce to book page algorithm 4 + __global__ void downSweep(int n, int base, int* idata) { + int idx = (blockIdx.x * blockDim.x) + threadIdx.x; + if (idx >= n) { + return; + } + int k = idx * (1 << base + 1); + if (k >= n) { + return; + } + + int t = idata[k + (1 << base) - 1]; + idata[k + (1 << base) - 1] = idata[k + (1 << base + 1) - 1]; + idata[k + (1 << base + 1) - 1] += t; + + } + + void processScan(int n, int ending, int* gpu_idata) { + + + for (int i = 0; i < ilog2ceil(n); i++) { + + //scanOperation <<>> (n, i, gpu_odata, gpu_idata); + + dim3 fullBlocksPerGrid((ending / (1 << (i + 1)) + blockSize - 1) / blockSize); + upSweep <<>> (n, i, gpu_idata); + } + cudaMemset(&gpu_idata[ending - 1], 0, sizeof(int)); + checkCUDAError("error in loop 0"); + + for (int i = ilog2ceil(n) -1; i>=0; i--) { + + dim3 fullBlocksPerGrid((ending / (1 << (i + 1)) + blockSize - 1) / blockSize); + downSweep <<>> (n, i, gpu_idata); + + + } + checkCUDAError("error in loop 0111"); + } /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. @@ -18,6 +70,37 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata) { timer().startGpuTimer(); // TODO + int* gpu_odataa; + int* gpu_idataa; + int ending = 1 << ilog2ceil(n); + + cudaMalloc((void**)&gpu_odataa, ending * sizeof(int)); + cudaMalloc((void**)&gpu_idataa, ending * sizeof(int)); + checkCUDAError("memory error 0101!!!!!"); + cudaMemset(gpu_odataa, 0, ending * sizeof(int)); + checkCUDAError("memory error 0102!!!!!"); + cudaMemset(gpu_idataa, 0, ending * sizeof(int)); + checkCUDAError("memory error 0103!!!!!"); + cudaMemcpy(gpu_idataa, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + + checkCUDAError("memory error 01!!!!!"); + + processScan(n, ending, gpu_idataa); + + + + checkCUDAError("error in loop final process!!!!!"); + int* temp = gpu_odataa; + gpu_odataa = gpu_idataa; + gpu_idataa = temp; + + cudaMemcpy(odata, gpu_odataa, sizeof(int) * n, cudaMemcpyDeviceToHost); + + checkCUDAError("memory error 02!!!!!"); + + cudaFree(gpu_odataa); + cudaFree(gpu_idataa); + timer().endGpuTimer(); } @@ -31,10 +114,65 @@ namespace StreamCompaction { * @returns The number of elements remaining after compaction. */ int compact(int n, int *odata, const int *idata) { - timer().startGpuTimer(); + //timer().startGpuTimer(); + + + + dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); + //dim3 numBlocks((n - 1 + blockSize - 1) / blockSize); + + int* gpu_odata; + int* gpu_idata; + + int ending = 1 << ilog2ceil(n); + int* gpu_bool; + int* gup_sum; + + + cudaMalloc((void**)&gpu_odata, n * sizeof(int)); + cudaMalloc((void**)&gpu_idata, n * sizeof(int)); + cudaMalloc((void**)&gpu_bool, n * sizeof(int)); + cudaMalloc((void**)&gup_sum, n * sizeof(int)); + + cudaMemcpy(gpu_idata, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + + checkCUDAError("memory error 01!!!!!"); + + Common::kernMapToBoolean << > > (n, gpu_bool, gpu_idata); + + scan(n, gup_sum, gpu_bool); + + checkCUDAError("memory error 02!!!!!"); + + Common::kernScatter << > > (n, gpu_odata, gpu_idata, gpu_bool, gup_sum); + + + + // TODO - timer().endGpuTimer(); - return -1; + //timer().endGpuTimer(); + + int counter = -1; + + + cudaMemcpy(odata, gpu_odata, sizeof(int) * n, cudaMemcpyDeviceToHost); + + cudaMemcpy(&counter, &gup_sum[n-1], sizeof(int), cudaMemcpyDeviceToHost); + if (idata[n - 1] != 0) { + counter += 1; + } + + + checkCUDAError("memory error 023!!!!!"); + cudaFree(gpu_odata); + cudaFree(gpu_idata); + + cudaFree(gpu_bool); + cudaFree(gup_sum); + + + + return counter; } } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 4308876..67c50ea 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -3,6 +3,9 @@ #include "common.h" #include "naive.h" + + +#define blockSize 128 namespace StreamCompaction { namespace Naive { using StreamCompaction::Common::PerformanceTimer; @@ -12,6 +15,53 @@ namespace StreamCompaction { return timer; } // TODO: __global__ + __global__ void scanOperation(int n, int base, int* odata, int* idata) { + int idx = (blockIdx.x * blockDim.x) + threadIdx.x; + + if(idx >= n){ + return; + + } + + int curr_pos = 1 << (base-1); + + if (idx < curr_pos) { + + odata[idx] = idata[idx]; + } + else { + odata[idx] = idata[idx - curr_pos] + idata[idx]; + + } + + + + + } + + __global__ void convertToExclusive(int n, int* odata, int* idata) { + int idx = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (idx >= n) { + return; + + } + if (idx == 0) { + + odata[idx] = 0; + return; + } + + odata[idx] = idata[idx - 1]; + + + + } + + + + + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. @@ -19,6 +69,39 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata) { timer().startGpuTimer(); // TODO + int* gpu_odata; + int* gpu_idata; + + cudaMalloc((void**)&gpu_odata, n * sizeof(int)); + cudaMalloc((void**)&gpu_idata, n * sizeof(int)); + cudaMemcpy(gpu_idata, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + + checkCUDAError("memory error!!!!!"); + + dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); + dim3 numBlocks((n -1 + blockSize - 1) / blockSize); + for (int i = 1; i <= ilog2ceil(n); i++) { + scanOperation <<>> (n, i, gpu_odata, gpu_idata); + + checkCUDAError("error in loop!!!!!"); + int* temp = gpu_odata; + gpu_odata = gpu_idata; + gpu_idata = temp; + + + } + + + convertToExclusive << > > (n, gpu_odata, gpu_idata); + + cudaMemcpy(odata, gpu_odata, sizeof(int) * n, cudaMemcpyDeviceToHost); + + checkCUDAError("memory error!!!!!"); + + cudaFree(gpu_odata); + cudaFree(gpu_idata); + + timer().endGpuTimer(); } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 1def45e..895ecb6 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -22,6 +22,27 @@ 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()); + + int* gpu_odata; + int* gpu_idata; + + cudaMalloc((void**)&gpu_odata, n * sizeof(int)); + cudaMalloc((void**)&gpu_idata, n * sizeof(int)); + cudaMemcpy(gpu_idata, idata, sizeof(int) * n, cudaMemcpyHostToDevice); + + thrust::device_ptrthrust_dv_in(gpu_idata); + thrust::device_ptrthrust_dv_out(gpu_odata); + + thrust::exclusive_scan(thrust_dv_in, thrust_dv_in+n, thrust_dv_out); + + + + + cudaMemcpy(odata, gpu_odata, sizeof(int) * n, cudaMemcpyDeviceToHost); + cudaFree(gpu_odata); + cudaFree(gpu_idata); + + timer().endGpuTimer(); } } From 1c9aaf7dd23262aec329d88381f92af1a207da50 Mon Sep 17 00:00:00 2001 From: ibm5100 <112833135+Ibm510000@users.noreply.github.com> Date: Tue, 19 Sep 2023 23:19:32 +0800 Subject: [PATCH 02/13] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0e38ddb..21208cb 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,9 @@ 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) +Han Wang + +Tested on: Windows 11, 11th Gen Intel(R) Core(TM) i9-11900H @ 2.50GHz 22GB, GTX 3070 Laptop GPU ### (TODO: Your README) From 44c7dc20a8a14d7294fef9e01474ca6e5577b648 Mon Sep 17 00:00:00 2001 From: ibm5100 <112833135+Ibm510000@users.noreply.github.com> Date: Tue, 19 Sep 2023 23:28:51 +0800 Subject: [PATCH 03/13] Update README.md --- README.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 21208cb..a96b03c 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,21 @@ Han Wang Tested on: Windows 11, 11th Gen Intel(R) Core(TM) i9-11900H @ 2.50GHz 22GB, GTX 3070 Laptop GPU -### (TODO: Your README) +### Analysis +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). + +We wrapped up both CPU and GPU timing functions as a performance timer class for you to conveniently measure the time cost. +We use std::chrono to provide CPU high-precision timing and CUDA event to measure the CUDA performance. +For CPU, put your CPU code between timer().startCpuTimer() and timer().endCpuTimer(). +For GPU, put your CUDA code between timer().startGpuTimer() and timer().endGpuTimer(). Be sure not to include any initial/final memory operations (cudaMalloc, cudaMemcpy) in your performance measurements, for comparability. +Don't mix up CpuTimer and GpuTimer. +To guess at what might be happening inside the Thrust implementation (e.g. allocation, memory copy), take a look at the Nsight timeline for its execution. Your analysis here doesn't have to be detailed, since you aren't even looking at the code for the implementation. +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. -Include analysis, etc. (Remember, this is public, so don't put -anything here that you don't want to share with the world.) From d23de3398a7bc64cb297bb2ba5b6d1bb2b0f8ad7 Mon Sep 17 00:00:00 2001 From: ibm5100 <910570820@qq.com> Date: Wed, 20 Sep 2023 09:58:37 +0800 Subject: [PATCH 04/13] update --- img/graph1.png | Bin 0 -> 31290 bytes img/output.png | Bin 0 -> 104510 bytes stream_compaction/cpu.cu | 7 +++++-- stream_compaction/efficient.cu | 8 +++++--- stream_compaction/naive.cu | 10 +++++++--- stream_compaction/thrust.cu | 7 ++++--- 6 files changed, 21 insertions(+), 11 deletions(-) create mode 100644 img/graph1.png create mode 100644 img/output.png diff --git a/img/graph1.png b/img/graph1.png new file mode 100644 index 0000000000000000000000000000000000000000..04c758b97a02c5223572847bb173a95f7aac7c7e GIT binary patch literal 31290 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

*T#m;$(z(e+v+0il+yB zP6T7g4xhIj1@@uUxh1)@(;w7WpIuQp?l;NLcF23Tm)Hl%*2}Ed&67TpXBlY*z?q=y z;w$UEFV@LLlmGpVxhjCk3WZlrsz?lm=GHl4ZduLiZd4YfM_$@`1Bl3``H7u3wr+1O zY+9OnKk0WM_s~NzNu@jrK%Q}ROXz~pUB`Dr5Q$-)mlr>Hnz1c>H0+f*mph0LtGk+> zZ~EGv=$lCp5|6$d?CjLGmTgRtPj}K9cBmQJxtoWs^Y6QaHSXzlG#xk;Fk_r zGzAf)pPW1I>+mYS&x>EjVIG|C_gAXRf4fcIQ}51^+?|nX)IfQe0jEW^7_|I8NRB~p zek^~Is&8cs>!W+c6p+3r4Jui;=Bwj~ zz%Ga0ERuWK4^vv<3RbMYd7ZQAA|RjiF}w}rZff24VU{F-9f%32dp6DqGuC5GDep9r z{f8{T!U0+WQw_(_4dnnkJV*%hz=a01P@%a#H+bllQ6LpCZS7P_C{s4#R94OqJfV}j0Xrw%spZ+WDu#Vt>h)#ILRGgn5v zNxSoX5;3wpKvt(ZIX`xoQU>(~yA1K(ahb)Tvcq-?&YEES&5|YS9%bnr#(qG48{)B^ zw4mUc`dMh-lfEvaV?JYsEjF)xBg4jVMZ{KEWu8&raZ~e`;3RVUoiBvVIcKs=+FsV$ zYn8SnQ8M7nl74^%uehI#BIOMl z3Z`F7CQJ<-Z90md{p>Dmk<4Ft*O!oNCZL7?TtwcE~5E zS%768g%lZ1Cl}W!D*IVd9(zYd;&(|#i6Lr6D9x_l=8!xPgx^v3hkw4j1f88_)hA4 zlr}dO1fUQ7#pw~ma(wg7qlS?)sYDL}2=_}jj0hV}1F0=IWv;~96O(5WRi6s%Yf6(l z2Ic?t?S4$t>PS{4Yr;RS^N)Q>SuGN5-CIYnHP|ng5+wXZS(gNEO@}PTG&9>otlYN> zhq995XPQxqyn%>SUWuOOWm;3;qO#}>0U_g?R=Yq}UgbFUr@{j2X}C1yj}s>U zTl2fWJ3jso0t$fB0{`) z%i0UMWBX$jq1^8R*XOe~EMoi|JT?K)@r1F+@U}% zn&0w^d_Y|+414indnIh^1jtg8$b$*ucAa}?S+ zv~R`I$`d4?tQAw(57vt37ndT)b;!odz#+roZpZ3wUIl?BxH@n!QE~yc)8Hs;@y+Q7 zyTzH$bq3yL>m@Zv^_3Dk;pGO0YBS;GI}w!LDKZCAN(HwB}p!pwJT>`&`{1_8m;S@zA@wH&sv$3 JoVj}cUjXCG%SZqK literal 0 HcmV?d00001 diff --git a/img/output.png b/img/output.png new file mode 100644 index 0000000000000000000000000000000000000000..d60c87b907bd2f0cca34d1eba95db3ed21742ced GIT binary patch literal 104510 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 JDyLId{|PG?R*?Vz literal 0 HcmV?d00001 diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 9082bd6..13cce18 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -59,13 +59,15 @@ namespace StreamCompaction { */ int compactWithScan(int n, int *odata, const int *idata) { - timer().startCpuTimer(); + // TODO int* checked = new int[n]; int* preCheck = new int[n]; int counter = 0; + timer().startCpuTimer(); + for (int i = 0; i < n; i++) { if (idata[i] != 0) { preCheck[i] = 1; @@ -84,11 +86,12 @@ namespace StreamCompaction { } } + timer().endCpuTimer(); delete[] checked; delete[] preCheck; - timer().endCpuTimer(); + return counter; diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 276038d..0ef3f60 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -68,7 +68,7 @@ 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 int* gpu_odataa; int* gpu_idataa; @@ -85,8 +85,10 @@ namespace StreamCompaction { checkCUDAError("memory error 01!!!!!"); - processScan(n, ending, gpu_idataa); + timer().startGpuTimer(); + processScan(n, ending, gpu_idataa); + timer().endGpuTimer(); checkCUDAError("error in loop final process!!!!!"); @@ -101,7 +103,7 @@ namespace StreamCompaction { cudaFree(gpu_odataa); cudaFree(gpu_idataa); - timer().endGpuTimer(); + } /** diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 67c50ea..6c0b86e 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -5,7 +5,7 @@ -#define blockSize 128 +#define blockSize 8 namespace StreamCompaction { namespace Naive { using StreamCompaction::Common::PerformanceTimer; @@ -67,7 +67,7 @@ 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 int* gpu_odata; int* gpu_idata; @@ -80,6 +80,8 @@ namespace StreamCompaction { dim3 fullBlocksPerGrid((n + blockSize - 1) / blockSize); dim3 numBlocks((n -1 + blockSize - 1) / blockSize); + + timer().startGpuTimer(); for (int i = 1; i <= ilog2ceil(n); i++) { scanOperation <<>> (n, i, gpu_odata, gpu_idata); @@ -94,6 +96,8 @@ namespace StreamCompaction { convertToExclusive << > > (n, gpu_odata, gpu_idata); + timer().endGpuTimer(); + cudaMemcpy(odata, gpu_odata, sizeof(int) * n, cudaMemcpyDeviceToHost); checkCUDAError("memory error!!!!!"); @@ -102,7 +106,7 @@ namespace StreamCompaction { cudaFree(gpu_idata); - timer().endGpuTimer(); + } } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 895ecb6..9204f59 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -18,7 +18,7 @@ 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()); @@ -33,9 +33,10 @@ namespace StreamCompaction { thrust::device_ptrthrust_dv_in(gpu_idata); thrust::device_ptrthrust_dv_out(gpu_odata); + timer().startGpuTimer(); thrust::exclusive_scan(thrust_dv_in, thrust_dv_in+n, thrust_dv_out); - + timer().endGpuTimer(); cudaMemcpy(odata, gpu_odata, sizeof(int) * n, cudaMemcpyDeviceToHost); @@ -43,7 +44,7 @@ namespace StreamCompaction { cudaFree(gpu_idata); - timer().endGpuTimer(); + } } } From da87299216c0e894d4f92f730d61add065f3def8 Mon Sep 17 00:00:00 2001 From: ibm5100 <112833135+Ibm510000@users.noreply.github.com> Date: Wed, 20 Sep 2023 10:07:21 +0800 Subject: [PATCH 05/13] Update README.md --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a96b03c..8a20351 100644 --- a/README.md +++ b/README.md @@ -13,15 +13,24 @@ Roughly optimize the block sizes of each of your implementations for minimal run (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). +![Unlock FPS](images/output.png) + We wrapped up both CPU and GPU timing functions as a performance timer class for you to conveniently measure the time cost. We use std::chrono to provide CPU high-precision timing and CUDA event to measure the CUDA performance. For CPU, put your CPU code between timer().startCpuTimer() and timer().endCpuTimer(). For GPU, put your CUDA code between timer().startGpuTimer() and timer().endGpuTimer(). Be sure not to include any initial/final memory operations (cudaMalloc, cudaMemcpy) in your performance measurements, for comparability. + + + + Don't mix up CpuTimer and GpuTimer. To guess at what might be happening inside the Thrust implementation (e.g. allocation, memory copy), take a look at the Nsight timeline for its execution. Your analysis here doesn't have to be detailed, since you aren't even looking at the code for the implementation. 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. - +![Unlock FPS](images/output.png) From 070d0502e558f8a3a6f8557b1adcb4912b0436ea Mon Sep 17 00:00:00 2001 From: ibm5100 <112833135+Ibm510000@users.noreply.github.com> Date: Wed, 20 Sep 2023 10:08:31 +0800 Subject: [PATCH 06/13] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8a20351..047e450 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Roughly optimize the block sizes of each of your implementations for minimal run (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). -![Unlock FPS](images/output.png) +![Unlock FPS](img/output.png) We wrapped up both CPU and GPU timing functions as a performance timer class for you to conveniently measure the time cost. We use std::chrono to provide CPU high-precision timing and CUDA event to measure the CUDA performance. @@ -33,4 +33,4 @@ 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. -![Unlock FPS](images/output.png) +![Unlock FPS](img/output.png) From 89728259f447f8d1f97a1088d147814de00c979c Mon Sep 17 00:00:00 2001 From: ibm5100 <112833135+Ibm510000@users.noreply.github.com> Date: Wed, 20 Sep 2023 10:14:54 +0800 Subject: [PATCH 07/13] Update README.md --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 047e450..6555d69 100644 --- a/README.md +++ b/README.md @@ -13,14 +13,19 @@ Roughly optimize the block sizes of each of your implementations for minimal run (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). -![Unlock FPS](img/output.png) +![Unlock FPS](img/graph1.png) We wrapped up both CPU and GPU timing functions as a performance timer class for you to conveniently measure the time cost. We use std::chrono to provide CPU high-precision timing and CUDA event to measure the CUDA performance. For CPU, put your CPU code between timer().startCpuTimer() and timer().endCpuTimer(). For GPU, put your CUDA code between timer().startGpuTimer() and timer().endGpuTimer(). Be sure not to include any initial/final memory operations (cudaMalloc, cudaMemcpy) in your performance measurements, for comparability. +Based on my observation in my text, there are three phenomenons: +1. The block size seems to not influence the output that much. +2. The naive gpu approach is slower than the efficient approach. +3. Though I didn't plot out the output of the CPU scan, the CPU operation seems to be actually faster than the GPU operation. + Don't mix up CpuTimer and GpuTimer. From e63feb4b14a382a0ea307bfb060464484fe7f185 Mon Sep 17 00:00:00 2001 From: ibm5100 <112833135+Ibm510000@users.noreply.github.com> Date: Wed, 20 Sep 2023 10:15:17 +0800 Subject: [PATCH 08/13] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 6555d69..9e22efd 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,12 @@ Compare all of these GPU Scan implementations (Naive, Work-Efficient, and Thrust ![Unlock FPS](img/graph1.png) We wrapped up both CPU and GPU timing functions as a performance timer class for you to conveniently measure the time cost. + + We use std::chrono to provide CPU high-precision timing and CUDA event to measure the CUDA performance. + For CPU, put your CPU code between timer().startCpuTimer() and timer().endCpuTimer(). + For GPU, put your CUDA code between timer().startGpuTimer() and timer().endGpuTimer(). Be sure not to include any initial/final memory operations (cudaMalloc, cudaMemcpy) in your performance measurements, for comparability. Based on my observation in my text, there are three phenomenons: From 1aae8498c5693cabfc789a1ecbc23269f9f88fea Mon Sep 17 00:00:00 2001 From: ibm5100 <112833135+Ibm510000@users.noreply.github.com> Date: Wed, 20 Sep 2023 10:16:58 +0800 Subject: [PATCH 09/13] Update README.md --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 9e22efd..92b106e 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Han Wang Tested on: Windows 11, 11th Gen Intel(R) Core(TM) i9-11900H @ 2.50GHz 22GB, GTX 3070 Laptop GPU ### Analysis -Roughly optimize the block sizes of each of your implementations for minimal run time on your GPU. +**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). @@ -22,7 +22,7 @@ We use std::chrono to provide CPU high-precision timing and CUDA event to measur For CPU, put your CPU code between timer().startCpuTimer() and timer().endCpuTimer(). -For GPU, put your CUDA code between timer().startGpuTimer() and timer().endGpuTimer(). Be sure not to include any initial/final memory operations (cudaMalloc, cudaMemcpy) in your performance measurements, for comparability. +For GPU, put your CUDA code between timer().startGpuTimer() and timer().endGpuTimer(). Be sure not to include any initial/final memory operations (cudaMalloc, cudaMemcpy) in your performance measurements, for comparability.** Based on my observation in my text, there are three phenomenons: 1. The block size seems to not influence the output that much. @@ -31,15 +31,15 @@ Based on my observation in my text, there are three phenomenons: - +** Don't mix up CpuTimer and GpuTimer. To guess at what might be happening inside the Thrust implementation (e.g. allocation, memory copy), take a look at the Nsight timeline for its execution. Your analysis here doesn't have to be detailed, since you aren't even looking at the code for the implementation. -Write a brief explanation of the phenomena you see here. - +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. +Paste the output of the test program into a triple-backtick block in your README.** ![Unlock FPS](img/output.png) From b169e2c0146a0a821ac316f62bb555173f98f036 Mon Sep 17 00:00:00 2001 From: ibm5100 <112833135+Ibm510000@users.noreply.github.com> Date: Wed, 20 Sep 2023 10:24:25 +0800 Subject: [PATCH 10/13] Update README.md --- README.md | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 92b106e..35f414e 100644 --- a/README.md +++ b/README.md @@ -8,31 +8,22 @@ Han Wang Tested on: Windows 11, 11th Gen Intel(R) Core(TM) i9-11900H @ 2.50GHz 22GB, GTX 3070 Laptop GPU ### Analysis -**Roughly optimize the block sizes of each of your implementations for minimal run time on your GPU. +**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 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).** ![Unlock FPS](img/graph1.png) -We wrapped up both CPU and GPU timing functions as a performance timer class for you to conveniently measure the time cost. - - -We use std::chrono to provide CPU high-precision timing and CUDA event to measure the CUDA performance. - -For CPU, put your CPU code between timer().startCpuTimer() and timer().endCpuTimer(). - -For GPU, put your CUDA code between timer().startGpuTimer() and timer().endGpuTimer(). Be sure not to include any initial/final memory operations (cudaMalloc, cudaMemcpy) in your performance measurements, for comparability.** - Based on my observation in my text, there are three phenomenons: 1. The block size seems to not influence the output that much. 2. The naive gpu approach is slower than the efficient approach. 3. Though I didn't plot out the output of the CPU scan, the CPU operation seems to be actually faster than the GPU operation. - +The first -** -Don't mix up CpuTimer and GpuTimer. + +**Don't mix up CpuTimer and GpuTimer. To guess at what might be happening inside the Thrust implementation (e.g. allocation, memory copy), take a look at the Nsight timeline for its execution. Your analysis here doesn't have to be detailed, since you aren't even looking at the code for the implementation. Write a brief explanation of the phenomena you see here.** From 5375979a573891442ee5670b426dfeb6984f303d Mon Sep 17 00:00:00 2001 From: ibm5100 <112833135+Ibm510000@users.noreply.github.com> Date: Wed, 20 Sep 2023 10:58:07 +0800 Subject: [PATCH 11/13] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 35f414e..d7ea164 100644 --- a/README.md +++ b/README.md @@ -20,17 +20,20 @@ Based on my observation in my text, there are three phenomenons: 2. The naive gpu approach is slower than the efficient approach. 3. Though I didn't plot out the output of the CPU scan, the CPU operation seems to be actually faster than the GPU operation. -The first +The first phenomenon seems not really reasonable. I expect that with more block size, we can improve the run time speed in the parallel operation. But I think I need to keep the truth I just post the real output. The second phenomenon seems reasonable. The book explained the high-speed algorithm. The third phenomenon might be because the GPU approach might spend more time accessing the shared memory compared to the CPU's fast access. For the current data size, the benefit of the parallel operation cannot cover the loss of that. **Don't mix up CpuTimer and GpuTimer. To guess at what might be happening inside the Thrust implementation (e.g. allocation, memory copy), take a look at the Nsight timeline for its execution. Your analysis here doesn't have to be detailed, since you aren't even looking at the code for the implementation. Write a brief explanation of the phenomena you see here.** +The observation is that the thrust implementation is slower than the GPU and CPU approach. Based on my knowledge, I think it is more possible that the thrust implementation might spend large amounts of time on memory I/O operation. I trust that the algorithm of the thrust might be fast and reliable. ** 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.** +Because our time check excludes the init and end memory operation, based on my observation and my hypothesis, I think that the memory I/O computation might be there but didn't actually influence me. At least I didn't observe the performance bottlenecks. + ![Unlock FPS](img/output.png) From 5ea0ef08d87796e9e32fb5f6bb1f007ecc822db3 Mon Sep 17 00:00:00 2001 From: ibm5100 <112833135+Ibm510000@users.noreply.github.com> Date: Wed, 20 Sep 2023 10:58:27 +0800 Subject: [PATCH 12/13] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d7ea164..b519861 100644 --- a/README.md +++ b/README.md @@ -30,8 +30,8 @@ Write a brief explanation of the phenomena you see here.** The observation is that the thrust implementation is slower than the GPU and CPU approach. Based on my knowledge, I think it is more possible that the thrust implementation might spend large amounts of time on memory I/O operation. I trust that the algorithm of the thrust might be fast and reliable. -** -Can you find the performance bottlenecks? Is it memory I/O? Computation? Is it different for each implementation? + +**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.** Because our time check excludes the init and end memory operation, based on my observation and my hypothesis, I think that the memory I/O computation might be there but didn't actually influence me. At least I didn't observe the performance bottlenecks. From 5a26a37e266fffae1d639fe5bbd438d0d95aa9d3 Mon Sep 17 00:00:00 2001 From: ibm5100 <910570820@qq.com> Date: Wed, 20 Sep 2023 10:59:08 +0800 Subject: [PATCH 13/13] Update efficient.cu --- stream_compaction/efficient.cu | 2 -- 1 file changed, 2 deletions(-) diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 0ef3f60..a306d2a 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -46,8 +46,6 @@ namespace StreamCompaction { for (int i = 0; i < ilog2ceil(n); i++) { - //scanOperation <<>> (n, i, gpu_odata, gpu_idata); - dim3 fullBlocksPerGrid((ending / (1 << (i + 1)) + blockSize - 1) / blockSize); upSweep <<>> (n, i, gpu_idata); }