For this assignment, you need to write a parallel program in C++ using OpenMP for vector addition. Assume A, B, C are three vectors of equal length. The program will add the corresponding elements of vectors A and B and will store the sum in the corresponding elements in vector C (in other words C[i] = A[i] + B[i]). Every thread should execute an approximately equal number of loop iterations. The only OpenMP directive you are allowed to use is:
#pragma omp parallel num_threads(no of threads)
The program should take n and the number of threads to use as command-line arguments:
./parallel_vector_addition <n> <threads>
Where n is the length of the vectors and threads is the number of threads to be created.
Pseudocode for Assignment:
mystart = myid*n/p; // starting index for the individual thread
myend = mystart+n/p; // ending index for the individual thread
for (i = mystart; i < myend; i++) // each thread computes local sum do vector addition // and later all local sums combined.
As an input vector A, initialize its size to 10,000 and elements from 1 to 10,000.
So, A[0] = 1, A[1] = 2, A[2] = 3, … , A[9999] = 10000.
Input vector B will be initialized to the same size with opposite inputs.
So, B[0] = 10000, B[1] = 9999, B[2] = 9998, … , B[9999] = 1
Using above input vectors A and B, create output Vector C which will be computed as C[ i ] = A[ i ] + B[ i ];
You should check whether your output vector value is 10001 in every C[ i ].
First, start with 2 threads (each thread adding 5,000 vectors), and then do with 4,and 8 threads. Remember sometimes your vector size can not be divided equally by the number of threads. You need to slightly modify pseudo code to handle the situation accordingly. (Hint: If you have p threads, first (p - 1) threads should have an equal number of input size and the last thread will take care of whatever the remainder portion.) Check the running time from each experiment and compare the result. Report your findings from this project in a separate paragraph.
Your output should show team of threads do evenly distributed work, but big vector size might cause an issue in output. You can create mini version of original vector in much smaller size of 100 (A[0] = 1, A[1] = 2, A[2] = 3, … , A[99] = 100) and run with 6 threads once and take a screenshot of your output. And run with original size with 2, 4, and 8 threads to compare running times.
#include<iostream>
#include<vector.h>
#include <omp.h>
#include<bits/stdc++.h>
using namespace std;
int main(){
{
int n,thread;
cin>>thread>>n;
omp_set_num_threads(thread);
vector<int> a(n);
vector<int> b(n);
vector<int> c(n);
int j= 1;
for(int i=0;i<n;i++){
a[i] = j;
b[i] = j;
j++;
}
cout<<endl;
reverse(b.begin(), b.end());
for(int i=0;i<n;i++){
}
cout<<endl;
int count = n+1;
for(int i=0;i<n;i++){
c[i] = a[i]+b[i];
if(c[i] == count){
cout<<c[i]<<" "<<"Yes"<<endl;
}
else{
cout<<c[i]<<" "<<"NO"<<endl;
}
}
}
return 0;
}
Note: if you like the answer please upvote for me thankyou
Get Answers For Free
Most questions answered within 1 hours.