int main(void){ const size_t nThreads = std::thread::hardware_concurrency(); printf("Concurency: %zu\n", nThreads); BarrierCounter bc(nThreads); Barrier b(nThreads); BarrierXOR bxor(nThreads); timer(); #pragma omp parallel num_threads(nThreads) { size_t threadId = omp_get_thread_num(); for(int i=0; i<nAttempts; ++i){ if ((i%100) == 0) printf("%d", i); #pragma omp barrier if(threadId == 0 && (i%100) == 0){ printf("\n"); } #pragma omp barrier } } printf("OpenMP = %e s\n", timer()); printf("barrier counter = %e s\n", testBarrier(bc, nThreads)); printf("barrier XOR = %e s\n", testBarrier(bxor, nThreads)); printf("barrier messages = %e s\n", testBarrier(b, nThreads)); return EXIT_SUCCESS; }
return e1->eval(a, b, c, d) ^ e2->eval(a, b, c, d); } }; Expr* const ba() { return new A(); } Expr* const bb() { return new B(); } Expr* const bc() { return new C(); } Expr* const bd() { return new D(); } Expr* bnot(Expr* const e) { return new Not(e); } Expr* band(Expr* const e1, Expr* const e2) { return new And(e1, e2); } Expr* bor(Expr* const e1, Expr* const e2) { return new Or(e1, e2); } Expr* bxor(Expr* const e1, Expr* const e2) { return new Xor(e1, e2); } Expr* const knownXor4 = band( bor(bxor(ba(), bb()), bxor(bc(), bd())), bxor(bor(ba(), bb()), bor(bc(), bd()))); bool isXor4(Expr* const e) { return !e->eval(true, true, true, true) && !e->eval(false, true, true, true) && !e->eval(true, false, true, true) && !e->eval(false, false, true, true) && !e->eval(true, true, false, true) && !e->eval(false, true, false, true) && !e->eval(true, false, false, true) && e->eval(false, false, false, true) && !e->eval(true, true, true, false) && !e->eval(false, true, true, false) && !e->eval(true, false, true, false) && e->eval(false, false, true, false)