From 4c6fb5d7d82b4fe4a178a15b1e294b9d0fb2947f Mon Sep 17 00:00:00 2001 From: ZIWEI Date: Thu, 10 Sep 2015 23:22:06 -0400 Subject: [PATCH 01/11] Part1:CPU --- src/main.cpp | 2 +- stream_compaction/cpu.cu | 55 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 7308451..c7a2d27 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 << 4; const int NPOT = SIZE - 3; int a[SIZE], b[SIZE], c[SIZE]; diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index e600c29..7bb6e5f 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -1,6 +1,6 @@ #include #include "cpu.h" - +#include "common.h" namespace StreamCompaction { namespace CPU { @@ -8,8 +8,17 @@ namespace CPU { * CPU scan (prefix sum). */ void scan(int n, int *odata, const int *idata) { - // TODO - printf("TODO\n"); + for (int i = 0; i < n; i++) + { + if (i==0) + { + odata[i] = 0; + continue; + } + odata[i] = odata[i - 1] + idata[i - 1]; + } + // TODO + printf("StreamCompaction::CPU::scan : exclusive prefix sum.\n"); } /** @@ -18,8 +27,16 @@ void scan(int n, int *odata, const int *idata) { * @returns the number of elements remaining after compaction. */ int compactWithoutScan(int n, int *odata, const int *idata) { + int k = 0; + for (int i = 0; i < n; i++) + { + if (idata[i] != 0) + { + odata[k++] = idata[i]; + } + } // TODO - return -1; + return k; } /** @@ -29,7 +46,35 @@ int compactWithoutScan(int n, int *odata, const int *idata) { */ int compactWithScan(int n, int *odata, const int *idata) { // TODO - return -1; + int*TempArray = new int[n+1]; + int*ScanArray = new int[n+1]; + for (int i = 0; i < n; i++) + { + if (idata[i] != 0) + { + TempArray[i] = 1; + } + else + { + TempArray[i] = 0; + } + } + TempArray[n] = 0; + scan(n+1, ScanArray, TempArray); + + int k = 0; + for (int i = 0; i < n; i++) + { + if (TempArray[i]==1) + { + odata[ScanArray[i]] = idata[i]; + k++; + } + } + int count = ScanArray[n]; + delete[] TempArray; + delete[] ScanArray; + return count; } } From fba19a9433371e4e3c2ca0e49a77b689919905a2 Mon Sep 17 00:00:00 2001 From: ZIWEI Date: Fri, 11 Sep 2015 12:58:29 -0400 Subject: [PATCH 02/11] Part2 : Naive --- src/main.cpp | 11 +++---- stream_compaction/cpu.cu | 6 ++-- stream_compaction/naive.cu | 66 ++++++++++++++++++++++++++++++++------ 3 files changed, 64 insertions(+), 19 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index c7a2d27..bb74d90 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 << 4; + const int SIZE = 1 << 3; const int NPOT = SIZE - 3; int a[SIZE], b[SIZE], c[SIZE]; @@ -26,8 +26,8 @@ int main(int argc, char* argv[]) { printf("****************\n"); genArray(SIZE - 1, a, 50); // Leave a 0 at the end to test that edge case + a[SIZE - 1] = 0; printArray(SIZE, a, true); - zeroArray(SIZE, b); printDesc("cpu scan, power-of-two"); StreamCompaction::CPU::scan(SIZE, b, a); @@ -42,13 +42,13 @@ 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(NPOT, c, true); printCmpResult(NPOT, b, c); zeroArray(SIZE, c); @@ -84,9 +84,8 @@ int main(int argc, char* argv[]) { genArray(SIZE - 1, a, 4); // Leave a 0 at the end to test that edge case printArray(SIZE, a, true); - + a[SIZE - 1] = 0; int count, expectedCount, expectedNPOT; - zeroArray(SIZE, b); printDesc("cpu compact without scan, power-of-two"); count = StreamCompaction::CPU::compactWithoutScan(SIZE, b, a); diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 7bb6e5f..5714d4b 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -17,7 +17,7 @@ void scan(int n, int *odata, const int *idata) { } odata[i] = odata[i - 1] + idata[i - 1]; } - // TODO + // TO_DOne printf("StreamCompaction::CPU::scan : exclusive prefix sum.\n"); } @@ -35,7 +35,7 @@ int compactWithoutScan(int n, int *odata, const int *idata) { odata[k++] = idata[i]; } } - // TODO + // TO__DOne return k; } @@ -45,7 +45,7 @@ int compactWithoutScan(int n, int *odata, const int *idata) { * @returns the number of elements remaining after compaction. */ int compactWithScan(int n, int *odata, const int *idata) { - // TODO + // TO_DOne int*TempArray = new int[n+1]; int*ScanArray = new int[n+1]; for (int i = 0; i < n; i++) diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 3d86b60..5935728 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -4,17 +4,63 @@ #include "naive.h" namespace StreamCompaction { -namespace Naive { + namespace Naive { -// TODO: __global__ + // TODO: __global__ -/** - * 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"); -} + /** + * Performs prefix-sum (aka scan) on idata, storing the result into odata. + */ + int * dev_o; -} + __global__ void kernNaiveScan(int pow2d_1, int *dev_odata) + { + int k = threadIdx.x; + if (k >= pow2d_1) + dev_odata[k] = dev_odata[k - pow2d_1] + dev_odata[k]; + } + + void initArrays(int n, const int *hst_idata) + { + int size = n*sizeof(int); + + cudaMalloc((void**)&dev_o, size); + //checkCUDAError("cudaMalloc dev_o failed"); + cudaMemcpy(dev_o, hst_idata, size, cudaMemcpyHostToDevice); + //checkCUDAError("cudaMemcpy odata->dev_o failed"); + + } + + void freeArrays() + { + cudaFree(dev_o); + } + + void scan(int n, int *odata, const int *idata) { + //??? inclusive or exclusive ? not exactly 39.2/slides + initArrays(n, idata); + for (int d = 1; d <= ilog2ceil(n); d++) + { + int pow2_d_1 = pow(2, d - 1); + kernNaiveScan <<<1, n-1 >>>(pow2_d_1,dev_o); + /*cudaMemcpy(odata, dev_o, n*sizeof(int),cudaMemcpyDeviceToHost); + printf("\nd=%d\n---[", d); + for (int i = 0; i < n; i++) + { + printf("\t%d", odata[i]); + } + printf("]\n");*/ + } + // TODO + cudaMemcpy(odata, dev_o, n*sizeof(int), cudaMemcpyDeviceToHost); + //inclusive to exclusive + for (int i = n-1; i >0; i--) + { + odata[i] = odata[i - 1]; + } + odata[0] = 0; + freeArrays(); + } + + } } From 7877ead25c2452c3434a26a24dce4e83d9ffb787 Mon Sep 17 00:00:00 2001 From: ZIWEI Date: Fri, 11 Sep 2015 21:54:27 -0400 Subject: [PATCH 03/11] Part 3 : Work-Efficient GPU Scan&Stream --- src/main.cpp | 15 ++- stream_compaction/efficient.cu | 214 +++++++++++++++++++++++++++++---- stream_compaction/naive.cu | 4 +- 3 files changed, 202 insertions(+), 31 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index bb74d90..07861d8 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 << 3; + const int SIZE = 1 << 4; const int NPOT = SIZE - 3; int a[SIZE], b[SIZE], c[SIZE]; @@ -53,14 +53,15 @@ int main(int argc, char* argv[]) { zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); + printArray(SIZE, a, true);//delete 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"); + printArray(NPOT, a, true);//delete StreamCompaction::Efficient::scan(NPOT, c, a); - //printArray(NPOT, c, true); + printArray(NPOT, c, true); printCmpResult(NPOT, b, c); zeroArray(SIZE, c); @@ -108,13 +109,15 @@ int main(int argc, char* argv[]) { zeroArray(SIZE, c); printDesc("work-efficient compact, power-of-two"); + printArray(SIZE, a, true);//delete 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"); + printArray(SIZE, a, true);//delete 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/efficient.cu b/stream_compaction/efficient.cu index b2f739b..0960ba3 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -3,32 +3,200 @@ #include "common.h" #include "efficient.h" +__device__ int O_o () +{ + int sdfs = threadIdx.x; + int tt; + tt = 0; + tt += sdfs; + tt = 2; + //just for debug + //http://stackoverflow.com/questions/21911059/could-not-resolve-name-when-debug-cuda-kernel + return tt; +} + namespace StreamCompaction { -namespace Efficient { + namespace Efficient { -// TODO: __global__ + // TODO: __global__ -/** - * 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"); -} + /** + * Performs prefix-sum (aka scan) on idata, storing the result into odata. + */ + int * dev_o; -/** - * 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) { - // TODO - return -1; -} + __global__ void kernUpSweep(int pow2d, int * dev_odata) + { + int k = threadIdx.x; + dev_odata[k * 2 * pow2d + (int)pow2d * 2 - 1] += dev_odata[k * 2 * pow2d + (int)pow2d - 1]; + } + + __global__ void kernDownSweep(int pow2d, int * dev_odata,int n) + { + int k = threadIdx.x * 2 * pow2d; -} + //dev_odata[k * 2 * pow2d + (int)pow2d * 2 - 1] += dev_odata[k * 2 * pow2d + (int)pow2d - 1]; + int t = dev_odata[k + pow2d - 1]; + dev_odata[k + pow2d - 1] = dev_odata[k + pow2d * 2 - 1]; + dev_odata[k + pow2d * 2 - 1] += t; + + } + __global__ void setRootZero(int * dev_odata,int n) + { + dev_odata[n - 1] = 0; + } + + void initArrays(int n, const int *hst_idata) + { + int size = n*sizeof(int); + + cudaMalloc((void**)&dev_o, size); + //checkCUDAError("cudaMalloc dev_o failed"); + cudaMemcpy(dev_o, hst_idata, size, cudaMemcpyHostToDevice); + //checkCUDAError("cudaMemcpy odata->dev_o failed"); + + } + + void freeArrays() + { + cudaFree(dev_o); + } + + void scan(int n, int *odata, const int *idata) { + // TO_DOne + int N = ilog2ceil(n); + N = pow(2,N); + initArrays(N, idata); + for (int d = 0; d <= ilog2ceil(N) - 1; d++) + { + int pow2d = pow(2, d); + int end = (N - 1) / (2 * pow2d)+1; + kernUpSweep<<<1,end>>>(pow2d,dev_o);//later:blocksize,gridsize + /*for (int k = 0; k <= (n - 1) /( 2 * pow2d); k ++ ) + { + x[k*2*pow2d + (int)pow2d * 2] += x[k2*pow2d + (int)pow2d - 1]; + }*/ + /* + cudaMemcpy(odata, dev_o, N*sizeof(int),cudaMemcpyDeviceToHost); + printf("\n****** d=%d\t(up)\n----[", d); + for (int i = 0; i < N; i++) + { + printf(" %3d", odata[i]); + } + printf("]\n");*/ + } + setRootZero<<<1,1>>>(dev_o, N); + for (int d = ilog2ceil(N) - 1; d >= 0; d--) + { + int pow2d = pow(2, d); + int end = (N - 1) / (2 * pow2d) + 1; + kernDownSweep <<<1, end >>>(pow2d, dev_o,N); + /* + cudaMemcpy(odata, dev_o, N*sizeof(int), cudaMemcpyDeviceToHost); + printf("\n****** d=%d\t(down)\n----[", d); + for (int i = 0; i < N; i++) + { + printf(" %3d", odata[i]); + } + printf("]\n");*/ + } + cudaMemcpy(odata, dev_o, N*sizeof(int), cudaMemcpyDeviceToHost); + freeArrays(); + //printf("TODO\n"); + } + + /** + * 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 * dev_temp; + int * dev_scan; + int * dev_compactOut; + int * dev_input; + + void freeCompArrays() + { + cudaFree(dev_temp); + cudaFree(dev_scan); + cudaFree(dev_compactOut); + cudaFree(dev_input); + } + + __global__ void kernCalcTemp(int * dev_idata,int *dev_outTemp,int n) + { + int index = threadIdx.x; + if (dev_idata[index] != 0 && index>>(dev_input,dev_temp,n);//later:blocksize,gridsize + cudaMemcpy(dev_scan, dev_temp, size, cudaMemcpyDeviceToDevice); + + //Step 2 : Run exclusive scan + + for (int d = 0; d <= ilog2ceil(N) - 1; d++) + { + int pow2d = pow(2, d); + int end = (N - 1) / (2 * pow2d) + 1; + kernUpSweep <<<1, end >>>(pow2d, dev_scan);//later:blocksize,gridsize + } + + setRootZero <<<1, 1 >>>(dev_scan, N); + + for (int d = ilog2ceil(N) - 1; d >= 0; d--) + { + int pow2d = pow(2, d); + int end = (N - 1) / (2 * pow2d) + 1; + kernDownSweep <<<1, end >>>(pow2d, dev_scan, N); + } + + //Step 3 : Scatter + int compactLength; + cudaMemcpy(&compactLength, &(dev_scan[N - 1]), sizeof(int), cudaMemcpyDeviceToHost); + cudaMalloc((void**)&dev_compactOut, compactLength*sizeof(int)); + + kernScatter<<<1,N>>>(dev_temp,dev_scan,dev_input,dev_compactOut);//later:blocksize,gridsize + + //cudaMemcpy(odata,dev_compactOut,compactLength*sizeof(int),cudaMemcpyDeviceToHost); + + cudaMemcpy(odata, dev_compactOut, compactLength*sizeof(int), cudaMemcpyDeviceToHost); + // TO_DOne + freeCompArrays(); + return compactLength; + } + + } } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 5935728..ec8041d 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -42,7 +42,7 @@ namespace StreamCompaction { for (int d = 1; d <= ilog2ceil(n); d++) { int pow2_d_1 = pow(2, d - 1); - kernNaiveScan <<<1, n-1 >>>(pow2_d_1,dev_o); + kernNaiveScan <<<1, n >>>(pow2_d_1,dev_o); //later:blocksize,gridsize /*cudaMemcpy(odata, dev_o, n*sizeof(int),cudaMemcpyDeviceToHost); printf("\nd=%d\n---[", d); for (int i = 0; i < n; i++) @@ -51,7 +51,7 @@ namespace StreamCompaction { } printf("]\n");*/ } - // TODO + // TO_DOne cudaMemcpy(odata, dev_o, n*sizeof(int), cudaMemcpyDeviceToHost); //inclusive to exclusive for (int i = n-1; i >0; i--) From a49c6caed112f8c799944cee22205b56d77be9c9 Mon Sep 17 00:00:00 2001 From: ZIWEI Date: Sat, 12 Sep 2015 12:07:38 -0400 Subject: [PATCH 04/11] Part 4 : thrust --- src/main.cpp | 4 ++-- stream_compaction/thrust.cu | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 07861d8..e1d43dd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -67,13 +67,13 @@ int main(int argc, char* argv[]) { 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"); diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index d8dbb32..674c99e 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -16,6 +16,21 @@ 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 hst_in(n); + //hst_in.resize(n); + thrust::device_vector dv_in (idata,idata+n) ; + thrust::device_vector dv_out = dv_in; + + + //thrust::copy_n(idata, n, dv_in); + + thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); + //thrust::exclusive_scan(idata, idata + n, odata); + + thrust::copy(dv_out.begin(), dv_out.end(), odata); + } } From 292648e8d7efa75da5452b1524e92b7272f40be9 Mon Sep 17 00:00:00 2001 From: ZIWEI Date: Sat, 12 Sep 2015 22:11:27 -0400 Subject: [PATCH 05/11] Part 5 ; Radix Sort --- src/main.cpp | 25 +++++- stream_compaction/efficient.cu | 4 +- stream_compaction/thrust.cu | 137 ++++++++++++++++++++++++++++----- stream_compaction/thrust.h | 10 ++- 4 files changed, 151 insertions(+), 25 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index e1d43dd..1e49a09 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 << 4; + const int SIZE = 1 << 3; const int NPOT = SIZE - 3; int a[SIZE], b[SIZE], c[SIZE]; @@ -120,4 +120,27 @@ int main(int argc, char* argv[]) { count = StreamCompaction::Efficient::compact(NPOT, c, a); printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); + + printf("\n"); + printf("*****************************\n"); + printf("** Radix Sort **\n"); + printf("*****************************\n"); + + a[0] = 4; + a[1] = 7; + a[2] = 2; + a[3] = 6; + a[4] = 3; + a[5] = 5; + a[6] = 1; + a[7] = 0; + + zeroArray(SIZE, c); + printDesc("Radix Sort, power-of-two"); + printArray(SIZE, a, true);//delete + StreamCompaction::RadixSort::sort(SIZE, c, a); + printArray(SIZE, c, true); + //printCmpResult(SIZE, b, c); + + } diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 0960ba3..5216688 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -127,7 +127,7 @@ namespace StreamCompaction { cudaFree(dev_input); } - __global__ void kernCalcTemp(int * dev_idata,int *dev_outTemp,int n) + __global__ void kernMapToBoolean(int * dev_idata,int *dev_outTemp,int n) { int index = threadIdx.x; if (dev_idata[index] != 0 && index>>(dev_input,dev_temp,n);//later:blocksize,gridsize + kernMapToBoolean <<<1, N >>>(dev_input,dev_temp,n);//later:blocksize,gridsize cudaMemcpy(dev_scan, dev_temp, size, cudaMemcpyDeviceToDevice); //Step 2 : Run exclusive scan diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 674c99e..3b77707 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -7,31 +7,130 @@ #include "thrust.h" namespace StreamCompaction { -namespace Thrust { + 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()); - + /** + * Performs prefix-sum (aka scan) on idata, storing the result into odata. + */ + void scan(int n, int *odata, const int *idata) { + // TO_DOne 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 hst_in(n); - //hst_in.resize(n); - thrust::device_vector dv_in (idata,idata+n) ; - thrust::device_vector dv_out = dv_in; + //thrust::host_vector hst_in(n); + //hst_in.resize(n); + + thrust::device_vector dv_in(idata, idata + n); + thrust::device_vector dv_out = dv_in; - //thrust::copy_n(idata, n, dv_in); - thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); - //thrust::exclusive_scan(idata, idata + n, odata); + //thrust::copy_n(idata, n, dv_in); - thrust::copy(dv_out.begin(), dv_out.end(), odata); + thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); + //thrust::exclusive_scan(idata, idata + n, odata); -} + thrust::copy(dv_out.begin(), dv_out.end(), odata); -} + } + + } + namespace RadixSort + { + __global__ void kernCalc_e( + thrust::detail::normal_iterator> dev_iArray, + thrust::detail::normal_iterator> dev_eArray, + int n + ) + { + int index = threadIdx.x; + int LSB = dev_iArray[index] % 2; + dev_eArray[index] = (LSB == 1) ? 0 : 1; + } + __global__ void kernCalc_t( + thrust::detail::normal_iterator> dv_fArray, + thrust::detail::normal_iterator> dv_tArray, + int totalFalses + ) + { + int index = threadIdx.x; + + dv_tArray[index] = index - dv_fArray[index] + totalFalses; + } + __global__ void kernCalc_d( + thrust::detail::normal_iterator> dv_fArray, + thrust::detail::normal_iterator> dv_tArray, + thrust::detail::normal_iterator> dv_eArray, + thrust::detail::normal_iterator> dv_dArray + ) + { + int index = threadIdx.x; + bool bi = (dv_eArray[index] == 1) ? false : true; + dv_dArray[index] = bi?dv_tArray[index]:dv_fArray[index]; + } + + __global__ void kernScatterBasedOn_d( + thrust::detail::normal_iterator> dv_iArray, + thrust::detail::normal_iterator> dv_oArray, + thrust::detail::normal_iterator> dv_dArray + ) + { + int index = threadIdx.x; + dv_oArray[dv_dArray[index]] = dv_iArray[index]; + } + + void sort(int n, int *odata, const int *idata) + { + //initArrays_RS(n, idata); + thrust::device_vector dv_i(idata,idata+n); + thrust::device_vector dv_e = dv_i; + thrust::device_vector dv_f = dv_e; + thrust::device_vector dv_t = dv_f; + thrust::device_vector dv_d = dv_f; + thrust::device_vector dv_o = dv_d; + // Step 1 : Compute e array + kernCalc_e<<<1,n>>>(dv_i.begin(),dv_e.begin(),n); + //* + thrust::copy_n(dv_e.begin(), n, odata); + printf("\n****** step 1 : dv_e\n----["); + for (int i = 0; i < n; i++) + { + printf(" %3d", odata[i]); + } + printf("]\n"); //*/ + // Step 2 : Exclusive Scan e + thrust::exclusive_scan(dv_e.begin(), dv_e.end(), dv_f.begin()); + //* + thrust::copy_n(dv_f.begin(), n, odata); + printf("\n****** step 2 : dv_f\n----["); + for (int i = 0; i < n; i++) + { + printf(" %3d", odata[i]); + } + printf("]\n"); //*/ + + //Step 3 : Compute totalFalses + int totalFalses = dv_e[n - 1] + dv_f[n - 1]; + + //Step 4 : Compute t array + kernCalc_t <<<1, n >>>(dv_f.begin(), dv_t.begin() , totalFalses); + + + // Step 5 : Scatter based on d + kernCalc_d<<<1,n>>>(dv_f.begin(),dv_t.begin(),dv_e.begin(),dv_d.begin()); + + + kernScatterBasedOn_d<<<1,n>>>(dv_i.begin(),dv_o.begin(),dv_d.begin()); + + //* + thrust::copy_n(dv_o.begin(), n, odata); + printf("\n****** final : dv_o\n----["); + for (int i = 0; i < n; i++) + { + printf(" %3d", odata[i]); + } + printf("]\n"); //*/ + + } + } } diff --git a/stream_compaction/thrust.h b/stream_compaction/thrust.h index 06707f3..372d4e3 100644 --- a/stream_compaction/thrust.h +++ b/stream_compaction/thrust.h @@ -1,7 +1,11 @@ #pragma once namespace StreamCompaction { -namespace Thrust { - void scan(int n, int *odata, const int *idata); -} + namespace Thrust { + void scan(int n, int *odata, const int *idata); + } + namespace RadixSort + { + void sort(int n, int *odata, const int *idata); + } } From aecf2a9790f3ca715df668be187a434ea1021553 Mon Sep 17 00:00:00 2001 From: ZIWEI Date: Sun, 13 Sep 2015 15:27:05 -0400 Subject: [PATCH 06/11] Optimize Block Sizes, update Readme --- README.md | 298 ++++++++++----------------------- src/main.cpp | 20 +-- stream_compaction/common.h | 4 + stream_compaction/efficient.cu | 115 ++++++------- stream_compaction/naive.cu | 24 ++- stream_compaction/thrust.cu | 69 ++++---- 6 files changed, 212 insertions(+), 318 deletions(-) diff --git a/README.md b/README.md index a82ea0f..c9807b0 100644 --- a/README.md +++ b/README.md @@ -3,211 +3,93 @@ 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. +* Ziwei Zong +* Tested on: Windows 10, i7-5500 @ 2.40GHz 8GB, GTX 950M (Personal) + +Descriptions +-------------------------- +Part 1 : CPU Scan & Compaction (see file cpu.cu) +Part 2 : Naive Scan (naive.cu) +Part 3 : Work-Efficient Scan & Compaction (efficient.cu) +Part 4 : Thrust Scan (thrust.cu) +Part 5 : Radix Sort (in file thrust.cu, RadixSort::sort) + +Block Sizes Optimization +-------------------------- +| | 32 | 64 | 128 | 256 | 512 |1024| +| block_naive|0.062|0.061|0.060|0.062|0.064|0.078| +| block_eff|0.139|0.139|0.140|0.142|0.148|0.155| +|block_thrust|1.060|1.180|1.200|1.100|1.029|1.090| +(ms) +Thus, I choose block size 128 for naive scan, 64 for efficient scan and 512 for thrust scan. + +Output +-------------------------- + +**************** +** SCAN TESTS ** +**************** + [ 38 19 38 37 5 47 15 35 0 12 3 0 42 ... 26 0 ] +==== cpu scan, power-of-two ==== +StreamCompaction::CPU::scan : exclusive prefix sum. + [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6203 6229 ] +==== cpu scan, non-power-of-two ==== +StreamCompaction::CPU::scan : exclusive prefix sum. + [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6146 6190 ] + passed +==== naive scan, power-of-two ==== + GPU time for naive scan : 0.0696ms + [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6203 6229 ] + passed +==== naive scan, non-power-of-two ==== + GPU time for naive scan : 0.0676ms + [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6146 6190 ] + passed +==== work-efficient scan, power-of-two ==== + [ 38 19 38 37 5 47 15 35 0 12 3 0 42 ... 26 0 ] + GPU time for efficient scan : 0.1403ms + [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6203 6229 ] + passed +==== work-efficient scan, non-power-of-two ==== + [ 38 19 38 37 5 47 15 35 0 12 3 0 42 ... 44 8 ] + GPU time for efficient scan : 0.1403ms + [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6146 6190 ] + passed +==== thrust scan, power-of-two ==== + GPU time for thrust scan : 128.8397ms + [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6203 6229 ] + passed +==== thrust scan, non-power-of-two ==== + GPU time for thrust scan : 1.1305ms + [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6146 6190 ] + passed + +***************************** +** STREAM COMPACTION TESTS ** +***************************** + [ 2 3 2 1 3 1 1 1 2 0 1 0 2 ... 0 0 ] +==== cpu compact without scan, power-of-two ==== + [ 2 3 2 1 3 1 1 1 2 1 2 1 1 ... 2 1 ] + passed +==== cpu compact without scan, non-power-of-two ==== + [ 2 3 2 1 3 1 1 1 2 1 2 1 1 ... 3 2 ] + passed +==== cpu compact with scan ==== +StreamCompaction::CPU::scan : exclusive prefix sum. + [ 2 3 2 1 3 1 1 1 2 1 2 1 1 ... 2 1 ] + passed +==== work-efficient compact, power-of-two ==== + [ 2 3 2 1 3 1 1 1 2 0 1 0 2 ... 0 0 ] + [ 2 3 2 1 3 1 1 1 2 1 2 1 1 ... 2 1 ] + passed +==== work-efficient compact, non-power-of-two ==== + [ 2 3 2 1 3 1 1 1 2 0 1 0 2 ... 0 0 ] + [ 2 3 2 1 3 1 1 1 2 1 2 1 1 ... 3 2 ] + passed + +***************************** +** Radix Sort ** +***************************** +==== Radix Sort, power-of-two ==== + [ 4 7 2 6 3 5 1 0 ] + [ 4 2 6 0 7 3 5 1 ] diff --git a/src/main.cpp b/src/main.cpp index 1e49a09..547cc21 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,12 +14,12 @@ #include "testing_helpers.hpp" int main(int argc, char* argv[]) { - const int SIZE = 1 << 3; + const int SIZE = 1 << 8; const int NPOT = SIZE - 3; int a[SIZE], b[SIZE], c[SIZE]; // Scan tests - + printf("\n"); printf("****************\n"); printf("** SCAN TESTS **\n"); @@ -38,7 +38,7 @@ int main(int argc, char* argv[]) { StreamCompaction::CPU::scan(NPOT, c, a); printArray(NPOT, b, true); printCmpResult(NPOT, b, c); - + zeroArray(SIZE, c); printDesc("naive scan, power-of-two"); StreamCompaction::Naive::scan(SIZE, c, a); @@ -50,7 +50,7 @@ int main(int argc, char* argv[]) { StreamCompaction::Naive::scan(NPOT, c, a); printArray(NPOT, c, true); printCmpResult(NPOT, b, c); - + zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); printArray(SIZE, a, true);//delete @@ -75,7 +75,7 @@ int main(int argc, char* argv[]) { StreamCompaction::Thrust::scan(NPOT, c, a); printArray(NPOT, c, true); printCmpResult(NPOT, b, c); - + printf("\n"); printf("*****************************\n"); printf("** STREAM COMPACTION TESTS **\n"); @@ -135,12 +135,10 @@ int main(int argc, char* argv[]) { a[6] = 1; a[7] = 0; - zeroArray(SIZE, c); + zeroArray(8, c); printDesc("Radix Sort, power-of-two"); - printArray(SIZE, a, true);//delete - StreamCompaction::RadixSort::sort(SIZE, c, a); - printArray(SIZE, c, true); + printArray(8, a, true);//delete + StreamCompaction::RadixSort::sort(8, c, a); + printArray(8, c, true); //printCmpResult(SIZE, b, c); - - } diff --git a/stream_compaction/common.h b/stream_compaction/common.h index 4f52663..c39759c 100644 --- a/stream_compaction/common.h +++ b/stream_compaction/common.h @@ -7,6 +7,10 @@ #define FILENAME (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) #define checkCUDAError(msg) checkCUDAErrorFn(msg, FILENAME, __LINE__) +#define blockSize_eff 32 +#define blockSize_naive 32 +#define blockSize_thrust 32 + /** * 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 5216688..81aa40e 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -3,18 +3,6 @@ #include "common.h" #include "efficient.h" -__device__ int O_o () -{ - int sdfs = threadIdx.x; - int tt; - tt = 0; - tt += sdfs; - tt = 2; - //just for debug - //http://stackoverflow.com/questions/21911059/could-not-resolve-name-when-debug-cuda-kernel - return tt; -} - namespace StreamCompaction { namespace Efficient { @@ -25,16 +13,19 @@ namespace StreamCompaction { */ int * dev_o; - __global__ void kernUpSweep(int pow2d, int * dev_odata) + __global__ void kernUpSweep(int pow2d, int * dev_odata,int end) { - int k = threadIdx.x; + int k = blockIdx.x * blockDim.x + threadIdx.x; + if (k > end) return; dev_odata[k * 2 * pow2d + (int)pow2d * 2 - 1] += dev_odata[k * 2 * pow2d + (int)pow2d - 1]; } - __global__ void kernDownSweep(int pow2d, int * dev_odata,int n) + __global__ void kernDownSweep(int pow2d, int * dev_odata,int n,int end) { - int k = threadIdx.x * 2 * pow2d; - + + int k = (blockIdx.x * blockDim.x + threadIdx.x); + if (k > end) return; + k = k * 2 * pow2d; //dev_odata[k * 2 * pow2d + (int)pow2d * 2 - 1] += dev_odata[k * 2 * pow2d + (int)pow2d - 1]; int t = dev_odata[k + pow2d - 1]; dev_odata[k + pow2d - 1] = dev_odata[k + pow2d * 2 - 1]; @@ -66,54 +57,54 @@ namespace StreamCompaction { // TO_DOne int N = ilog2ceil(n); N = pow(2,N); + + + dim3 threadsPerBlock(blockSize_eff); + initArrays(N, idata); + + cudaEvent_t start, stop; + cudaEventCreate(&start); + cudaEventCreate(&stop); + + cudaEventRecord(start); for (int d = 0; d <= ilog2ceil(N) - 1; d++) { int pow2d = pow(2, d); int end = (N - 1) / (2 * pow2d)+1; - kernUpSweep<<<1,end>>>(pow2d,dev_o);//later:blocksize,gridsize - /*for (int k = 0; k <= (n - 1) /( 2 * pow2d); k ++ ) - { - x[k*2*pow2d + (int)pow2d * 2] += x[k2*pow2d + (int)pow2d - 1]; - }*/ - /* - cudaMemcpy(odata, dev_o, N*sizeof(int),cudaMemcpyDeviceToHost); - printf("\n****** d=%d\t(up)\n----[", d); - for (int i = 0; i < N; i++) - { - printf(" %3d", odata[i]); - } - printf("]\n");*/ + dim3 fullBlocksPerGrid((end + blockSize_eff - 1) / blockSize_eff); + kernUpSweep <<>>(pow2d, dev_o, end);//later:blocksize,gridsize + } setRootZero<<<1,1>>>(dev_o, N); for (int d = ilog2ceil(N) - 1; d >= 0; d--) { int pow2d = pow(2, d); int end = (N - 1) / (2 * pow2d) + 1; - kernDownSweep <<<1, end >>>(pow2d, dev_o,N); - /* - cudaMemcpy(odata, dev_o, N*sizeof(int), cudaMemcpyDeviceToHost); - printf("\n****** d=%d\t(down)\n----[", d); - for (int i = 0; i < N; i++) - { - printf(" %3d", odata[i]); - } - printf("]\n");*/ + dim3 fullBlocksPerGrid((end + blockSize_eff - 1) / blockSize_eff); + kernDownSweep <<>>(pow2d, dev_o,N,end); } + cudaEventRecord(stop); + cudaEventSynchronize(stop); + float milliseconds = 0; + cudaEventElapsedTime(&milliseconds, start, stop); + cudaMemcpy(odata, dev_o, N*sizeof(int), cudaMemcpyDeviceToHost); + + printf("\t GPU time for efficient scan : %.4fms\n", milliseconds); + freeArrays(); - //printf("TODO\n"); } /** - * 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. - */ + * 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 * dev_temp; int * dev_scan; int * dev_compactOut; @@ -127,16 +118,16 @@ namespace StreamCompaction { cudaFree(dev_input); } - __global__ void kernMapToBoolean(int * dev_idata,int *dev_outTemp,int n) + __global__ void kernMapToBoolean(int * dev_idata, int *dev_outTemp, int n) { int index = threadIdx.x; - if (dev_idata[index] != 0 && index>>(dev_input,dev_temp,n);//later:blocksize,gridsize + kernMapToBoolean << <1, N >> >(dev_input, dev_temp, n);//later:blocksize,gridsize cudaMemcpy(dev_scan, dev_temp, size, cudaMemcpyDeviceToDevice); //Step 2 : Run exclusive scan @@ -171,16 +162,16 @@ namespace StreamCompaction { { int pow2d = pow(2, d); int end = (N - 1) / (2 * pow2d) + 1; - kernUpSweep <<<1, end >>>(pow2d, dev_scan);//later:blocksize,gridsize + kernUpSweep << <1, end >> >(pow2d, dev_scan,end);//later:blocksize,gridsize } - setRootZero <<<1, 1 >>>(dev_scan, N); + setRootZero << <1, 1 >> >(dev_scan, N); for (int d = ilog2ceil(N) - 1; d >= 0; d--) { int pow2d = pow(2, d); int end = (N - 1) / (2 * pow2d) + 1; - kernDownSweep <<<1, end >>>(pow2d, dev_scan, N); + kernDownSweep << <1, end >> >(pow2d, dev_scan, N,end); } //Step 3 : Scatter @@ -188,10 +179,10 @@ namespace StreamCompaction { cudaMemcpy(&compactLength, &(dev_scan[N - 1]), sizeof(int), cudaMemcpyDeviceToHost); cudaMalloc((void**)&dev_compactOut, compactLength*sizeof(int)); - kernScatter<<<1,N>>>(dev_temp,dev_scan,dev_input,dev_compactOut);//later:blocksize,gridsize + kernScatter << <1, N >> >(dev_temp, dev_scan, dev_input, dev_compactOut);//later:blocksize,gridsize //cudaMemcpy(odata,dev_compactOut,compactLength*sizeof(int),cudaMemcpyDeviceToHost); - + cudaMemcpy(odata, dev_compactOut, compactLength*sizeof(int), cudaMemcpyDeviceToHost); // TO_DOne freeCompArrays(); @@ -199,4 +190,4 @@ namespace StreamCompaction { } } -} +} \ No newline at end of file diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index ec8041d..08b476b 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -15,7 +15,7 @@ namespace StreamCompaction { __global__ void kernNaiveScan(int pow2d_1, int *dev_odata) { - int k = threadIdx.x; + int k = blockIdx.x * blockDim.x + threadIdx.x; if (k >= pow2d_1) dev_odata[k] = dev_odata[k - pow2d_1] + dev_odata[k]; } @@ -37,20 +37,26 @@ namespace StreamCompaction { } void scan(int n, int *odata, const int *idata) { + dim3 threadsPerBlock(blockSize_naive); + dim3 fullBlocksPerGrid((n + blockSize_eff - 1) / blockSize_eff); //??? inclusive or exclusive ? not exactly 39.2/slides initArrays(n, idata); + + cudaEvent_t start, stop; + cudaEventCreate(&start); + cudaEventCreate(&stop); + + cudaEventRecord(start); for (int d = 1; d <= ilog2ceil(n); d++) { int pow2_d_1 = pow(2, d - 1); - kernNaiveScan <<<1, n >>>(pow2_d_1,dev_o); //later:blocksize,gridsize - /*cudaMemcpy(odata, dev_o, n*sizeof(int),cudaMemcpyDeviceToHost); - printf("\nd=%d\n---[", d); - for (int i = 0; i < n; i++) - { - printf("\t%d", odata[i]); - } - printf("]\n");*/ + kernNaiveScan <<>>(pow2_d_1, dev_o); //later:blocksize,gridsize } + cudaEventRecord(stop); + cudaEventSynchronize(stop); + float milliseconds = 0; + cudaEventElapsedTime(&milliseconds, start, stop); + printf("\t GPU time for naive scan : %.4fms\n",milliseconds); // TO_DOne cudaMemcpy(odata, dev_o, n*sizeof(int), cudaMemcpyDeviceToHost); //inclusive to exclusive diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 3b77707..2fe90cf 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -10,8 +10,8 @@ namespace StreamCompaction { namespace Thrust { /** - * Performs prefix-sum (aka scan) on idata, storing the result into odata. - */ + * Performs prefix-sum (aka scan) on idata, storing the result into odata. + */ void scan(int n, int *odata, const int *idata) { // TO_DOne use `thrust::exclusive_scan` // example: for device_vectors dv_in and dv_out: @@ -20,16 +20,24 @@ namespace StreamCompaction { //thrust::host_vector hst_in(n); //hst_in.resize(n); - + thrust::device_vector dv_in(idata, idata + n); thrust::device_vector dv_out = dv_in; //thrust::copy_n(idata, n, dv_in); + cudaEvent_t start, stop; + cudaEventCreate(&start); + cudaEventCreate(&stop); + cudaEventRecord(start); thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); + cudaEventRecord(stop); //thrust::exclusive_scan(idata, idata + n, odata); - + cudaEventSynchronize(stop); + float milliseconds = 0; + cudaEventElapsedTime(&milliseconds, start, stop); + printf("\t GPU time for thrust scan : %.4fms\n", milliseconds); thrust::copy(dv_out.begin(), dv_out.end(), odata); } @@ -38,23 +46,24 @@ namespace StreamCompaction { namespace RadixSort { __global__ void kernCalc_e( - thrust::detail::normal_iterator> dev_iArray, - thrust::detail::normal_iterator> dev_eArray, - int n - ) + thrust::detail::normal_iterator> dev_iArray, + thrust::detail::normal_iterator> dev_eArray, + int n + ) { - int index = threadIdx.x; + int index = blockIdx.x*blockDim.x + threadIdx.x; + if (index >= n) return; int LSB = dev_iArray[index] % 2; - dev_eArray[index] = (LSB == 1) ? 0 : 1; + dev_eArray[index] = (LSB == 1) ? 0 : 1; } __global__ void kernCalc_t( - thrust::detail::normal_iterator> dv_fArray, - thrust::detail::normal_iterator> dv_tArray, - int totalFalses - ) + thrust::detail::normal_iterator> dv_fArray, + thrust::detail::normal_iterator> dv_tArray, + int totalFalses + ) { int index = threadIdx.x; - + dv_tArray[index] = index - dv_fArray[index] + totalFalses; } __global__ void kernCalc_d( @@ -66,7 +75,7 @@ namespace StreamCompaction { { int index = threadIdx.x; bool bi = (dv_eArray[index] == 1) ? false : true; - dv_dArray[index] = bi?dv_tArray[index]:dv_fArray[index]; + dv_dArray[index] = bi ? dv_tArray[index] : dv_fArray[index]; } __global__ void kernScatterBasedOn_d( @@ -82,25 +91,29 @@ namespace StreamCompaction { void sort(int n, int *odata, const int *idata) { //initArrays_RS(n, idata); - thrust::device_vector dv_i(idata,idata+n); + thrust::device_vector dv_i(idata, idata + n); thrust::device_vector dv_e = dv_i; thrust::device_vector dv_f = dv_e; thrust::device_vector dv_t = dv_f; thrust::device_vector dv_d = dv_f; thrust::device_vector dv_o = dv_d; + + dim3 fullBlocksPerGrid((n + blockSize_thrust - 1) / blockSize_thrust); + dim3 threadsPerBlock(blockSize_thrust); + // Step 1 : Compute e array - kernCalc_e<<<1,n>>>(dv_i.begin(),dv_e.begin(),n); - //* + kernCalc_e <<>>(dv_i.begin(), dv_e.begin(), n); + /* thrust::copy_n(dv_e.begin(), n, odata); printf("\n****** step 1 : dv_e\n----["); for (int i = 0; i < n; i++) { - printf(" %3d", odata[i]); + printf(" %3d", odata[i]); } printf("]\n"); //*/ // Step 2 : Exclusive Scan e thrust::exclusive_scan(dv_e.begin(), dv_e.end(), dv_f.begin()); - //* + /* thrust::copy_n(dv_f.begin(), n, odata); printf("\n****** step 2 : dv_f\n----["); for (int i = 0; i < n; i++) @@ -113,24 +126,24 @@ namespace StreamCompaction { int totalFalses = dv_e[n - 1] + dv_f[n - 1]; //Step 4 : Compute t array - kernCalc_t <<<1, n >>>(dv_f.begin(), dv_t.begin() , totalFalses); + kernCalc_t << <1, n >> >(dv_f.begin(), dv_t.begin(), totalFalses); // Step 5 : Scatter based on d - kernCalc_d<<<1,n>>>(dv_f.begin(),dv_t.begin(),dv_e.begin(),dv_d.begin()); + kernCalc_d << <1, n >> >(dv_f.begin(), dv_t.begin(), dv_e.begin(), dv_d.begin()); - kernScatterBasedOn_d<<<1,n>>>(dv_i.begin(),dv_o.begin(),dv_d.begin()); + kernScatterBasedOn_d << <1, n >> >(dv_i.begin(), dv_o.begin(), dv_d.begin()); - //* + thrust::copy_n(dv_o.begin(), n, odata); - printf("\n****** final : dv_o\n----["); + /*printf("\n****** final : dv_o\n----["); for (int i = 0; i < n; i++) { printf(" %3d", odata[i]); } - printf("]\n"); //*/ + printf("]\n"); */ } } -} +} \ No newline at end of file From 0d587aebda5ab8a29fea4fc64e17c2b5f24cd098 Mon Sep 17 00:00:00 2001 From: ZIWEI Date: Sun, 13 Sep 2015 15:30:16 -0400 Subject: [PATCH 07/11] readme --- README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index c9807b0..debeedb 100644 --- a/README.md +++ b/README.md @@ -29,15 +29,16 @@ Output **************** ** SCAN TESTS ** **************** + [ 38 19 38 37 5 47 15 35 0 12 3 0 42 ... 26 0 ] -==== cpu scan, power-of-two ==== -StreamCompaction::CPU::scan : exclusive prefix sum. - [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6203 6229 ] -==== cpu scan, non-power-of-two ==== -StreamCompaction::CPU::scan : exclusive prefix sum. + ==== cpu scan, power-of-two ==== + StreamCompaction::CPU::scan : exclusive prefix sum. + [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6203 6229 ] + ==== cpu scan, non-power-of-two ==== + StreamCompaction::CPU::scan : exclusive prefix sum. [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6146 6190 ] passed -==== naive scan, power-of-two ==== + ==== naive scan, power-of-two ==== GPU time for naive scan : 0.0696ms [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6203 6229 ] passed From 4d2976383ff5f45952200fd66b3d79fc76c97d88 Mon Sep 17 00:00:00 2001 From: ZIWEI Date: Sun, 13 Sep 2015 17:02:57 -0400 Subject: [PATCH 08/11] update readme --- README.md | 30 ++++++++++++++++++------------ images/not power of 2.png | Bin 0 -> 93089 bytes images/power of 2.png | Bin 0 -> 98944 bytes src/main.cpp | 27 ++++++++++++++------------- stream_compaction/common.h | 6 +++--- stream_compaction/cpu.cu | 28 +++++++++++++++++++++++++++- stream_compaction/naive.cu | 2 +- stream_compaction/thrust.cu | 2 +- 8 files changed, 64 insertions(+), 31 deletions(-) create mode 100644 images/not power of 2.png create mode 100644 images/power of 2.png diff --git a/README.md b/README.md index debeedb..f2e0c5e 100644 --- a/README.md +++ b/README.md @@ -16,13 +16,19 @@ Part 5 : Radix Sort (in file thrust.cu, RadixSort::sort) Block Sizes Optimization -------------------------- -| | 32 | 64 | 128 | 256 | 512 |1024| +| | 32 | 64 | 128 | 256 | 512 | 1024| +|------------|-----|-----|-----|-----|-----|-----| | block_naive|0.062|0.061|0.060|0.062|0.064|0.078| | block_eff|0.139|0.139|0.140|0.142|0.148|0.155| |block_thrust|1.060|1.180|1.200|1.100|1.029|1.090| (ms) Thus, I choose block size 128 for naive scan, 64 for efficient scan and 512 for thrust scan. +CPU & GPU Performance Comparison +-------------------------------- +![](images/power of 2.PNG) +![](images/not power of 2.PNG) + Output -------------------------- @@ -46,21 +52,21 @@ Output GPU time for naive scan : 0.0676ms [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6146 6190 ] passed -==== work-efficient scan, power-of-two ==== + ==== work-efficient scan, power-of-two ==== [ 38 19 38 37 5 47 15 35 0 12 3 0 42 ... 26 0 ] GPU time for efficient scan : 0.1403ms [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6203 6229 ] passed -==== work-efficient scan, non-power-of-two ==== + ==== work-efficient scan, non-power-of-two ==== [ 38 19 38 37 5 47 15 35 0 12 3 0 42 ... 44 8 ] GPU time for efficient scan : 0.1403ms [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6146 6190 ] passed -==== thrust scan, power-of-two ==== + ==== thrust scan, power-of-two ==== GPU time for thrust scan : 128.8397ms [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6203 6229 ] passed -==== thrust scan, non-power-of-two ==== + ==== thrust scan, non-power-of-two ==== GPU time for thrust scan : 1.1305ms [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6146 6190 ] passed @@ -69,21 +75,21 @@ Output ** STREAM COMPACTION TESTS ** ***************************** [ 2 3 2 1 3 1 1 1 2 0 1 0 2 ... 0 0 ] -==== cpu compact without scan, power-of-two ==== + ==== cpu compact without scan, power-of-two ==== [ 2 3 2 1 3 1 1 1 2 1 2 1 1 ... 2 1 ] passed -==== cpu compact without scan, non-power-of-two ==== + ==== cpu compact without scan, non-power-of-two ==== [ 2 3 2 1 3 1 1 1 2 1 2 1 1 ... 3 2 ] passed -==== cpu compact with scan ==== -StreamCompaction::CPU::scan : exclusive prefix sum. + ==== cpu compact with scan ==== + StreamCompaction::CPU::scan : exclusive prefix sum. [ 2 3 2 1 3 1 1 1 2 1 2 1 1 ... 2 1 ] passed -==== work-efficient compact, power-of-two ==== + ==== work-efficient compact, power-of-two ==== [ 2 3 2 1 3 1 1 1 2 0 1 0 2 ... 0 0 ] [ 2 3 2 1 3 1 1 1 2 1 2 1 1 ... 2 1 ] passed -==== work-efficient compact, non-power-of-two ==== + ==== work-efficient compact, non-power-of-two ==== [ 2 3 2 1 3 1 1 1 2 0 1 0 2 ... 0 0 ] [ 2 3 2 1 3 1 1 1 2 1 2 1 1 ... 3 2 ] passed @@ -91,6 +97,6 @@ StreamCompaction::CPU::scan : exclusive prefix sum. ***************************** ** Radix Sort ** ***************************** -==== Radix Sort, power-of-two ==== + ==== Radix Sort, power-of-two ==== [ 4 7 2 6 3 5 1 0 ] [ 4 2 6 0 7 3 5 1 ] diff --git a/images/not power of 2.png b/images/not power of 2.png new file mode 100644 index 0000000000000000000000000000000000000000..62976237b2e314f91ad3b077a5bfe9db013b4df1 GIT binary patch literal 93089 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%0Ds`y{-S;2#1o$R;rtT>}37j39|0ceLjQ+LskK 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

A9v#X&1Ug`9^{d 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 UWJ04{2NCe6B(Ek{AY&5vf5z#m%m4rY literal 0 HcmV?d00001 diff --git a/images/power of 2.png b/images/power of 2.png new file mode 100644 index 0000000000000000000000000000000000000000..050a6f4c71f9a9e8429e2cbb3a2565a75c922351 GIT binary patch literal 98944 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

WNrM=-SGNwwwJ5^$q%tEX2Yy#g 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 literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp index 547cc21..9834fc7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,9 +12,11 @@ #include #include #include "testing_helpers.hpp" +#include +#include int main(int argc, char* argv[]) { - const int SIZE = 1 << 8; + const int SIZE = 1 << 10; const int NPOT = SIZE - 3; int a[SIZE], b[SIZE], c[SIZE]; @@ -31,51 +33,49 @@ int main(int argc, char* argv[]) { zeroArray(SIZE, b); printDesc("cpu scan, power-of-two"); StreamCompaction::CPU::scan(SIZE, b, a); - printArray(SIZE, b, true); + //printArray(SIZE, b, true); zeroArray(SIZE, c); printDesc("cpu scan, non-power-of-two"); StreamCompaction::CPU::scan(NPOT, c, a); - printArray(NPOT, b, true); + //printArray(NPOT, b, true); printCmpResult(NPOT, b, c); 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(NPOT, c, true); + //printArray(NPOT, c, true); printCmpResult(NPOT, b, c); zeroArray(SIZE, c); printDesc("work-efficient scan, power-of-two"); - printArray(SIZE, a, true);//delete 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"); - printArray(NPOT, a, true);//delete 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"); printf("*****************************\n"); printf("** STREAM COMPACTION TESTS **\n"); @@ -140,5 +140,6 @@ int main(int argc, char* argv[]) { printArray(8, a, true);//delete StreamCompaction::RadixSort::sort(8, c, a); printArray(8, c, true); - //printCmpResult(SIZE, b, c); + //printCmpResult(SIZE, b, c);*/ + std::cin.get(); } diff --git a/stream_compaction/common.h b/stream_compaction/common.h index c39759c..698a919 100644 --- a/stream_compaction/common.h +++ b/stream_compaction/common.h @@ -7,9 +7,9 @@ #define FILENAME (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) #define checkCUDAError(msg) checkCUDAErrorFn(msg, FILENAME, __LINE__) -#define blockSize_eff 32 -#define blockSize_naive 32 -#define blockSize_thrust 32 +#define blockSize_eff 64 +#define blockSize_naive 128 +#define blockSize_thrust 512 /** * 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 5714d4b..cc8e3a6 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -1,6 +1,9 @@ #include #include "cpu.h" #include "common.h" +#include +#include + namespace StreamCompaction { namespace CPU { @@ -8,6 +11,16 @@ namespace CPU { * CPU scan (prefix sum). */ void scan(int n, int *odata, const int *idata) { + cudaEvent_t start, stop; + cudaEventCreate(&start); + cudaEventCreate(&stop); + + cudaEventRecord(start); + std::clock_t t1, t2; + t1 = std::clock(); + + double duration; + for (int i = 0; i < n; i++) { if (i==0) @@ -17,8 +30,21 @@ void scan(int n, int *odata, const int *idata) { } odata[i] = odata[i - 1] + idata[i - 1]; } + t2 = std::clock(); + + duration = (float)t2 - (float)t1; + + cudaEventRecord(stop); + + cudaEventSynchronize(stop); + float milliseconds = 0; + cudaEventElapsedTime(&milliseconds, start, stop); + + printf("\t(CudaEvent)CPU time for scan : %3fms\n",milliseconds); + printf("\t(Clock)CPU time for scan : %3fms\n", duration); + // TO_DOne - printf("StreamCompaction::CPU::scan : exclusive prefix sum.\n"); + //printf("StreamCompaction::CPU::scan : exclusive prefix sum.\n"); } /** diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 08b476b..3ee5846 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -38,7 +38,7 @@ namespace StreamCompaction { void scan(int n, int *odata, const int *idata) { dim3 threadsPerBlock(blockSize_naive); - dim3 fullBlocksPerGrid((n + blockSize_eff - 1) / blockSize_eff); + dim3 fullBlocksPerGrid((n + blockSize_naive - 1) / blockSize_naive); //??? inclusive or exclusive ? not exactly 39.2/slides initArrays(n, idata); diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 2fe90cf..ba09626 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -33,7 +33,7 @@ namespace StreamCompaction { cudaEventRecord(start); thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); cudaEventRecord(stop); - //thrust::exclusive_scan(idata, idata + n, odata); + cudaEventSynchronize(stop); float milliseconds = 0; cudaEventElapsedTime(&milliseconds, start, stop); From 82c07b36ca428f11c1166b95c836510b02d430e2 Mon Sep 17 00:00:00 2001 From: ZIWEI Date: Sun, 13 Sep 2015 17:25:29 -0400 Subject: [PATCH 09/11] update readme --- README.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f2e0c5e..7515b90 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,24 @@ Thus, I choose block size 128 for naive scan, 64 for efficient scan and 512 for CPU & GPU Performance Comparison -------------------------------- -![](images/power of 2.PNG) -![](images/not power of 2.PNG) +|Array_length| 2^4| 2^6| 2^8| 2^10| 2^12| +|------------|---------|-------|-------|--------|-------| +|cpu |power of 2 |0.0024 |0.002304 |0.002304 |0.002304 |0.002304| +|cpu |! Power of 2 |0.0023 |0.002304 |0.002304 |0.002336 |0.002336| +|gpu naïve |power of 2 |0.027 |0.0374 |0.0496 | 0.0609 |0.0766| +|gpu naïve |! Power of 2 |0.0252 |0.0355 |0.0473 |0.0587 |0.0745| +|gpu efficient |power of 2 |0.0541 |0.0765 |0.0985 |0.1312 |0.1551| +|gpu efficient |! Power of 2 |0.053 |0.0748 |0.0969 |0.1307 |0.1537| +|gpu thrust |power of 2 |0.03293|0.3129 |0.3414 | 0.3854 |0.3011| +|gpu thrust |! Power of 2 |0.3039 |0.3476 |0.2955 | 0.3535 | 0.3035| +(ms) +Graph is shown below. +![](images/power of 2.png) +![](images/not power of 2.png) +- As the line chart shows, the calculation time for thrust scan doesn't have any specific rules while naive and efficient scan time perform power function correlation with the length of array. +- Weirdly, the time for CPU is very small no matter how long the array is. I was assumming that it was not right to count CPU time using Cuda event so I then tried to use std::clock. However, the result time is even smaller(0.0). Therefore, CPU did perform better than GPU for this task, and that might due to the high cost for memory accessing. +- The naive scan method also performs better than the efficient scan which is not as expected. + Output -------------------------- From 96da79c6acb3507f7a3539f0a4acda3642bde5b4 Mon Sep 17 00:00:00 2001 From: ZIWEI Date: Sun, 13 Sep 2015 17:27:51 -0400 Subject: [PATCH 10/11] update readme --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7515b90..9a2fe07 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,11 @@ CUDA Stream Compaction Descriptions -------------------------- -Part 1 : CPU Scan & Compaction (see file cpu.cu) -Part 2 : Naive Scan (naive.cu) -Part 3 : Work-Efficient Scan & Compaction (efficient.cu) -Part 4 : Thrust Scan (thrust.cu) -Part 5 : Radix Sort (in file thrust.cu, RadixSort::sort) +-Part 1 : CPU Scan & Compaction (see file cpu.cu) +-Part 2 : Naive Scan (naive.cu) +-Part 3 : Work-Efficient Scan & Compaction (efficient.cu) +-Part 4 : Thrust Scan (thrust.cu) +-Part 5 : Radix Sort (in file thrust.cu, RadixSort::sort) Block Sizes Optimization -------------------------- @@ -64,7 +64,7 @@ Output GPU time for naive scan : 0.0696ms [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6203 6229 ] passed -==== naive scan, non-power-of-two ==== + ==== naive scan, non-power-of-two ==== GPU time for naive scan : 0.0676ms [ 0 38 57 95 132 137 184 199 234 234 246 249 249 ... 6146 6190 ] passed From 187935cb8611321a1bb49548bb3915f6896b9030 Mon Sep 17 00:00:00 2001 From: ZIWEI Date: Sun, 13 Sep 2015 17:30:00 -0400 Subject: [PATCH 11/11] submission --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9a2fe07..e96271a 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,11 @@ CUDA Stream Compaction Descriptions -------------------------- --Part 1 : CPU Scan & Compaction (see file cpu.cu) --Part 2 : Naive Scan (naive.cu) --Part 3 : Work-Efficient Scan & Compaction (efficient.cu) --Part 4 : Thrust Scan (thrust.cu) --Part 5 : Radix Sort (in file thrust.cu, RadixSort::sort) + * Part 1 : CPU Scan & Compaction (see file cpu.cu) + * Part 2 : Naive Scan (naive.cu) + * Part 3 : Work-Efficient Scan & Compaction (efficient.cu) + * Part 4 : Thrust Scan (thrust.cu) + * Part 5 : Radix Sort (in file thrust.cu, RadixSort::sort) Block Sizes Optimization --------------------------