Write C console programs of the “axpy” algorithm for integer, and double precisi
ID: 3588182 • Letter: W
Question
Write C console programs of the “axpy” algorithm for integer, and double precision data types. Instrument and monitor and measure execution time as a function of problem size. For each of the 2 data types:
Write it as a straight forward, single processor, sequential execution program, which you can scale the size of the axpy computation for N = 1, 5, 10 , 50, 100, 500, 1000, 5000, 10000, 50000, 100000, 500000 and 1,000,000 vector elements . Use a random number generator to fill the vectors. Set the vector dimension using a DEFINE statement then recompile & execution each vector length.
Your program should print out the vector length, and wall clock execution time in the console window, and computation time per axpy vector for each vector length used in your program code, and the number of accuracy improvement loops you run the daxpy computation to improve accuracy.
Your console program should print out using formatted printf commands
Vector length(number of vector elements)
The number of accuracy improvement loops you run the daxpy computation to improve accuracy
Total computation time
Computation time per axpy vector
Computation time per vector element
Number of machine cycles per arithmetic operation
Explanation / Answer
Solution: See the code below:
--------------------------------------
//
// This program calculates and shows the performance of axpy algorithm
//
#include <iostream>
#include <ctime>
#include <vector>
#include <cstdlib>
//No. of elements in vectors
#define N 1000000
using namespace std;
//performs axpy for integer vectors
vector<int> do_axpy(int a,vector<int> x, vector<int> y)
{
vector<int> result(N);
long size=N;
for(long i=0;i<size;i++)
{
result[i]=a*x[i]+y[i];
}
return result;
}
//performs for double vectors
vector<double> do_axpy(double a,vector<double> x, vector<double> y)
{
vector<double> result(N);
long size=N;
for(long i=0;i<size;i++)
{
result[i]=a*x[i]+y[i];
}
return result;
}
//main function
int main() {
//---------- Integer vector processing --------------
//declaration of integer vectors
vector<int> x_int(N), y_int(N),result_int(N);
int a_int=3; //scalar for integer vectors
srand(time(NULL)); //seeding random number generator
//loop to fill integer vector with random numbers
cout<<"Filling integer vectors...wait!"<<endl;
for(long i=0;i<N;i++)
{
x_int[i]=rand()%10+1;
y_int[i]=rand()%5+1;
}
cout<<"Starting axpy for integer vectors..."<<endl;
cout<<"Number of elements to be processed: "<<N<<endl;
clock_t begin_int=clock();
result_int=do_axpy(a_int,x_int,y_int);
clock_t end_int=clock();
cout<<"axpy for integer vectors finished!"<<endl;
cout<<"elapsed_time in axpy for integer vectors:"<<double(end_int-begin_int)/CLOCKS_PER_SEC<<endl;
//--------- double vector processing ----------------
//declaration of double vectors
vector<double> x_double(N), y_double(N),result_double(N);
double a_double=3.0; //scalar for double vectors
srand(time(NULL)); //seeding random number generator
//loop to fill double vectors with random numbers
cout<<"Filling double vectors...wait!"<<endl;
for(long i=0;i<N;i++)
{
x_double[i]=(double)(rand()%10+1.5);
y_double[i]=(double)(rand()%5+1.5);
}
cout<<"Starting axpy for double vectors..."<<endl;
cout<<"Number of elements to be processed: "<<N<<endl;
clock_t begin_double=clock();
result_double=do_axpy(a_double,x_double,y_double);
clock_t end_double=clock();
cout<<"axpy for double vectors finished!"<<endl;
cout<<"elapsed_time in axpy for double vectors:"<<double(end_double-begin_double)/CLOCKS_PER_SEC<<endl;
//--------------------------
return 0;
}
------------------------------------------
Output of programme with no optimization setting for different input sizes:
1. N=1
----------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 1
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 1
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
--------------------------------------
2. N=5
----------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 5
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 5
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
---------------------------------
3. N=10
----------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 10
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 10
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
----------------------------------------
4. N=50
-----------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 50
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 50
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
--------------------------------------------
5. N=100
----------------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 100
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 100
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
-----------------------------------------
6. N=500
------------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 500
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 500
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
----------------------------------------
7. N=1000
------------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 1000
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 1000
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
-----------------------------------
8. N=5000
-------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 5000
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0.001
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 5000
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
---------------------------------------
9. N=10000
----------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 10000
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 10000
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
---------------------------------------------------
10. N=50000
--------------------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 50000
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0.003
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 50000
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0.002
---------------------------------------------------
11. N=100000
---------------------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 100000
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0.002
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 100000
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0.003
---------------------------------------------
12. N=500000
-----------------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 500000
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0.022
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 500000
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0.023
----------------------------------------------------------
13. N=1000000
------------------------------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 1000000
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0.028
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 1000000
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0.039
-------------------------------------------------
Output of programme with full optimization setting for different input sizes:
1. N=1000000
-----------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 1000000
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0.012
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 1000000
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0.023
-------------------------------------------------
2. N=500000
-----------------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 500000
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0.005
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 500000
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0.01
---------------------------------------------------------
3. N=100000
---------------------------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 100000
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0.001
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 100000
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0.002
-----------------------------------------------
4. N=50000
------------------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 50000
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0.001
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 50000
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0.001
--------------------------------------------
5. N=10000
--------------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 10000
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 10000
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
------------------------------------------
6. N=5000
------------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 5000
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 5000
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
-------------------------------------------
7. N=1000
----------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 1000
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 1000
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
----------------------------------------------------
8. N=500
------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 500
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 500
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
-----------------------------------------
9. N=100
-------------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 100
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 100
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
-------------------------------
10. N=50
----------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 50
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 50
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
---------------------------------------------
11. N=10
-----------------------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 50
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 50
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
----------------------------------------------------
12. N=5
------------------------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 5
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 5
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
----------------------------------------
13. N=1
--------------------------------------
Filling integer vectors...wait!
Starting axpy for integer vectors...
Number of elements to be processed: 1
axpy for integer vectors finished!
elapsed_time in axpy for integer vectors:0
Filling double vectors...wait!
Starting axpy for double vectors...
Number of elements to be processed: 1
axpy for double vectors finished!
elapsed_time in axpy for double vectors:0
------------------------------------------------
I hope this helps if you find any problem. Please comment below. Don't forget to give a thumbs up if you liked it. :)
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.