#include <iostream>
#include <pthread.h>
#include <functional>
#include <vector>
#include <cstdlib>
#include <string>
#include <algorithm>
using namespace std;
#include "Timer.h"
typedef std::vector<double> vector_t;
typedef vector_t::iterator iter_t;
typedef iter_t::value_type value_t;
const int NUM_THREADS = 4;
pthread_t threads[NUM_THREADS];
int n_cpus=1;
struct arg_t{
iter_t begin;
iter_t end;
cpu_set_t cpuset;
};
struct fubar{};
void* sort_wrap(void* arg){
iter_t begin = ((arg_t*)arg)->begin;
iter_t end = ((arg_t*)arg)->end;
cpu_set_t cpuset = ((arg_t*)arg)->cpuset;
sched_setaffinity( 0, sizeof(cpuset), &cpuset);
std::sort(begin, end);
pthread_exit(0);
return 0;
}
int pt_sort(iter_t begin, iter_t end) {
cpu_set_t cpu_set_zero;
CPU_ZERO(&cpu_set_zero);
for(int j = 0; j< n_cpus; j++){
CPU_SET( j , &cpu_set_zero);
}
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
iter_t mid = std::partition(begin, end - 1, std::bind1st(less<value_t > (), *(end - 1)));
swap(*mid, *(end - 1));
cout<< (mid-end)<<endl;
iter_t end_low = mid;
iter_t mid_low = std::partition(begin, end_low-1, std::bind1st(less<value_t > (), *(end_low-1 - 1)));
swap(*mid_low, *(end_low - 1));
cout<< (mid_low-end_low)<<endl;
iter_t begin_high = mid+1;
iter_t mid_high = std::partition(begin_high, end-1, std::bind1st(less<value_t > (), *(end-1 - 1)));
swap(*mid_high, *(end - 1));
cout<< (mid_high-end)<<endl;
// 4 parts to thread
cpu_set_t cpu0 = cpu_set_zero;
CPU_SET(0 % n_cpus, &cpu0 );
cpu_set_t cpu1 = cpu_set_zero;
CPU_SET(1 % n_cpus, &cpu1 );
cpu_set_t cpu2 = cpu_set_zero;
CPU_SET(2 % n_cpus, &cpu2 );
cpu_set_t cpu3 = cpu_set_zero;
CPU_SET(3 % n_cpus, &cpu3 );
arg_t a1={begin, mid_low, cpu0};
arg_t a2={mid_low+1, end_low, cpu1};
arg_t a3={begin_high, mid_high, cpu2};
arg_t a4={mid_high+1, end, cpu3};
int rc1 = pthread_create(&threads[0], &attr, sort_wrap, (void *) &a1);
if ( rc1 ) throw fubar();
int rc2 = pthread_create(&threads[1], &attr, sort_wrap, (void *) &a2);
if ( rc2 ) throw fubar();
int rc3 = pthread_create(&threads[2], &attr, sort_wrap, (void *) &a3);
if ( rc3 ) throw fubar();
int rc4 = pthread_create(&threads[3], &attr, sort_wrap, (void *) &a4);
if ( rc4 ) throw fubar();
for(int i_threads = 0; i_threads<4; i_threads++){
pthread_join(threads[i_threads], 0);
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cHRocmVhZC5oPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxhbGdvcml0aG0+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2luY2x1ZGUgIlRpbWVyLmgiCgp0eXBlZGVmIHN0ZDo6dmVjdG9yPGRvdWJsZT4gdmVjdG9yX3Q7CnR5cGVkZWYgdmVjdG9yX3Q6Oml0ZXJhdG9yIGl0ZXJfdDsKdHlwZWRlZiBpdGVyX3Q6OnZhbHVlX3R5cGUgdmFsdWVfdDsKCmNvbnN0IGludCBOVU1fVEhSRUFEUyA9IDQ7CgpwdGhyZWFkX3QgdGhyZWFkc1tOVU1fVEhSRUFEU107CmludCBuX2NwdXM9MTsKCnN0cnVjdCBhcmdfdHsKICAgIGl0ZXJfdCBiZWdpbjsKICAgIGl0ZXJfdCBlbmQ7CiAgICBjcHVfc2V0X3QgY3B1c2V0Owp9OwpzdHJ1Y3QgZnViYXJ7fTsKCnZvaWQqIHNvcnRfd3JhcCh2b2lkKiBhcmcpewogICAgaXRlcl90IGJlZ2luID0gKChhcmdfdCopYXJnKS0+YmVnaW47CiAgICBpdGVyX3QgZW5kID0gKChhcmdfdCopYXJnKS0+ZW5kOwogICAgY3B1X3NldF90IGNwdXNldCA9ICgoYXJnX3QqKWFyZyktPmNwdXNldDsKICAgIHNjaGVkX3NldGFmZmluaXR5KCAwLCBzaXplb2YoY3B1c2V0KSwgJmNwdXNldCk7CiAgICBzdGQ6OnNvcnQoYmVnaW4sIGVuZCk7CiAgICBwdGhyZWFkX2V4aXQoMCk7CiAgICByZXR1cm4gMDsKfQoKaW50IHB0X3NvcnQoaXRlcl90IGJlZ2luLCBpdGVyX3QgZW5kKSB7CiAgICBjcHVfc2V0X3QgY3B1X3NldF96ZXJvOwogICAgQ1BVX1pFUk8oJmNwdV9zZXRfemVybyk7CiAgICBmb3IoaW50IGogPSAwOyBqPCBuX2NwdXM7IGorKyl7CiAgICAgICAgQ1BVX1NFVCggaiAsICZjcHVfc2V0X3plcm8pOwogICAgfQogICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpOwoKICAgIGl0ZXJfdCBtaWQgPSBzdGQ6OnBhcnRpdGlvbihiZWdpbiwgZW5kIC0gMSwgc3RkOjpiaW5kMXN0KGxlc3M8dmFsdWVfdCA+ICgpLCAqKGVuZCAtIDEpKSk7CiAgICBzd2FwKCptaWQsICooZW5kIC0gMSkpOwogICAgY291dDw8IChtaWQtZW5kKTw8ZW5kbDsKCiAgICBpdGVyX3QgZW5kX2xvdyA9IG1pZDsKICAgIGl0ZXJfdCBtaWRfbG93ID0gc3RkOjpwYXJ0aXRpb24oYmVnaW4sIGVuZF9sb3ctMSwgc3RkOjpiaW5kMXN0KGxlc3M8dmFsdWVfdCA+ICgpLCAqKGVuZF9sb3ctMSAtIDEpKSk7CiAgICBzd2FwKCptaWRfbG93LCAqKGVuZF9sb3cgLSAxKSk7CiAgICBjb3V0PDwgKG1pZF9sb3ctZW5kX2xvdyk8PGVuZGw7CgogICAgaXRlcl90IGJlZ2luX2hpZ2ggPSBtaWQrMTsKICAgIGl0ZXJfdCBtaWRfaGlnaCA9IHN0ZDo6cGFydGl0aW9uKGJlZ2luX2hpZ2gsIGVuZC0xLCBzdGQ6OmJpbmQxc3QobGVzczx2YWx1ZV90ID4gKCksICooZW5kLTEgLSAxKSkpOwogICAgc3dhcCgqbWlkX2hpZ2gsICooZW5kIC0gMSkpOwogICAgY291dDw8IChtaWRfaGlnaC1lbmQpPDxlbmRsOwoKICAgIC8vIDQgcGFydHMgdG8gdGhyZWFkCiAgICBjcHVfc2V0X3QgY3B1MCA9IGNwdV9zZXRfemVybzsKICAgIENQVV9TRVQoMCAlIG5fY3B1cywgJmNwdTAgKTsKICAgIGNwdV9zZXRfdCBjcHUxID0gY3B1X3NldF96ZXJvOwogICAgQ1BVX1NFVCgxICUgbl9jcHVzLCAmY3B1MSApOwogICAgY3B1X3NldF90IGNwdTIgPSBjcHVfc2V0X3plcm87CiAgICBDUFVfU0VUKDIgJSBuX2NwdXMsICZjcHUyICk7CiAgICBjcHVfc2V0X3QgY3B1MyA9IGNwdV9zZXRfemVybzsKICAgIENQVV9TRVQoMyAlIG5fY3B1cywgJmNwdTMgKTsKICAgIAogICAgYXJnX3QgYTE9e2JlZ2luLCBtaWRfbG93LCBjcHUwfTsKICAgIGFyZ190IGEyPXttaWRfbG93KzEsIGVuZF9sb3csIGNwdTF9OwogICAgYXJnX3QgYTM9e2JlZ2luX2hpZ2gsIG1pZF9oaWdoLCBjcHUyfTsKICAgIGFyZ190IGE0PXttaWRfaGlnaCsxLCBlbmQsIGNwdTN9OwogICAgCiAgICBpbnQgcmMxID0gcHRocmVhZF9jcmVhdGUoJnRocmVhZHNbMF0sICZhdHRyLCBzb3J0X3dyYXAsICh2b2lkICopICZhMSk7CiAgICBpZiAoIHJjMSApIHRocm93IGZ1YmFyKCk7CiAgICBpbnQgcmMyID0gcHRocmVhZF9jcmVhdGUoJnRocmVhZHNbMV0sICZhdHRyLCBzb3J0X3dyYXAsICh2b2lkICopICZhMik7CiAgICBpZiAoIHJjMiApIHRocm93IGZ1YmFyKCk7CiAgICBpbnQgcmMzID0gcHRocmVhZF9jcmVhdGUoJnRocmVhZHNbMl0sICZhdHRyLCBzb3J0X3dyYXAsICh2b2lkICopICZhMyk7CiAgICBpZiAoIHJjMyApIHRocm93IGZ1YmFyKCk7CiAgICBpbnQgcmM0ID0gcHRocmVhZF9jcmVhdGUoJnRocmVhZHNbM10sICZhdHRyLCBzb3J0X3dyYXAsICh2b2lkICopICZhNCk7CiAgICBpZiAoIHJjNCApIHRocm93IGZ1YmFyKCk7CgogICAgCiAgICBmb3IoaW50IGlfdGhyZWFkcyA9IDA7IGlfdGhyZWFkczw0OyBpX3RocmVhZHMrKyl7CiAgICAgICAgcHRocmVhZF9qb2luKHRocmVhZHNbaV90aHJlYWRzXSwgMCk7CiAgICB9CiAgICAKICAgIHJldHVybiAwOwp9Cg==