// // Program to compute the variance of a set of numbers. // // Command-line arguments are: // number of threads (P) -- required; number of threads to use // number of numbers (N) -- optional; see below // // If only one command-line argument is given, the program reads // input numbers (floating-point okay) from standard input until // end-of-file is reached. // If two command-line arguments are given, the program generates // N random numbers to use as input. // // Program output: // computed variance // elapsed time needed for computation, starting when all the // input numbers have been read in / generated, and ending // when the variance has been computed. // #include #include // has setprecision() #include // has exit(), etc. #include #include // has generate() #include // has accumulate() #include "threads-timer.h" // has timer() // Function to compute a random number between 0 and 1. double dRand() { return double(rand())/double(RAND_MAX); } // ---- Main program ---- int main(int argc, char* argv[]) { int P; // number of threads int N; // number of input numbers double * nums; // will point to array of input numbers if (argc < 2) { cerr << "Usage: " << argv[0] << " numThreads [numNumbers]\n"; exit(EXIT_FAILURE); } P = atoi(argv[1]); // Read/generate input. if (argc == 2) { // read input vector tempNums; double temp; cout << "Enter input numbers, control-D to end:\n"; while (cin >> temp) tempNums.push_back(temp); N = tempNums.size(); nums = new double[N]; copy(tempNums.begin(), tempNums.end(), nums); } else { // generate input N = atoi(argv[2]); nums = new double[N]; generate(nums, nums+N, dRand); #ifdef DEBUG cerr << "Input: \n"; for (int i = 0; i < N; ++i) cerr << nums[i] << endl; #endif } // Print some useful info. cout << "Computing the variance of " << N << " numbers using " << P << " threads\n"; // Start timing. double startTime = timer(); // Compute variance. // ==== START OF CODE TO REPLACE ==== double avg = (accumulate(nums, nums+N, 0.0))/double(N); #ifdef DEBUG cerr << "Average = " << avg << endl; #endif double variance = 0.0; for (int i = 0; i < N; ++i) variance += (nums[i] - avg)*(nums[i] - avg); // ==== END OF CODE TO REPLACE ==== // Stop timing. double endTime = timer(); // Print results. cout << "Variance = " << variance << endl; cout << "Time to compute (seconds) = " << setprecision(4) << endTime - startTime << endl; return EXIT_SUCCESS; }