// calculateWithLoop.cpp#include <chrono>#include <iostream>#include <random>#include <vector>constexprlonglong size =100000000;intmain(){std::cout <<std::endl;std::vector<int>randValues;randValues.reserve(size);// random valuesstd::random_device seed;std::mt19937 engine(seed());std::uniform_int_distribution<>uniformDIst(1,10);for(longlong i =0; i < size;++i)randValues.push_back(uniformDIst(engine));constauto sta =std::chrono::steady_clock::now();unsignedlonglong sum ={};for(auto n : randValues)sum += n;conststd::chrono::duration<double> dur =std::chrono::steady_clock::now()- sta;std::cout <<"Time for mySumition "<<dur.count()<<"seconds"<<std::endl;std::cout <<"Result: "<< sum <<std::endl;std::cout <<std::endl;}
// calculateWithStd.cpp
...
const unsigned long long sum = std::accumulate(randValues.begin(),
randValues.end(), 0);
...
// calculateWithLock.cpp
...
std::mutex myMutex;
for (auto i: randValues){
std::lock_guard<std::mutex> myLockGuard(myMutex);
sum += i;
}
...
// calculateWithAtomic.cpp
#include <atomic>
#include <chrono>
#include <iostream>
#include <numeric>
#include <random>
#include <vector>
constexpr long long size = 100000000;
int main() {
std::cout << std::endl;
std::vector<int>randValues;
randValues.reserve(size);
// random values
std::random_device seed;
std::mt19937 engine(seed());
std::uniform_int_distribution<> uniformDist(1, 10);
for (long long i = 0; i < size; ++i)
randValues.push_back(uniformDist(engine));
std::atomic<unsigned long long> sum = {};
std::cout << std::boolalpha << "sum.is_lock_free(): "
<< sum.is_lock_free() << std::endl;
std::cout << std::endl;
auto sta = std::chrono::steady_clock::now();
for (auto i : randValues) sum += i;
std::chrono::duration<double> dur = std::chrono::steady_clock::now() - sta;
std::cout << "Time for addition " << dur.count()
<< " seconds" << std::endl;
std::cout << "Result: " << sum << std::endl;
std::cout << std::endl;
sum = 0;
sta = std::chrono::steady_clock::now();
for (auto i : randValues) sum.fetch_add(i);
dur = std::chrono::steady_clock::now() - sta;
std::cout << "Time for addition " << dur.count()
<< " seconds" << std::endl;
std::cout << "Result: " << sum << std::endl;
std::cout << std::endl;
}
// synchronisationWithLock.cpp
#include<chrono>
#include <iostream>
#include <mutex>
#include <random>
#include <thread>
#include <utility>
#include <vector>
constexpr long long size = 100000000;
constexpr long long fir = 25000000;
constexpr long long sec = 50000000;
constexpr long long thi = 75000000;
constexpr long long fou = 100000000;
std::mutex myMutex;
void sumUp(unsigned long long& sum, const std::vector<int>& val,
unsigned long long beg, unsigned long long end) {
for (auto it = beg; it < end; ++it) {
std::lock_guard<std::mutex> myLock(myMutex);
sum += val[it];
}
}
int main() {
std::cout << std::endl;
std::vector<int> randValues;
randValues.reserve(size);
std::mt19937 engine;
std::uniform_int_distribution<> uniformDist(1, 10);
for (long long i = 0; i < size; ++i)
randValues.push_back(uniformDist(engine));
unsigned long long sum = 0;
const auto sta = std::chrono::steady_clock::now();
std::thread t1(sumUp, std::ref(sum), std::ref(randValues), 0, fir);
std::thread t2(sumUp, std::ref(sum), std::ref(randValues), fir, sec);
std::thread t3(sumUp, std::ref(sum), std::ref(randValues), sec, thi);
std::thread t4(sumUp, std::ref(sum), std::ref(randValues), thi, fou);
t1.join();
t2.join();
t3.join();
t4.join();
std::chrono::duration<double> dur = std::chrono::steady_clock::now() - sta;
std::cout << "Time for addition " << dur.count()
<< " seconds" << std::endl;
std::cout << "Result: " << sum << std::endl;
std::cout << std::endl;
}
// synchronisationWithAtomic.cpp
...
void sumUp(std::atomic<unsigned long long>& sum, const std::vector<int>& val,
unsigned long long beg, unsigned long long end){
for (auto it = beg; it < end; ++it){
sum += val[it];
}
}
// synchronisationWithFetchAdd.cpp
...
void sumUp(std::atomic<unsigned long long>& sum, const std::vector<int>& val,
unsigned long long beg, unsigned long long end){
for (auto it = beg; it < end; ++it){
sum.fetch_add(val[it]);
}
}
...
// synchronisationWithFetchAddRelaxed.cpp
...
void sumUp(std::atomic<unsigned long long>& sum, const std::vector<int>& val,
unsigned long long beg, unsigned long long end){
for (auto it = beg; it < end; ++it){
sum.fetch_add(val[it], std::memory_order_relaxed);
}
}
...
// localVariable.cpp
#include <mutex>
#include<chrono>
#include <iostream>
#include <random>
#include <thread>
#include <utility>
#include <vector>
constexpr long long size = 100000000;
constexpr long long fir = 25000000;
constexpr long long sec = 50000000;
constexpr long long thi = 75000000;
constexpr long long fou = 100000000;
std::mutex myMutex;
void sumUp(unsigned long long& sum, const std::vector<int>& val,
unsigned long long beg, unsigned long long end) {
unsigned long long tmpSum{};
for (auto i = beg; i < end; ++i) {
tmpSum += val[i];
}
std::lock_guard<std::mutex> lockGuard(myMutex);
sum += tmpSum;
}
int main() {
std::cout << std::endl;
std::vector<int> randValues;
randValues.reserve(size);
std::mt19937 engine;
std::uniform_int_distribution<> uniformDist(1, 10);
for (long long i = 0; i < size; ++i)
randValues.push_back(uniformDist(engine));
unsigned long long sum{};
const auto sta = std::chrono::steady_clock::now();
std::thread t1(sumUp, std::ref(sum), std::ref(randValues), 0, fir);
std::thread t2(sumUp, std::ref(sum), std::ref(randValues), fir, sec);
std::thread t3(sumUp, std::ref(sum), std::ref(randValues), sec, thi);
std::thread t4(sumUp, std::ref(sum), std::ref(randValues), thi, fou);
t1.join();
t2.join();
t3.join();
t4.join();
std::chrono::duration<double> dur =
std::chrono::steady_clock::now() - sta;
std::cout << "Time for addition " << dur.count()
<< " seconds" << std::endl;
std::cout << "Result: " << sum << std::endl;
std::cout << std::endl;
}
// localVariableAtomic.cpp
...
void sumUp(std::atomic<unsigned long long>& sum, const std::vector<int>& val,
unsigned long long beg, unsigned long long end){
unsigned int long long tmpSum{};
for (auto i = beg; i < end; ++i){
tmpSum += val[i];
}
sum+= tmpSum;
}
...
// localVariableAtomicRelaxed.cpp
...
void sumUp(std::atomic<unsigned long long>& sum, const std::vector<int>& val,
unsigned long long beg, unsigned long long end){
unsigned int long long tmpSum{};
for (auto i = beg; i < end; ++i){
tmpSum += val[i];
}
sum.fetch_add(tmpSum, std::memory_order_relaxed);
}
...
// threadLocalSummation.cpp
#include <atomic>
#include<chrono>
#include <iostream>
#include <random>
#include <thread>
#include <utility>
#include <vector>
constexpr long long size = 100000000;
constexpr long long fir = 25000000;
constexpr long long sec = 50000000;
constexpr long long thi = 75000000;
constexpr long long fou = 100000000;
thread_local unsigned long long tmpSum = 0;
void sumUp(std::atomic<unsigned long long>& sum, const std::vector<int>& val,
unsigned long long beg, unsigned long long end) {
for (auto i = beg; i < end; ++i) {
tmpSum += val[i];
}
sum.fetch_add(tmpSum, std::memory_order_relaxed);
}
int main() {
std::cout << std::endl;
std::vector<int> randValues;
randValues.reserve(size);
std::mt19937 engine;
std::uniform_int_distribution<> uniformDist(1, 10);
for (long long i = 0; i < size; ++i)
randValues.push_back(uniformDist(engine));
std::atomic<unsigned long long> sum{};
const auto sta = std::chrono::steady_clock::now();
std::thread t1(sumUp, std::ref(sum), std::ref(randValues), 0, fir);
std::thread t2(sumUp, std::ref(sum), std::ref(randValues), fir, sec);
std::thread t3(sumUp, std::ref(sum), std::ref(randValues), sec, thi);
std::thread t4(sumUp, std::ref(sum), std::ref(randValues), thi, fou);
t1.join();
t2.join();
t3.join();
t4.join();
std::chrono::duration<double> dur =
std::chrono::steady_clock::now() - sta;
std::cout << "Time for addition " << dur.count()
<< " seconds" << std::endl;
std::cout << "Result: " << sum << std::endl;
std::cout << std::endl;
}
// tasksSummation.cpp
#include<chrono>
#include <future>
#include <iostream>
#include <random>
#include <thread>
#include <utility>
#include <vector>
constexpr long long size = 100000000;
constexpr long long fir = 25000000;
constexpr long long sec = 50000000;
constexpr long long thi = 75000000;
constexpr long long fou = 100000000;
void sumUp(std::promise<unsigned long long>&& prom, const std::vector<int>& val,
unsigned long long beg, unsigned long long end) {
unsigned long long sum = {};
for (auto i = beg; i < end; ++i) {
sum += val[i];
}
prom.set_value(sum);
}
int main() {
std::cout << std::endl;
std::vector<int> randValues;
randValues.reserve(size);
std::mt19937 engine;
std::uniform_int_distribution<> uniformDist(1, 10);
for (long long i = 0; i < size; ++i)
randValues.push_back(uniformDist(engine));
std::promise<unsigned long long> prom1;
std::promise<unsigned long long> prom2;
std::promise<unsigned long long> prom3;
std::promise<unsigned long long> prom4;
auto fut1 = prom1.get_future();
auto fut2 = prom2.get_future();
auto fut3 = prom3.get_future();
auto fut4 = prom4.get_future();
const auto sta = std::chrono::steady_clock::now();
std::thread t1(sumUp, std::move(prom1), std::ref(randValues), 0, fir);
std::thread t2(sumUp, std::move(prom2), std::ref(randValues), fir, sec);
std::thread t3(sumUp, std::move(prom3), std::ref(randValues), sec, thi);
std::thread t4(sumUp, std::move(prom4), std::ref(randValues), thi, fou);
auto sum = fut1.get() + fut2.get() + fut3.get() + fut4.get();
std::chrono::duration<double> dur = std::chrono::steady_clock::now() - sta;
std::cout << "Time for addition " << dur.count()
<< " seconds" << std::endl;
std::cout << "Result: " << sum << std::endl;
t1.join();
t2.join();
t3.join();
t4.join();
std::cout << std::endl;
}