Difference between revisions of "GPU610 Team Tsubame"
Yanhao Lei (talk | contribs) (→Team Member) |
Yanhao Lei (talk | contribs) (→Assignment 1) |
||
Line 10: | Line 10: | ||
== Assignment 1 == | == Assignment 1 == | ||
+ | === Pi === | ||
+ | This is a comparison between two programs that calculate Pi. | ||
+ | |||
+ | Leibniz formula implementation: | ||
+ | #include <iostream> | ||
+ | #include <iomanip> | ||
+ | |||
+ | #include <chrono> | ||
+ | |||
+ | // Function duplicated from [https://scs.senecac.on.ca/~gpu610/pages/workshops/w2.html Workshop 2 - BLAS] | ||
+ | void reportTime(const char* msg, std::chrono::steady_clock::duration span) { | ||
+ | auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(span); | ||
+ | std::cout << msg << " - took - " | ||
+ | << ms.count() << " millisecs" << std::endl; | ||
+ | } | ||
+ | |||
+ | // Arctangent of 1; execute for ~n iterations to refine the result | ||
+ | long double arctan1( unsigned long long int it ) { | ||
+ | long double r = 0.0; | ||
+ | |||
+ | // v0.25; due to performing the operations in a different order, there are rounding issues... | ||
+ | for ( long double d = 0.0; d < it; d++ ) { | ||
+ | long double de = d * 4.0 + 1.0; | ||
+ | r += (1.0 / de) - (1.0 / (de + 2.0)); | ||
+ | } | ||
+ | |||
+ | return r; | ||
+ | } | ||
+ | |||
+ | int main( int argc, char* argv[] ) { | ||
+ | unsigned long long int n = std::stoull(argv[1], 0); | ||
+ | |||
+ | std::chrono::steady_clock::time_point ts, te; | ||
+ | ts = std::chrono::steady_clock::now(); | ||
+ | long double pi = 4.0 * arctan1( n ); | ||
+ | te = std::chrono::steady_clock::now(); | ||
+ | reportTime("Arctangent(1) ", te - ts); | ||
+ | |||
+ | // Maximum length of a long double is 64 digits; minus "3." gives 62 digits. | ||
+ | std::cout.precision(62); | ||
+ | std::cout << "Pi: " << std::fixed << pi << std::endl; | ||
+ | } | ||
+ | |||
+ | Monte-Carlo algorithm implementation: | ||
+ | #include <iostream> | ||
+ | #include <random> | ||
+ | |||
+ | #include <chrono> | ||
+ | |||
+ | // Function duplicated from [https://scs.senecac.on.ca/~gpu610/pages/workshops/w2.html Workshop 2 - BLAS] | ||
+ | void reportTime(const char* msg, std::chrono::steady_clock::duration span) { | ||
+ | auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(span); | ||
+ | std::cout << msg << " - took - " << | ||
+ | ms.count() << " millisecs" << std::endl; | ||
+ | } | ||
+ | |||
+ | int main(int argc, char* argv[]) { | ||
+ | std::chrono::steady_clock::time_point ts, te; | ||
+ | |||
+ | ts = std::chrono::steady_clock::now(); | ||
+ | unsigned long long int n = std::stoull(argv[1], 0), | ||
+ | totalCircle = 0; | ||
+ | |||
+ | int stride = 1000, | ||
+ | circleSize = n / stride; | ||
+ | |||
+ | unsigned int* circle = new unsigned int[circleSize]; | ||
+ | |||
+ | for (int i = 0; i < circleSize; i++) | ||
+ | circle[i] = 0; | ||
+ | |||
+ | std::random_device rd; | ||
+ | std::mt19937 mt(rd()); | ||
+ | std::uniform_real_distribution<long double> dist(0.0, 1.0); | ||
+ | te = std::chrono::steady_clock::now(); | ||
+ | reportTime("Init. ", te - ts); | ||
+ | |||
+ | ts = std::chrono::steady_clock::now(); | ||
+ | for (unsigned long long int i = 0; i < circleSize; i++) { | ||
+ | for (int j = 0; j < stride; j++) { | ||
+ | long double x = dist(mt), | ||
+ | y = dist(mt); | ||
+ | // if position is inside the circle... | ||
+ | if (x * x + y * y < 1.0) { | ||
+ | circle[i]++; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | for (int i = 0; i < circleSize; i++) | ||
+ | totalCircle += circle[i]; | ||
+ | |||
+ | long double pi = 4.0 * ((long double) totalCircle) / ((long double) n); | ||
+ | te = std::chrono::steady_clock::now(); | ||
+ | reportTime("Drop points ", te - ts); | ||
+ | |||
+ | std::cout.precision(62); | ||
+ | std::cout << "Pi: " << std::fixed << pi << std::endl; | ||
+ | |||
+ | delete [] circle; | ||
+ | } | ||
+ | |||
+ | At around 10K iterations, the first decimal is stable. | ||
+ | > time ./monte-carlo 10000 | ||
+ | Init. - took - 0 millisecs | ||
+ | Drop points - took - 1 millisecs | ||
+ | Pi: '''3.1'''1679999999999999995940747066214271399076096713542938232421875 | ||
+ | |||
+ | real 0m0.019s | ||
+ | user 0m0.004s | ||
+ | sys 0m0.008s | ||
+ | > time ./monte-carlo 10000 | ||
+ | Init. - took - 0 millisecs | ||
+ | Drop points - took - 1 millisecs | ||
+ | Pi: '''3.1'''6480000000000000009124645483638005316606722772121429443359375 | ||
+ | |||
+ | real 0m0.018s | ||
+ | user 0m0.008s | ||
+ | sys 0m0.004s | ||
+ | > time ./monte-carlo 10000 | ||
+ | Init. - took - 0 millisecs | ||
+ | Drop points - took - 1 millisecs | ||
+ | Pi: '''3.1'''6639999999999999995108079797745403993758372962474822998046875 | ||
+ | |||
+ | real 0m0.018s | ||
+ | user 0m0.004s | ||
+ | sys 0m0.008s | ||
+ | |||
+ | The next digit is stable at around 10M iterations | ||
+ | > time ./monte-carlo 10000000 | ||
+ | Init. - took - 0 millisecs | ||
+ | Drop points - took - 1096 millisecs | ||
+ | Pi: '''3.14'''150879999999999990685506379151092914980836212635040283203125 | ||
+ | |||
+ | real 0m1.114s | ||
+ | user 0m1.092s | ||
+ | sys 0m0.008s | ||
+ | > time ./monte-carlo 10000000 | ||
+ | Init. - took - 0 millisecs | ||
+ | Drop points - took - 1097 millisecs | ||
+ | Pi: '''3.14'''219679999999999993332000514101309818215668201446533203125000 | ||
+ | |||
+ | real 0m1.114s | ||
+ | user 0m1.092s | ||
+ | sys 0m0.016s | ||
+ | > time ./monte-carlo 10000000 | ||
+ | Init. - took - 0 millisecs | ||
+ | Drop points - took - 1097 millisecs | ||
+ | Pi: '''3.14'''158840000000000010696443730751070688711479306221008300781250 | ||
+ | |||
+ | real 0m1.115s | ||
+ | user 0m1.088s | ||
+ | sys 0m0.012s | ||
+ | |||
+ | By 100M, the third digit appears to be stable. | ||
+ | > time ./monte-carlo 100000000 | ||
+ | Init. - took - 1 millisecs | ||
+ | Drop points - took - 10910 millisecs | ||
+ | Pi: '''3.141'''38611999999999989559296142971334120375104248523712158203125 | ||
+ | |||
+ | real 0m10.930s | ||
+ | user 0m10.881s | ||
+ | sys 0m0.012s | ||
+ | > time ./monte-carlo 100000000 | ||
+ | Init. - took - 1 millisecs | ||
+ | Drop points - took - 10847 millisecs | ||
+ | Pi: '''3.141'''85203999999999998835042980260823242133483290672302246093750 | ||
+ | |||
+ | real 0m10.868s | ||
+ | user 0m10.833s | ||
+ | sys 0m0.016s | ||
+ | > time ./monte-carlo 100000000 | ||
+ | Init. - took - 1 millisecs | ||
+ | Drop points - took - 10883 millisecs | ||
+ | Pi: '''3.141'''60056000000000009896028441147564080893062055110931396484375 | ||
+ | |||
+ | real 0m10.903s | ||
+ | user 0m10.865s | ||
+ | sys 0m0.016s | ||
== Assignment 2 == | == Assignment 2 == | ||
== Assignment 3 == | == Assignment 3 == |
Revision as of 13:23, 9 February 2017
Contents
TBD...
Team Member
- Mark Anthony Villaflor (Leader)
- Huachen Li
- Yanhao Lei
eMail All
Progress
Assignment 1
Pi
This is a comparison between two programs that calculate Pi.
Leibniz formula implementation:
#include <iostream> #include <iomanip> #include <chrono> // Function duplicated from Workshop 2 - BLAS void reportTime(const char* msg, std::chrono::steady_clock::duration span) { auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(span); std::cout << msg << " - took - " << ms.count() << " millisecs" << std::endl; } // Arctangent of 1; execute for ~n iterations to refine the result long double arctan1( unsigned long long int it ) { long double r = 0.0; // v0.25; due to performing the operations in a different order, there are rounding issues... for ( long double d = 0.0; d < it; d++ ) { long double de = d * 4.0 + 1.0; r += (1.0 / de) - (1.0 / (de + 2.0)); } return r; } int main( int argc, char* argv[] ) { unsigned long long int n = std::stoull(argv[1], 0); std::chrono::steady_clock::time_point ts, te; ts = std::chrono::steady_clock::now(); long double pi = 4.0 * arctan1( n ); te = std::chrono::steady_clock::now(); reportTime("Arctangent(1) ", te - ts); // Maximum length of a long double is 64 digits; minus "3." gives 62 digits. std::cout.precision(62); std::cout << "Pi: " << std::fixed << pi << std::endl; }
Monte-Carlo algorithm implementation:
#include <iostream> #include <random> #include <chrono> // Function duplicated from Workshop 2 - BLAS void reportTime(const char* msg, std::chrono::steady_clock::duration span) { auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(span); std::cout << msg << " - took - " << ms.count() << " millisecs" << std::endl; } int main(int argc, char* argv[]) { std::chrono::steady_clock::time_point ts, te; ts = std::chrono::steady_clock::now(); unsigned long long int n = std::stoull(argv[1], 0), totalCircle = 0; int stride = 1000, circleSize = n / stride; unsigned int* circle = new unsigned int[circleSize]; for (int i = 0; i < circleSize; i++) circle[i] = 0; std::random_device rd; std::mt19937 mt(rd()); std::uniform_real_distribution<long double> dist(0.0, 1.0); te = std::chrono::steady_clock::now(); reportTime("Init. ", te - ts); ts = std::chrono::steady_clock::now(); for (unsigned long long int i = 0; i < circleSize; i++) { for (int j = 0; j < stride; j++) { long double x = dist(mt), y = dist(mt); // if position is inside the circle... if (x * x + y * y < 1.0) { circle[i]++; } } } for (int i = 0; i < circleSize; i++) totalCircle += circle[i]; long double pi = 4.0 * ((long double) totalCircle) / ((long double) n); te = std::chrono::steady_clock::now(); reportTime("Drop points ", te - ts); std::cout.precision(62); std::cout << "Pi: " << std::fixed << pi << std::endl; delete [] circle; }
At around 10K iterations, the first decimal is stable.
> time ./monte-carlo 10000 Init. - took - 0 millisecs Drop points - took - 1 millisecs Pi: 3.11679999999999999995940747066214271399076096713542938232421875 real 0m0.019s user 0m0.004s sys 0m0.008s > time ./monte-carlo 10000 Init. - took - 0 millisecs Drop points - took - 1 millisecs Pi: 3.16480000000000000009124645483638005316606722772121429443359375 real 0m0.018s user 0m0.008s sys 0m0.004s > time ./monte-carlo 10000 Init. - took - 0 millisecs Drop points - took - 1 millisecs Pi: 3.16639999999999999995108079797745403993758372962474822998046875 real 0m0.018s user 0m0.004s sys 0m0.008s
The next digit is stable at around 10M iterations
> time ./monte-carlo 10000000 Init. - took - 0 millisecs Drop points - took - 1096 millisecs Pi: 3.14150879999999999990685506379151092914980836212635040283203125 real 0m1.114s user 0m1.092s sys 0m0.008s > time ./monte-carlo 10000000 Init. - took - 0 millisecs Drop points - took - 1097 millisecs Pi: 3.14219679999999999993332000514101309818215668201446533203125000 real 0m1.114s user 0m1.092s sys 0m0.016s > time ./monte-carlo 10000000 Init. - took - 0 millisecs Drop points - took - 1097 millisecs Pi: 3.14158840000000000010696443730751070688711479306221008300781250 real 0m1.115s user 0m1.088s sys 0m0.012s
By 100M, the third digit appears to be stable.
> time ./monte-carlo 100000000 Init. - took - 1 millisecs Drop points - took - 10910 millisecs Pi: 3.14138611999999999989559296142971334120375104248523712158203125 real 0m10.930s user 0m10.881s sys 0m0.012s > time ./monte-carlo 100000000 Init. - took - 1 millisecs Drop points - took - 10847 millisecs Pi: 3.14185203999999999998835042980260823242133483290672302246093750 real 0m10.868s user 0m10.833s sys 0m0.016s > time ./monte-carlo 100000000 Init. - took - 1 millisecs Drop points - took - 10883 millisecs Pi: 3.14160056000000000009896028441147564080893062055110931396484375 real 0m10.903s user 0m10.865s sys 0m0.016s