#include <iostream>
#include <chrono>
#include <random>
#include <omp.h>
using namespace std;
const int N = 10000;
int arr[N];
// Function that performs the loop
int calculate_sum() {
int sum = 0;
#pragma omp parallel for schedule(static)
for (int i = 0; i < N; ++i) {
sum += arr[i];
}
return sum;
}
int main() {
// Initialize array with random numbers
srand(1234);
for (int i = 0; i < N; ++i) {
arr[i] = rand() % 100 + 1;
}
// Calculate sum using static scheduling with different chunk sizes
cout << "Static scheduling:" << endl;
for (int chunk_size = 1; chunk_size <= 100; chunk_size += 10) {
auto start = chrono::high_resolution_clock::now();
#pragma omp parallel for schedule(static, chunk_size)
for (int i = 0; i < N; ++i) {
arr[i] *= 2;
}
auto end = chrono::high_resolution_clock::now();
cout << "Chunk size " << chunk_size << " took "
<< chrono::duration_cast<chrono::microseconds>(end - start).count()
<< " microseconds" << endl;
}
// Calculate sum using dynamic scheduling with different chunk sizes
cout << "Dynamic scheduling:" << endl;
for (int chunk_size = 1; chunk_size <= 100; chunk_size += 10) {
auto start = chrono::high_resolution_clock::now();
#pragma omp parallel for schedule(dynamic, chunk_size)
for (int i = 0; i < N; ++i) {
arr[i] *= 2;
}
auto end = chrono::high_resolution_clock::now();
cout << "Chunk size " << chunk_size << " took "
<< chrono::duration_cast<chrono::microseconds>(end - start).count()
<< " microseconds" << endl;
}
// Calculate sum using guided scheduling with different chunk sizes
cout << "Guided scheduling:" << endl;
for (int chunk_size = 1; chunk_size <= 100; chunk_size += 10) {
auto start = chrono::high_resolution_clock::now();
#pragma omp parallel for schedule(guided, chunk_size)
for (int i = 0; i < N; ++i) {
arr[i] *= 2;
}
auto end = chrono::high_resolution_clock::now();
cout << "Chunk size " << chunk_size << " took "
<< chrono::duration_cast<chrono::microseconds>(end - start).count()
<< " microseconds" << endl;
}
// Calculate sum using default scheduling
cout << "Default scheduling:" << endl;
auto start = chrono::high_resolution_clock::now();
int sum = calculate_sum();
auto end = chrono::high_resolution_clock::now();
cout << "Sum is " << sum << endl;
cout << "Default scheduling took "<< chrono::duration_cast<chrono::microseconds>(end - start).count()<< " microseconds" << endl;
return 0;
}