magistraleinformaticanetworking:spm:traduttorecpp
Sample code 1
- file=traduttore.cpp
#include <iostream>
#include <thread>
#include <chrono>
#include <string>
#include <fstream>
#include <algorithm>
#include <vector>
#include <omp.h>
#include <cilk/cilk.h>
#include <cilk/cilk_api.h>
#include <grppi.h>
#include <seq/sequential_execution.h>
#include <native/parallel_execution_native.h>
#include <omp/parallel_execution_omp.h>
//#include <execution>
using namespace std;
typedef struct {
int start;
int end;
} RANGE;
int main(int argc, char * argv[]) {
string filename = argv[1];
int nw = atoi(argv[2]);
// reading string from file
string text = "";
chrono::system_clock::time_point start = std::chrono::system_clock::now();
std::ifstream t(argv[1]);
string line;
while(getline(t,line)){
text.append(line);
}
t.close();
chrono::system_clock::time_point end = std::chrono::system_clock::now();
cout << "reading " <<
chrono::duration_cast<std::chrono::microseconds>(end - start).count() << " ";
// keeping the original
string original = text;
// the traduttore function
auto traduttore = [](char c){
// this_thread::sleep_for(chrono::microseconds(1));
return toupper(c);
};
// sequential : std::transform
start = std::chrono::system_clock::now();
transform(//execution::parallel_policy,
text.begin(), text.end(), text.begin(),
traduttore
);
end = std::chrono::system_clock::now();
cout << "transform " <<
chrono::duration_cast<std::chrono::microseconds>(end - start).count() << " " ;
//this_thread::sleep_for(chrono::microseconds(8000000));
// sequential : classical loop
text = original;
start = std::chrono::system_clock::now();
for(unsigned int i=0; i<text.size() ; i++ ) {
text[i] = traduttore(text[i]);
}
end = std::chrono::system_clock::now();
cout << "for " <<
chrono::duration_cast<std::chrono::microseconds>(end - start).count() << " " ;
// parallel : openmp
text = original;
start = std::chrono::system_clock::now();
// to be compiled with -fopenmp
#pragma omp parallel for num_threads(nw)
for(unsigned int i=0; i<text.size() ; i++ ) {
text[i] = traduttore(text[i]);
}
end = std::chrono::system_clock::now();
cout << "omp " <<
chrono::duration_cast<std::chrono::microseconds>(end - start).count() << " ";
// parallel : c++ threads
text = original;
start = std::chrono::system_clock::now();
vector<RANGE> ranges(nw);
int m = text.size();
int delta { m / nw };
vector<thread> tids;
for(int i=0; i<nw; i++) {
ranges[i].start = i*delta;
ranges[i].end = (i != (nw-1) ? (i+1)*delta : m);
}
auto thread_body = [&](int a, int b, string t) {
for(int i=a; i<b; i++)
t[i] = traduttore(t[i]);
return;
};
for(int i=0; i<nw; i++) {
tids.push_back(thread(thread_body, ranges[i].start, ranges[i].end, text));
}
for(thread& t: tids) {
t.join();
}
end = std::chrono::system_clock::now();
cout << "c++ threads " <<
chrono::duration_cast<std::chrono::microseconds>(end - start).count() << " " ;
// cilk: parallel for (you need -fcilkplus)
text = original;
start = std::chrono::system_clock::now();
__cilkrts_set_param("nworkers",argv[2]);
{
cilk_for(int i=0; i<text.size() ; i++ ) {
text[i] = traduttore(text[i]);
}
}
end = std::chrono::system_clock::now();
cout << "cilk_for " <<
chrono::duration_cast<std::chrono::microseconds>(end - start).count() << " " ;
// grppi
text = original;
start = std::chrono::system_clock::now();
auto thr = grppi::parallel_execution_native{nw};
auto omp = grppi::parallel_execution_omp{};
// omp.set_concurrency_degree(nw);
auto seq = grppi::sequential_execution{};
grppi::map(seq,
text.begin(), text.end(), text.begin(),
traduttore);
end = std::chrono::system_clock::now();
cout << "grppi map thr " <<
chrono::duration_cast<std::chrono::microseconds>(end - start).count() << " " ;
cout << "nw " << nw << endl;
// cout << text << endl;
return 0;
}
magistraleinformaticanetworking/spm/traduttorecpp.txt · Ultima modifica: 14/11/2017 alle 11:18 (5 anni fa) da Marco Danelutto