From 915b2293ae7c8a1ea814fe6d0a5544c1998eac7a Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 10 Sep 2015 01:34:56 -0400 Subject: [PATCH 01/14] Implemented cpu methods and naive scan methods --- src/main.cpp | 5 ++++- stream_compaction/cpu.cu | 45 +++++++++++++++++++++++++++++++++----- stream_compaction/cpu.h | 11 ++++++++++ stream_compaction/naive.cu | 42 ++++++++++++++++++++++++++++++++++- 4 files changed, 95 insertions(+), 8 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 0ffdb29..49fcfae 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,7 +16,8 @@ #include "testing_helpers.hpp" int main(int argc, char* argv[]) { - const int SIZE = 1 << 8; + //const int SIZE = 1 << 8; + const int SIZE = 1 << 3; const int NPOT = SIZE - 3; int a[SIZE], b[SIZE], c[SIZE]; @@ -120,4 +121,6 @@ int main(int argc, char* argv[]) { count = StreamCompaction::Efficient::compact(NPOT, c, a); //printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); + + while (1){}; // Just so I can see the output } diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index e600c29..185bb40 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -8,8 +8,10 @@ namespace CPU { * CPU scan (prefix sum). */ void scan(int n, int *odata, const int *idata) { - // TODO - printf("TODO\n"); + odata[0] = 0; + for (int i=1; i>= 1) { + ++lg; + } + return lg; +} + +inline int ilog2ceil(int x) { + return ilog2(x - 1) + 1; +} namespace StreamCompaction { namespace CPU { diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 3d86b60..c2efb3f 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -7,13 +7,53 @@ namespace StreamCompaction { namespace Naive { // TODO: __global__ +__global__ void kernScan(int n, int powd, int* odata, int* idata){ + int i = threadIdx.x; + //int powd = (int)pow(2,d); + + if (i < n){ + if(i >= powd){ + odata[i] = idata[i - powd] + idata[i]; + } else { + odata[i] = idata[i]; + } + } + +} /** * 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"); + + // Compute log-rounded n + int td = ilog2ceil(n); + int n2 = (int)pow(2,td); + + int n_size = n * sizeof(int); + int n2_size = n2 * sizeof(int); + + int* hst_idata2 = new int[n2](); + memcpy(hst_idata2, idata, n_size); + + // Scan + int* dev_idata; + int* dev_odata; + cudaMalloc((void**)&dev_idata, n2_size); + cudaMemcpy(dev_idata, hst_idata2, n2_size, cudaMemcpyHostToDevice); + cudaMalloc((void**)&dev_odata, n2_size); + + for(int d=0; d>>(n2, powd, dev_odata, dev_idata); + dev_idata = dev_odata; + } + + // Remove leftover (from the log-rounded portion) + // Do a shift right to make it an exclusive sum + odata[0] = 0; + cudaMemcpy(odata+1, dev_odata, n_size-sizeof(int), cudaMemcpyDeviceToHost); } } From 33da2d14ad3267367a9e3e668c13a075918fb504 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 10 Sep 2015 23:06:04 -0400 Subject: [PATCH 02/14] Added efficient scan --- src/main.cpp | 8 +++-- stream_compaction/efficient.cu | 56 ++++++++++++++++++++++++++++++++-- stream_compaction/naive.cu | 2 -- 3 files changed, 59 insertions(+), 7 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index e577c92..098320a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,8 +16,8 @@ #include "testing_helpers.hpp" int main(int argc, char* argv[]) { - //const int SIZE = 1 << 8; - const int SIZE = 1 << 3; + const int SIZE = 1 << 8; + //const int SIZE = 1 << 3; const int NPOT = SIZE - 3; int a[SIZE], b[SIZE], c[SIZE]; @@ -29,6 +29,7 @@ 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); @@ -86,7 +87,8 @@ int main(int argc, char* argv[]) { // Compaction tests genArray(SIZE - 1, a, 4); // Leave a 0 at the end to test that edge case - printArray(SIZE, a, true); + a[SIZE - 1] = 0; + printArray(SIZE, a, true); int count, expectedCount, expectedNPOT; diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index b2f739b..d97bef0 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -8,12 +8,64 @@ namespace Efficient { // TODO: __global__ +__global__ void upsweep(int n, int powd, int powd1, int* idata){ + int k = threadIdx.x; + + if (k < n){ + if (k % (powd1) == 0){ + idata[k + powd1 - 1] += idata[k + powd - 1]; + } + } +} + +__global__ void downsweep(int n, int powd, int powd1, int* idata){ + int k = threadIdx.x; + + if (k < n){ + if (k % (powd1) == 0){ + int t = idata[k + powd - 1]; + idata[k + powd - 1] = idata[k + powd1 - 1]; + idata[k + powd1 - 1] += t; + } + } +} + /** * 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"); + // Compute log-rounded n + int td = ilog2ceil(n); + int n2 = (int)pow(2,td); + + int n_size = n * sizeof(int); + int n2_size = n2 * sizeof(int); + + int* hst_idata2 = new int[n2](); + memcpy(hst_idata2, idata, n_size); + + // Scan + int* dev_idata; + cudaMalloc((void**)&dev_idata, n2_size); + cudaMemcpy(dev_idata, hst_idata2, n2_size, cudaMemcpyHostToDevice); + + int powd, powd1; + for(int d=0; d>>(n2, powd, powd1, dev_idata); + } + + cudaMemset((void*)&dev_idata[n2-1],0,sizeof(int)); + for(int d=td-1; d>=0; d--){ + powd = (int)pow(2,d); + powd1 = (int)pow(2,d+1); + downsweep<<<1,n2>>>(n2, powd, powd1, dev_idata); + } + + // Remove leftover (from the log-rounded portion) + // No need to shift in this one I guess? + cudaMemcpy(odata, dev_idata, n_size, cudaMemcpyDeviceToHost); } /** diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index c2efb3f..872aeda 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -25,8 +25,6 @@ __global__ void kernScan(int n, int powd, int* odata, int* idata){ * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { - // TODO - // Compute log-rounded n int td = ilog2ceil(n); int n2 = (int)pow(2,td); From 8eb45406f905a7222ba9c9b5ed1b26fe98d80e89 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 11 Sep 2015 01:40:59 -0400 Subject: [PATCH 03/14] Finished initial pass of the assignment, still need to optimize --- src/main.cpp | 12 +++---- stream_compaction/common.cu | 14 +++++++-- stream_compaction/efficient.cu | 57 ++++++++++++++++++++++++++++++++-- stream_compaction/thrust.cu | 16 ++++++++++ 4 files changed, 89 insertions(+), 10 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 283f2fc..c5090a5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,8 +16,8 @@ #include "testing_helpers.hpp" int main(int argc, char* argv[]) { - const int SIZE = 1 << 8; - //const int SIZE = 1 << 3; + //const int SIZE = 1 << 8; + const int SIZE = 1 << 3; const int NPOT = SIZE - 3; int a[SIZE], b[SIZE], c[SIZE]; @@ -70,13 +70,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"); @@ -115,13 +115,13 @@ int main(int argc, char* argv[]) { zeroArray(SIZE, c); printDesc("work-efficient compact, power-of-two"); count = StreamCompaction::Efficient::compact(SIZE, c, a); - //printArray(count, c, true); + printArray(count, c, true); printCmpLenResult(count, expectedCount, b, c); zeroArray(SIZE, c); printDesc("work-efficient compact, non-power-of-two"); count = StreamCompaction::Efficient::compact(NPOT, c, a); - //printArray(count, c, true); + printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); while (1){}; // Just so I can see the output diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index fe872d4..6ca964a 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -23,7 +23,11 @@ namespace Common { * which map to 0 will be removed, and elements which map to 1 will be kept. */ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { - // TODO + int k = threadIdx.x; + + if (k < n){ + bools[k] = !!idata[k]; + } } /** @@ -32,7 +36,13 @@ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { */ __global__ void kernScatter(int n, int *odata, const int *idata, const int *bools, const int *indices) { - // TODO + int k = threadIdx.x; + + if (k < n){ + if (bools[k] == 1){ + odata[indices[k]] = idata[k]; + } + } } } diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index d97bef0..957d7c6 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -30,6 +30,24 @@ __global__ void downsweep(int n, int powd, int powd1, int* idata){ } } +__global__ void nonzero(int n, int* odata, const int* idata){ + int k = threadIdx.x; + + if (k < n){ + odata[k] = !!idata[k]; + } +} + +__global__ void scatter(int n, int* odata, const int* idata, const int* nz, const int* scan){ + int k = threadIdx.x; + + if (k < n){ + if (nz[k] == 1){ + odata[scan[k]] = idata[k]; + } + } +} + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ @@ -78,8 +96,43 @@ void scan(int n, int *odata, const int *idata) { * @returns The number of elements remaining after compaction. */ int compact(int n, int *odata, const int *idata) { - // TODO - return -1; + int n_size = n*sizeof(int); + int on = -1; + + // Nonzero + int* dev_nz; + int* dev_idata; + int* hst_nz = (int*)malloc(n_size); + + cudaMalloc((void**)&dev_nz, n_size); + cudaMalloc((void**)&dev_idata, n_size); + + cudaMemcpy(dev_idata, idata, n_size, cudaMemcpyHostToDevice); + + //nonzero<<<1,n>>>(n, dev_nz, dev_idata); + StreamCompaction::Common::kernMapToBoolean<<<1,n>>>(n, dev_nz, dev_idata); + + // TODO: technically only need the last element here + cudaMemcpy(hst_nz, dev_nz, n_size, cudaMemcpyDeviceToHost); + + // Scan + int* hst_scan = (int*)malloc(n_size); + scan(n, hst_scan, hst_nz); + on = hst_scan[n-1] + hst_nz[n-1]; + + // Scatter + int* dev_scan; + int* dev_odata; + cudaMalloc((void**)&dev_scan, n_size); + cudaMalloc((void**)&dev_odata, n_size); + cudaMemcpy(dev_scan, hst_scan, n_size, cudaMemcpyHostToDevice); + + //scatter<<<1,n>>>(n, dev_odata, dev_idata, dev_nz, dev_scan); + StreamCompaction::Common::kernScatter<<<1,n>>>(n, dev_odata, dev_idata, dev_nz, dev_scan); + + cudaMemcpy(odata, dev_odata, n_size, cudaMemcpyDeviceToHost); + + return on; } } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index d8dbb32..e176f16 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -16,6 +16,22 @@ 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_v_in(idata,idata+n); + thrust::device_vector v_in = hst_v_in; + thrust::device_vector v_out(n); + thrust::exclusive_scan(v_in.begin(), v_in.end(), v_in.begin()); + + thrust::host_vector hst_v_out = v_in; + + for (int i=0; i Date: Sat, 12 Sep 2015 22:49:57 -0400 Subject: [PATCH 04/14] Modified to handle more than 1024 elements --- src/main.cpp | 16 ++++++++-------- stream_compaction/common.cu | 4 ++-- stream_compaction/common.h | 2 ++ stream_compaction/efficient.cu | 21 +++++++++++++-------- stream_compaction/naive.cu | 33 +++++++++++++++++++++++---------- stream_compaction/thrust.cu | 9 +-------- 6 files changed, 49 insertions(+), 36 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index c5090a5..22b457c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,8 +16,8 @@ #include "testing_helpers.hpp" int main(int argc, char* argv[]) { - //const int SIZE = 1 << 8; - const int SIZE = 1 << 3; + const int SIZE = 1 << 9; + //const int SIZE = 1 << 3; const int NPOT = SIZE - 3; int a[SIZE], b[SIZE], c[SIZE]; @@ -46,25 +46,25 @@ 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); printDesc("work-efficient scan, power-of-two"); StreamCompaction::Efficient::scan(SIZE, c, a); - //printArray(SIZE, c, true); + printArray(SIZE, c, true); printCmpResult(SIZE, b, c); zeroArray(SIZE, c); printDesc("work-efficient scan, non-power-of-two"); StreamCompaction::Efficient::scan(NPOT, c, a); - //printArray(NPOT, c, true); + printArray(NPOT, c, true); printCmpResult(NPOT, b, c); zeroArray(SIZE, c); @@ -78,7 +78,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"); @@ -121,7 +121,7 @@ int main(int argc, char* argv[]) { zeroArray(SIZE, c); printDesc("work-efficient compact, non-power-of-two"); count = StreamCompaction::Efficient::compact(NPOT, c, a); - printArray(count, c, true); + //printArray(count, c, true); printCmpLenResult(count, expectedNPOT, b, c); while (1){}; // Just so I can see the output diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 6ca964a..e5d4dfc 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -23,7 +23,7 @@ namespace Common { * which map to 0 will be removed, and elements which map to 1 will be kept. */ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { - int k = threadIdx.x; + int k = threadIdx.x + (blockIdx.x * blockDim.x); if (k < n){ bools[k] = !!idata[k]; @@ -36,7 +36,7 @@ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { */ __global__ void kernScatter(int n, int *odata, const int *idata, const int *bools, const int *indices) { - int k = threadIdx.x; + int k = threadIdx.x + (blockIdx.x * blockDim.x); if (k < n){ if (bools[k] == 1){ diff --git a/stream_compaction/common.h b/stream_compaction/common.h index 4f52663..177b7c5 100644 --- a/stream_compaction/common.h +++ b/stream_compaction/common.h @@ -7,6 +7,8 @@ #define FILENAME (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) #define checkCUDAError(msg) checkCUDAErrorFn(msg, FILENAME, __LINE__) +#define MAXTHREADS 1024 + /** * 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 957d7c6..2fd6ca0 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -9,7 +9,7 @@ namespace Efficient { // TODO: __global__ __global__ void upsweep(int n, int powd, int powd1, int* idata){ - int k = threadIdx.x; + int k = threadIdx.x + (blockIdx.x * blockDim.x); if (k < n){ if (k % (powd1) == 0){ @@ -19,7 +19,7 @@ __global__ void upsweep(int n, int powd, int powd1, int* idata){ } __global__ void downsweep(int n, int powd, int powd1, int* idata){ - int k = threadIdx.x; + int k = threadIdx.x + (blockIdx.x * blockDim.x); if (k < n){ if (k % (powd1) == 0){ @@ -31,7 +31,7 @@ __global__ void downsweep(int n, int powd, int powd1, int* idata){ } __global__ void nonzero(int n, int* odata, const int* idata){ - int k = threadIdx.x; + int k = threadIdx.x + (blockIdx.x * blockDim.x); if (k < n){ odata[k] = !!idata[k]; @@ -39,7 +39,7 @@ __global__ void nonzero(int n, int* odata, const int* idata){ } __global__ void scatter(int n, int* odata, const int* idata, const int* nz, const int* scan){ - int k = threadIdx.x; + int k = threadIdx.x + (blockIdx.x * blockDim.x); if (k < n){ if (nz[k] == 1){ @@ -56,6 +56,8 @@ void scan(int n, int *odata, const int *idata) { int td = ilog2ceil(n); int n2 = (int)pow(2,td); + int numBlocks = (n2 - 1) / MAXTHREADS + 1; + int n_size = n * sizeof(int); int n2_size = n2 * sizeof(int); @@ -71,14 +73,14 @@ void scan(int n, int *odata, const int *idata) { for(int d=0; d>>(n2, powd, powd1, dev_idata); + upsweep<<>>(n2, powd, powd1, dev_idata); } cudaMemset((void*)&dev_idata[n2-1],0,sizeof(int)); for(int d=td-1; d>=0; d--){ powd = (int)pow(2,d); powd1 = (int)pow(2,d+1); - downsweep<<<1,n2>>>(n2, powd, powd1, dev_idata); + downsweep<<>>(n2, powd, powd1, dev_idata); } // Remove leftover (from the log-rounded portion) @@ -97,6 +99,7 @@ void scan(int n, int *odata, const int *idata) { */ int compact(int n, int *odata, const int *idata) { int n_size = n*sizeof(int); + int numBlocks = (n - 1) / MAXTHREADS + 1; int on = -1; // Nonzero @@ -110,7 +113,8 @@ int compact(int n, int *odata, const int *idata) { cudaMemcpy(dev_idata, idata, n_size, cudaMemcpyHostToDevice); //nonzero<<<1,n>>>(n, dev_nz, dev_idata); - StreamCompaction::Common::kernMapToBoolean<<<1,n>>>(n, dev_nz, dev_idata); + StreamCompaction::Common::kernMapToBoolean<<>>(n, dev_nz, dev_idata); + cudaDeviceSynchronize(); // TODO: technically only need the last element here cudaMemcpy(hst_nz, dev_nz, n_size, cudaMemcpyDeviceToHost); @@ -128,7 +132,8 @@ int compact(int n, int *odata, const int *idata) { cudaMemcpy(dev_scan, hst_scan, n_size, cudaMemcpyHostToDevice); //scatter<<<1,n>>>(n, dev_odata, dev_idata, dev_nz, dev_scan); - StreamCompaction::Common::kernScatter<<<1,n>>>(n, dev_odata, dev_idata, dev_nz, dev_scan); + StreamCompaction::Common::kernScatter<<>>(n, dev_odata, dev_idata, dev_nz, dev_scan); + cudaDeviceSynchronize(); cudaMemcpy(odata, dev_odata, n_size, cudaMemcpyDeviceToHost); diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 872aeda..72f5c38 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -8,17 +8,16 @@ namespace Naive { // TODO: __global__ __global__ void kernScan(int n, int powd, int* odata, int* idata){ - int i = threadIdx.x; + int i = threadIdx.x + (blockIdx.x * blockDim.x); //int powd = (int)pow(2,d); if (i < n){ - if(i >= powd){ + if (i >= powd){ odata[i] = idata[i - powd] + idata[i]; } else { odata[i] = idata[i]; } } - } /** @@ -26,25 +25,39 @@ __global__ void kernScan(int n, int powd, int* odata, int* idata){ */ void scan(int n, int *odata, const int *idata) { // Compute log-rounded n + int td = ilog2ceil(n); int n2 = (int)pow(2,td); int n_size = n * sizeof(int); int n2_size = n2 * sizeof(int); - int* hst_idata2 = new int[n2](); - memcpy(hst_idata2, idata, n_size); - // Scan int* dev_idata; int* dev_odata; + cudaMalloc((void**)&dev_idata, n2_size); - cudaMemcpy(dev_idata, hst_idata2, n2_size, cudaMemcpyHostToDevice); cudaMalloc((void**)&dev_odata, n2_size); + cudaMemcpy(dev_idata, idata, n_size, cudaMemcpyHostToDevice); + cudaMemset(dev_idata+n, 0, n2_size-n_size); + + int numBlocks = (n2-1) / MAXTHREADS + 1; + + for(int d=1; d<=td; d++){ + int powd = 1 << (d-1); + //cudaSetDeviceFlags(cudaDeviceScheduleBlockingSync); + kernScan<<>>(n2, powd, dev_odata, dev_idata); + //cudaDeviceSynchronize(); + cudaThreadSynchronize(); - for(int d=0; d>>(n2, powd, dev_odata, dev_idata); + //cudaMemcpy(odata,dev_odata,2,cudaMemcpyDeviceToHost); + //odata[0] = 0; + //cudaMemcpy(odata + 1, dev_odata, n_size - sizeof(int), cudaMemcpyDeviceToHost); + //printf("Yeah...\n"); + //for (int i = 1024; i < n; i++){ + // printf("%d ", odata[i]); + //} + //printf("\n\n"); dev_idata = dev_odata; } diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index e176f16..7367fd1 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -24,14 +24,7 @@ void scan(int n, int *odata, const int *idata) { thrust::host_vector hst_v_out = v_in; - for (int i=0; i Date: Sun, 13 Sep 2015 10:22:33 -0400 Subject: [PATCH 05/14] Everything now seems to be fully working --- src/main.cpp | 2 +- stream_compaction/efficient.cu | 18 ------------------ stream_compaction/naive.cu | 14 ++------------ 3 files changed, 3 insertions(+), 31 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 22b457c..ab32eef 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,7 +16,7 @@ #include "testing_helpers.hpp" int main(int argc, char* argv[]) { - const int SIZE = 1 << 9; + const int SIZE = 1 << 15; //const int SIZE = 1 << 3; const int NPOT = SIZE - 3; int a[SIZE], b[SIZE], c[SIZE]; diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 2fd6ca0..1fb242f 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -30,24 +30,6 @@ __global__ void downsweep(int n, int powd, int powd1, int* idata){ } } -__global__ void nonzero(int n, int* odata, const int* idata){ - int k = threadIdx.x + (blockIdx.x * blockDim.x); - - if (k < n){ - odata[k] = !!idata[k]; - } -} - -__global__ void scatter(int n, int* odata, const int* idata, const int* nz, const int* scan){ - int k = threadIdx.x + (blockIdx.x * blockDim.x); - - if (k < n){ - if (nz[k] == 1){ - odata[scan[k]] = idata[k]; - } - } -} - /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 72f5c38..5b9d4ce 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -35,6 +35,7 @@ void scan(int n, int *odata, const int *idata) { // Scan int* dev_idata; int* dev_odata; + int* tmp; cudaMalloc((void**)&dev_idata, n2_size); cudaMalloc((void**)&dev_odata, n2_size); @@ -45,20 +46,9 @@ void scan(int n, int *odata, const int *idata) { for(int d=1; d<=td; d++){ int powd = 1 << (d-1); - //cudaSetDeviceFlags(cudaDeviceScheduleBlockingSync); kernScan<<>>(n2, powd, dev_odata, dev_idata); - //cudaDeviceSynchronize(); cudaThreadSynchronize(); - - //cudaMemcpy(odata,dev_odata,2,cudaMemcpyDeviceToHost); - //odata[0] = 0; - //cudaMemcpy(odata + 1, dev_odata, n_size - sizeof(int), cudaMemcpyDeviceToHost); - //printf("Yeah...\n"); - //for (int i = 1024; i < n; i++){ - // printf("%d ", odata[i]); - //} - //printf("\n\n"); - dev_idata = dev_odata; + cudaMemcpy(dev_idata, dev_odata, n2_size, cudaMemcpyDeviceToDevice); } // Remove leftover (from the log-rounded portion) From 6a515e4daa9d201fed33f415ff7f012f43bf72e9 Mon Sep 17 00:00:00 2001 From: Levi Cai Date: Sun, 13 Sep 2015 10:30:39 -0400 Subject: [PATCH 06/14] Removed unused tmp line --- stream_compaction/naive.cu | 1 - 1 file changed, 1 deletion(-) diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 5b9d4ce..42d2fe7 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -35,7 +35,6 @@ void scan(int n, int *odata, const int *idata) { // Scan int* dev_idata; int* dev_odata; - int* tmp; cudaMalloc((void**)&dev_idata, n2_size); cudaMalloc((void**)&dev_odata, n2_size); From c006304a98fa0e9737a81421eb0b67b9418f5660 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 13 Sep 2015 16:03:02 -0400 Subject: [PATCH 07/14] Added performance metrics --- src/main.cpp | 2 +- stream_compaction/cpu.cu | 39 +++++++++++++++++++++++++++++ stream_compaction/efficient.cu | 45 +++++++++++++++++++++++++--------- stream_compaction/naive.cu | 18 ++++++++++---- stream_compaction/thrust.cu | 16 +++++++++++- 5 files changed, 101 insertions(+), 19 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index ab32eef..7cedda2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,7 +16,7 @@ #include "testing_helpers.hpp" int main(int argc, char* argv[]) { - const int SIZE = 1 << 15; + const int SIZE = 1 << 16; //const int SIZE = 1 << 3; 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 185bb40..cedfda7 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -1,5 +1,7 @@ #include #include "cpu.h" +#include +#include namespace StreamCompaction { namespace CPU { @@ -8,10 +10,23 @@ 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); + odata[0] = 0; for (int i=1; i>>(n2, powd, powd1, dev_idata); } + cudaEventRecord(stop); + cudaEventSynchronize(stop); + float ms = 0; + cudaEventElapsedTime(&ms, start, stop); + printf("efficient scan time (s): %f\n",ms/1000.0); + // Remove leftover (from the log-rounded portion) // No need to shift in this one I guess? cudaMemcpy(odata, dev_idata, n_size, cudaMemcpyDeviceToHost); @@ -84,17 +95,27 @@ int compact(int n, int *odata, const int *idata) { int numBlocks = (n - 1) / MAXTHREADS + 1; int on = -1; - // Nonzero + // Initialize memory + int* hst_nz = (int*)malloc(n_size); + int* dev_nz; int* dev_idata; - int* hst_nz = (int*)malloc(n_size); - + int* dev_scan; + int* dev_odata; + cudaMalloc((void**)&dev_nz, n_size); cudaMalloc((void**)&dev_idata, n_size); - + cudaMalloc((void**)&dev_scan, n_size); + cudaMalloc((void**)&dev_odata, n_size); + + // Nonzero cudaMemcpy(dev_idata, idata, n_size, cudaMemcpyHostToDevice); - //nonzero<<<1,n>>>(n, dev_nz, dev_idata); + cudaEvent_t start, stop; + cudaEventCreate(&start); + cudaEventCreate(&stop); + cudaEventRecord(start); + StreamCompaction::Common::kernMapToBoolean<<>>(n, dev_nz, dev_idata); cudaDeviceSynchronize(); @@ -107,16 +128,16 @@ int compact(int n, int *odata, const int *idata) { on = hst_scan[n-1] + hst_nz[n-1]; // Scatter - int* dev_scan; - int* dev_odata; - cudaMalloc((void**)&dev_scan, n_size); - cudaMalloc((void**)&dev_odata, n_size); cudaMemcpy(dev_scan, hst_scan, n_size, cudaMemcpyHostToDevice); - - //scatter<<<1,n>>>(n, dev_odata, dev_idata, dev_nz, dev_scan); StreamCompaction::Common::kernScatter<<>>(n, dev_odata, dev_idata, dev_nz, dev_scan); cudaDeviceSynchronize(); + cudaEventRecord(stop); + cudaEventSynchronize(stop); + float ms = 0; + cudaEventElapsedTime(&ms, start, stop); + printf("efficient compact time (s): %f\n",ms/1000.0); + cudaMemcpy(odata, dev_odata, n_size, cudaMemcpyDeviceToHost); return on; diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 42d2fe7..eaab4fe 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -24,15 +24,14 @@ __global__ void kernScan(int n, int powd, int* odata, int* idata){ * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { - // Compute log-rounded n - + // Initialize int td = ilog2ceil(n); int n2 = (int)pow(2,td); + int numBlocks = (n2-1) / MAXTHREADS + 1; int n_size = n * sizeof(int); int n2_size = n2 * sizeof(int); - // Scan int* dev_idata; int* dev_odata; @@ -40,15 +39,24 @@ void scan(int n, int *odata, const int *idata) { cudaMalloc((void**)&dev_odata, n2_size); cudaMemcpy(dev_idata, idata, n_size, cudaMemcpyHostToDevice); cudaMemset(dev_idata+n, 0, n2_size-n_size); - - int numBlocks = (n2-1) / MAXTHREADS + 1; + cudaEvent_t start, stop; + cudaEventCreate(&start); + cudaEventCreate(&stop); + + // Scan + cudaEventRecord(start); for(int d=1; d<=td; d++){ int powd = 1 << (d-1); kernScan<<>>(n2, powd, dev_odata, dev_idata); cudaThreadSynchronize(); cudaMemcpy(dev_idata, dev_odata, n2_size, cudaMemcpyDeviceToDevice); } + cudaEventRecord(stop); + cudaEventSynchronize(stop); + float ms = 0; + cudaEventElapsedTime(&ms, start, stop); + printf("naive time(s): %f\n", ms/1000.0); // Remove leftover (from the log-rounded portion) // Do a shift right to make it an exclusive sum diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 7367fd1..a15b6ad 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -17,13 +17,27 @@ void scan(int n, int *odata, const int *idata) { // example: for device_vectors dv_in and dv_out: // thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); + // Initialize thrust::host_vector hst_v_in(idata,idata+n); thrust::device_vector v_in = hst_v_in; thrust::device_vector v_out(n); + + cudaEvent_t start, stop; + cudaEventCreate(&start); + cudaEventCreate(&stop); + + cudaEventRecord(start); + + // Scan thrust::exclusive_scan(v_in.begin(), v_in.end(), v_in.begin()); - thrust::host_vector hst_v_out = v_in; + cudaEventRecord(stop); + cudaEventSynchronize(stop); + float ms = 0; + cudaEventElapsedTime(&ms, start, stop); + printf("thrust time (s): %f\n",ms/1000.0); + thrust::host_vector hst_v_out = v_in; memcpy(odata,hst_v_out.data(),n*sizeof(int)); } From 93766de26800e9905ca4d64429172b7bdb596f25 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 13 Sep 2015 16:29:11 -0400 Subject: [PATCH 08/14] Added comparison images --- images/2_15_results.PNG | Bin 0 -> 37343 bytes images/comparison.PNG | Bin 0 -> 20173 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/2_15_results.PNG create mode 100644 images/comparison.PNG diff --git a/images/2_15_results.PNG b/images/2_15_results.PNG new file mode 100644 index 0000000000000000000000000000000000000000..30a4fde56a4ee048ea0695317be71dc79af85157 GIT binary patch literal 37343 zcmeFZdsvfawmuxEt+pd0wT^Wd720~h@c>gOAcw%TRcVV#v0}<8v=xZuXbljO5aQHM zsr5h+B?W|7D53-sB?e4Lh?cerF-Z|g42J+C5JE@-gd~uVX zec%40RNj#H@Vw8no_pQ*z1GQh_lN)H*T4TY3WfU3+i&eUfI|K11Pb-kGtVxCBd${m z4*1^^{DJT{P)x}>HT?24?)81Iqfpn2mM?tx4E+Aw(YIpoDAbB}obVCgXU@0$&WS?KL~Cfe(Ck4oBsUrJMUh4_UQA9Kfm$ijsxq;(T8#Z zh8|wq6khbv({Ftm((%-D9VMtGeh**Y_`^5fU;RVzZ-2O|Iyw0bFOA7F%PQ;lOWJY{ zeKL?EpGA}D0`q)jz@OJh=9$viLA`yzVnip}>oa?bCMAK85q3k<|W(jz6_K7NLPXL;_`)081P!fb8JS)9N& zRK{9IF;<#aBvMQ{dlTie#(jx~*|bj9_L{ZJaYJdhGEByxhg|-^tpDz zS!vg_Zkjtt?D7y;M*tLE&Q(jJf7VO*XeR0Qr>HJDo_*!ktW!$TL6=e@)pHd$DhTeEO zP*bCtu8Qdvbltnk6fV`59d8}sIw;TZxoK0A^F$2aW4Do_+g$fu;Tm06VFt?{ssGA=Se(iOlTNpd` z91UXC@e1FBrNWM6D@JtG`A7S@!@TDvg@5|a`GIL~*y;t@n~SIW*m8BKrHFPL z{(IfNe53OUeXe0U^HpypE~U=XsPk?ge?*B(L!pkodHK{Ofy@4pPoGct?OlED3b^&p z1TMW1zsfvi-3L#pV}=P_3a0u!Ub^b_+z26f8Qd)l!BS6)&k^ru8?w@V1K+sYa(2z_ zj<_*TfUEm6_Xxlim{AN�mY?D>Xp99-j+rB~p(q9nk5 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 Date: Sun, 13 Sep 2015 17:04:51 -0400 Subject: [PATCH 09/14] Update README.md --- README.md | 170 ++---------------------------------------------------- 1 file changed, 4 insertions(+), 166 deletions(-) diff --git a/README.md b/README.md index a82ea0f..a427e6d 100644 --- a/README.md +++ b/README.md @@ -3,175 +3,13 @@ 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. +* Levi Cai +* Tested on: Windows 7, i7 @ 3.4GHz 16GB, Nvidia NVS 310 (Moore 100C Lab) ### Questions +![](images/comparison.PNG) + * 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!) From aeac1f25c58066fe5b192175284f4a9f80c3b963 Mon Sep 17 00:00:00 2001 From: Levi Cai Date: Sun, 13 Sep 2015 17:15:49 -0400 Subject: [PATCH 10/14] Update README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index a427e6d..7bccd4e 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,15 @@ CUDA Stream Compaction ![](images/comparison.PNG) +Above you can see the comparison between the run-times of all the different algorithms. Any initial and final cudamemcpy/malloc's are NOT included, however, any intermediate ones ARE, which is I believe a fairly large contributor to the fact that the algorithms are in general slower than the CPU implementation. I also believe that the array sizes are relatively small, so perhaps the overhead of launching CUDA programs out-weighs the parallelization (though I'm not certain about this to be honest). + +In terms of the GPU implementations, the work-efficient algorithm is in general an order of magnitude faster than the naive version. This is most likely because of the necessary overhead of the sequential nature and increased number of operations of the algorithm in addition to the extra cudaMemcpy call in each iteration at each depth in my implementation. + +One thing to note is the Thrust (1) and Thrust (2). I noticed that the first thrust run in a single session took much longer than the second run (1st for a power-of-two and 2nd for a non-power-of-two), I am wondering if it is perhaps caching somewhere. + +Sample output: +![](images/2_15.PNG) + * 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!) From 4b9eb4b87a951a15e21aaf6be2d8448b21357ac4 Mon Sep 17 00:00:00 2001 From: Levi Cai Date: Sun, 13 Sep 2015 17:16:20 -0400 Subject: [PATCH 11/14] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7bccd4e..93d9bf9 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ In terms of the GPU implementations, the work-efficient algorithm is in general One thing to note is the Thrust (1) and Thrust (2). I noticed that the first thrust run in a single session took much longer than the second run (1st for a power-of-two and 2nd for a non-power-of-two), I am wondering if it is perhaps caching somewhere. Sample output: -![](images/2_15.PNG) +![](images/2_15_results.PNG) * Roughly optimize the block sizes of each of your implementations for minimal run time on your GPU. From 4c3752214dd0d3c56c008c84fb08b24f5a98fe9c Mon Sep 17 00:00:00 2001 From: Levi Cai Date: Sun, 13 Sep 2015 17:21:23 -0400 Subject: [PATCH 12/14] Update README.md --- README.md | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/README.md b/README.md index 93d9bf9..2b626ef 100644 --- a/README.md +++ b/README.md @@ -17,32 +17,9 @@ In terms of the GPU implementations, the work-efficient algorithm is in general One thing to note is the Thrust (1) and Thrust (2). I noticed that the first thrust run in a single session took much longer than the second run (1st for a power-of-two and 2nd for a non-power-of-two), I am wondering if it is perhaps caching somewhere. Sample output: + ![](images/2_15_results.PNG) -* 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 From 59814748d932e9f0d5d5ac9802c6e3696035ab94 Mon Sep 17 00:00:00 2001 From: Levi Cai Date: Sun, 13 Sep 2015 22:54:32 -0400 Subject: [PATCH 13/14] Added radix sort --- images/radix.PNG | Bin 0 -> 6575 bytes images/timeline.PNG | Bin 0 -> 182664 bytes src/main.cpp | 19 +++- stream_compaction/CMakeLists.txt | 2 + stream_compaction/efficient.cu | 2 +- stream_compaction/radix.cu | 147 +++++++++++++++++++++++++++++++ stream_compaction/radix.h | 14 +++ 7 files changed, 179 insertions(+), 5 deletions(-) create mode 100644 images/radix.PNG create mode 100644 images/timeline.PNG create mode 100644 stream_compaction/radix.cu create mode 100644 stream_compaction/radix.h diff --git a/images/radix.PNG b/images/radix.PNG new file mode 100644 index 0000000000000000000000000000000000000000..35dc591cfc0e5ab947083f2a9534082ec31f89cc GIT binary patch literal 6575 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 literal 0 HcmV?d00001 diff --git a/images/timeline.PNG b/images/timeline.PNG new file mode 100644 index 0000000000000000000000000000000000000000..426af51357a58dabdb5fe24dcb1e6e63c037e3b7 GIT binary patch literal 182664 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 z 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

8KJ3Z9o*!ygzS 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

Elc1*u$0=*dTJ)f9Op@w(4i#$_M!#1qBu6 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 R9$o@(GE$09iXI!k`Cmr*M@s+z literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp index 7cedda2..3b7b8c5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,16 +13,16 @@ #include #include #include +#include #include "testing_helpers.hpp" int main(int argc, char* argv[]) { - const int SIZE = 1 << 16; + const int SIZE = 1 << 11; //const int SIZE = 1 << 3; const int NPOT = SIZE - 3; int a[SIZE], b[SIZE], c[SIZE]; // Scan tests - printf("\n"); printf("****************\n"); printf("** SCAN TESTS **\n"); @@ -30,7 +30,19 @@ int main(int argc, char* argv[]) { genArray(SIZE - 1, a, 50); // Leave a 0 at the end to test that edge case a[SIZE - 1] = 0; - printArray(SIZE, a, true); + //printArray(SIZE, a, true); + + printDesc("Radix sort"); + StreamCompaction::Radix::sort(SIZE, b, a); + printArray(SIZE, a, true); + printArray(SIZE, b, true); + + printDesc("Radix sort mini test"); + int x[8] = {4, 3, 2, 7, 6, 22, 38, 0}; + int y[8]; + StreamCompaction::Radix::sort(8, y, x); + printArray(8, x, true); + printArray(8, y, true); zeroArray(SIZE, b); printDesc("cpu scan, power-of-two"); @@ -85,7 +97,6 @@ int main(int argc, char* argv[]) { printf("*****************************\n"); // Compaction tests - genArray(SIZE - 1, a, 4); // Leave a 0 at the end to test that edge case a[SIZE - 1] = 0; printArray(SIZE, a, true); diff --git a/stream_compaction/CMakeLists.txt b/stream_compaction/CMakeLists.txt index cdbef77..bcc484e 100644 --- a/stream_compaction/CMakeLists.txt +++ b/stream_compaction/CMakeLists.txt @@ -9,6 +9,8 @@ set(SOURCE_FILES "efficient.cu" "thrust.h" "thrust.cu" + "radix.h" + "radix.cu" ) cuda_add_library(stream_compaction diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 6593ea9..17f5c94 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -74,7 +74,7 @@ void scan(int n, int *odata, const int *idata) { cudaEventSynchronize(stop); float ms = 0; cudaEventElapsedTime(&ms, start, stop); - printf("efficient scan time (s): %f\n",ms/1000.0); + //printf("efficient scan time (s): %f\n",ms/1000.0); // Remove leftover (from the log-rounded portion) // No need to shift in this one I guess? diff --git a/stream_compaction/radix.cu b/stream_compaction/radix.cu new file mode 100644 index 0000000..b1c8721 --- /dev/null +++ b/stream_compaction/radix.cu @@ -0,0 +1,147 @@ +#include "radix.h" +#include "common.h" +#include "efficient.h" +#include +#include + +namespace StreamCompaction { +namespace Radix { + +/** + * Maps an array to an array of 0s and 1s for stream compaction. Elements + * which map to 0 will be removed, and elements which map to 1 will be kept. + */ +__global__ void kernMapToBits(int n, int bit, int *bools, const int *idata) { + int k = threadIdx.x + (blockIdx.x * blockDim.x); + + if (k < n){ + int b = 1 << bit; + bools[k] = (b & idata[k]) >> bit; + } +} + +__global__ void kernNegate(int n, int* odata, const int* idata){ + int k = threadIdx.x + (blockIdx.x * blockDim.x); + + if (k < n){ + odata[k] = !idata[k]; + } +} + +__global__ void kernSumFalses(int n, int totalFalses, int* odata, const int* idata){ + int k = threadIdx.x + (blockIdx.x * blockDim.x); + + if (k < n){ + odata[k] = k - idata[k] + totalFalses; + } +} + +__global__ void kernMux(int n, int* odata, const int* bdata, const int* tdata, const int* fdata){ + int k = threadIdx.x + (blockIdx.x * blockDim.x); + + if (k < n){ + odata[k] = bdata[k] ? tdata[k] : fdata[k]; + } +} + +__global__ void kernScatter(int n, int *odata, + const int *idata, const int *indices) { + int k = threadIdx.x + (blockIdx.x * blockDim.x); + + if (k < n){ + odata[indices[k]] = idata[k]; + } +} + +void split(int n, int bit, int* odata, int* idata){ + int numBlocks = (n - 1) / MAXTHREADS + 1; + int n_size = n * sizeof(int); + + int* hst_e; + int* hst_f; + int* dev_idata; + int* dev_odata; + int* dev_b; + int* dev_e; + int* dev_f; + int* dev_t; + int* dev_d; + int totalFalses; + + hst_e = (int*)malloc(n_size); + hst_f = (int*)malloc(n_size); + cudaMalloc((void**)&dev_idata, n_size); + cudaMalloc((void**)&dev_odata, n_size); + cudaMalloc((void**)&dev_b, n_size); + cudaMalloc((void**)&dev_e, n_size); + cudaMalloc((void**)&dev_f, n_size); + cudaMalloc((void**)&dev_t, n_size); + cudaMalloc((void**)&dev_d, n_size); + + cudaMemcpy(dev_idata, idata, n_size, cudaMemcpyHostToDevice); + + // b - get bits + kernMapToBits<<>>(n, bit, dev_b, dev_idata); + cudaDeviceSynchronize(); + + int* hst_b = (int*)malloc(n_size); + + // e - negate bits + kernNegate<<>>(n, dev_e, dev_b); + cudaDeviceSynchronize(); + + // f - exclusive scan on e + cudaMemcpy(hst_e, dev_e, n_size, cudaMemcpyDeviceToHost); + StreamCompaction::Efficient::scan(n, hst_f, hst_e); + cudaMemcpy(dev_f, hst_f, n_size, cudaMemcpyHostToDevice); + cudaDeviceSynchronize(); + + // t - t[i] = i - f[i] + totalFalses + int en1; + cudaMemcpy(&en1, dev_e + (n - 1), sizeof(int), cudaMemcpyDeviceToHost); + totalFalses = en1 + hst_f[n - 1]; + kernSumFalses<<>>(n, totalFalses, dev_t, dev_f); + cudaDeviceSynchronize(); + + // d - d[i] = b[i] ? t[i] : f[i] + kernMux<<>>(n, dev_d, dev_b, dev_t, dev_f); + cudaDeviceSynchronize(); + + // scatter idata according to d + kernScatter<<>>(n, dev_odata, dev_idata, dev_d); + cudaDeviceSynchronize(); + + cudaMemcpy(odata, dev_odata, n_size, cudaMemcpyDeviceToHost); +} + +void sort(int n, int* odata, const int* idata){ + int numBits = 8 * sizeof(int); //TODO: probably only need log size of largest int in the array + int n_size = n*sizeof(int); + + int* hst_idata = (int*)malloc(n_size); + int* hst_odata = (int*)malloc(n_size); + int* tmp; + memcpy(hst_idata, idata, n_size); + + cudaEvent_t start, stop; + cudaEventCreate(&start); + cudaEventCreate(&stop); + cudaEventRecord(start); + + for (int i = 0; i < numBits; i++){ + split(n, i, hst_odata, hst_idata); + cudaDeviceSynchronize(); + memcpy(hst_idata, hst_odata, n_size); + } + + cudaEventRecord(stop); + cudaEventSynchronize(stop); + float ms = 0; + cudaEventElapsedTime(&ms, start, stop); + printf("radix sort time (s): %f\n", ms / 1000.0); + + memcpy(odata, hst_odata, n_size); +} + +} +} diff --git a/stream_compaction/radix.h b/stream_compaction/radix.h new file mode 100644 index 0000000..bea7a3f --- /dev/null +++ b/stream_compaction/radix.h @@ -0,0 +1,14 @@ +#pragma once + +#include +#include +#include + +#define MAXTHREADS 1024 + +namespace StreamCompaction { +namespace Radix { + void split(int n, int bit, int* odata, int* idata); + void sort(int n, int* odata, const int* idata); +} +} From 23a7b31d0df9029942e62462f920f4172ce1ff6b Mon Sep 17 00:00:00 2001 From: Levi Cai Date: Sun, 13 Sep 2015 23:08:56 -0400 Subject: [PATCH 14/14] Update README.md --- README.md | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 2b626ef..87cab1d 100644 --- a/README.md +++ b/README.md @@ -14,24 +14,18 @@ Above you can see the comparison between the run-times of all the different algo In terms of the GPU implementations, the work-efficient algorithm is in general an order of magnitude faster than the naive version. This is most likely because of the necessary overhead of the sequential nature and increased number of operations of the algorithm in addition to the extra cudaMemcpy call in each iteration at each depth in my implementation. -One thing to note is the Thrust (1) and Thrust (2). I noticed that the first thrust run in a single session took much longer than the second run (1st for a power-of-two and 2nd for a non-power-of-two), I am wondering if it is perhaps caching somewhere. +One thing to note is the Thrust (1) and Thrust (2). I noticed that the first thrust run in a single session took much longer than the second run (1st for a power-of-two and 2nd for a non-power-of-two), I am wondering if it is perhaps caching somewhere. It is clear that it is doing some kind of memory allocation from the timeline (session only contained a run from thrust): -Sample output: +![](images/timeline.PNG) + +Overall sample output: ![](images/2_15_results.PNG) +## Radix Sort -## Submit +Sample radix output with tests: -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. +![](images/radix.PNG) -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. +In terms of performance of the radix sort, it seems to be consistently ~0.05s regardless of the size of the array. I'm not sure why this is the case, as I do have several memcpy's in the implementation which I would expect to slow it down dramatically as the size of the array increases. Though perhaps this is an issue with cudaTiming on CPU malloc's vs. cudaMallocs, as there are few cudaMalloc's in my implementation.