Skip to content

Instantly share code, notes, and snippets.

@dmitryhd
Last active April 11, 2023 14:35
Show Gist options
  • Select an option

  • Save dmitryhd/d0f09903f878570fd3dc70f564c8f726 to your computer and use it in GitHub Desktop.

Select an option

Save dmitryhd/d0f09903f878570fd3dc70f564c8f726 to your computer and use it in GitHub Desktop.
atomic vs mutex M2 benchmark

Surprisingly on Apple M2 (ARM) atomic is inferior to mutex.

g++ -std=c++20 -O3 atomic_vs_mutex_cnt.cpp -pthread
python3 run_counter.py > counter_perf.csv
pip3 install pandas seaborn
python3 plot.py

see result in mutex_vs_atomic_m2_chart.png

#include <atomic>
#include <cassert>
#include <chrono>
#include <iostream>
#include <mutex>
#include <thread>
#include <vector>
#include <thread>
namespace {
constexpr int DEF_WORKLOAD = 50000000;
} // namespace
namespace {
std::atomic<int> ACnt{0};
__attribute__((noinline)) void threadfunc_atomic(int Wload) {
ACnt = 0;
for (;;) {
ACnt += 1;
if (ACnt >= Wload)
break;
}
}
int MCnt = 0;
std::mutex M;
__attribute__((noinline)) void threadfunc(int Wload) {
MCnt = 0;
for (;;) {
std::lock_guard<std::mutex> L{M};
MCnt += 1;
if (MCnt >= Wload)
break;
}
}
} // namespace
long int parse_arg(char **argv, int n) {
errno = 0;
char *endptr;
long int x = strtol(argv[n], &endptr, 10);
if (endptr == argv[n]) {
std::cerr << "Invalid number: " << argv[n] << '\n';
} else if (*endptr) {
std::cerr << "Trailing characters after number: " << argv[n] << '\n';
} else if (errno == ERANGE) {
std::cerr << "Number out of range: " << argv[n] << '\n';
}
return x;
}
int main(int argc, char **argv) {
if (argc != 3) {
std::cerr << "usage: prog [n_threads] [is_atomic '0' - mutex, any number - atomic ]\n";
return -1;
}
long int n_threads = parse_arg(argv, 1);
long int is_atomic = parse_arg(argv, 2);
std::vector<std::thread> threads(n_threads);
auto func = threadfunc;
if (is_atomic) {
func = threadfunc_atomic;
}
for (int i = 0; i < n_threads; i++) {
threads[i] = std::thread(func, DEF_WORKLOAD);
}
for (auto& th : threads) {
th.join();
}
}
// g++ -std=c++20 -O3 x.cpp -pthread; hyperfine './a.out 2 1' --warmup 2 # Atomic 2threads
// g++ -std=c++20 -O3 x.cpp -pthread; hyperfine './a.out 3 0' --warmup 2 # mutex 3threads
a.out:
(__TEXT,__text) section
__Z9parse_argPPci:
00000001000033a0 sub sp, sp, #0x50
00000001000033a4 stp x24, x23, [sp, #0x10]
00000001000033a8 stp x22, x21, [sp, #0x20]
00000001000033ac stp x20, x19, [sp, #0x30]
00000001000033b0 stp x29, x30, [sp, #0x40]
00000001000033b4 add x29, sp, #0x40
00000001000033b8 mov x19, x1
00000001000033bc mov x20, x0
00000001000033c0 bl 0x100003d80 ; symbol stub for: ___error
00000001000033c4 str wzr, [x0]
00000001000033c8 sxtw x22, w19
00000001000033cc sbfiz x21, x19, #3, #32
00000001000033d0 ldr x0, [x20, x21]
00000001000033d4 mov w23, #0xa
00000001000033d8 mov x1, sp
00000001000033dc mov w2, #0xa
00000001000033e0 bl 0x100003dc8 ; symbol stub for: _strtol
00000001000033e4 mov x19, x0
00000001000033e8 ldr x8, [sp]
00000001000033ec ldr x9, [x20, x21]
00000001000033f0 cmp x8, x9
00000001000033f4 b.eq 0x100003448
00000001000033f8 ldrb w8, [x8]
00000001000033fc cbz w8, 0x10000348c
0000000100003400 nop
0000000100003404 ldr x0, #0xc4c ; literal pool symbol address: __ZNSt3__14cerrE
0000000100003408 adr x1, #0xa99 ; literal pool for: "Trailing characters after number: "
000000010000340c nop
0000000100003410 mov w2, #0x22
0000000100003414 bl __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
0000000100003418 mov x21, x0
000000010000341c ldr x20, [x20, x22, lsl #3]
0000000100003420 mov x0, x20
0000000100003424 bl 0x100003dbc ; symbol stub for: _strlen
0000000100003428 mov x2, x0
000000010000342c mov x0, x21
0000000100003430 mov x1, x20
0000000100003434 bl __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
0000000100003438 mov w8, #0xa
000000010000343c strb w8, [sp, #0xe]
0000000100003440 add x1, sp, #0xe
0000000100003444 b 0x1000034e0
0000000100003448 nop
000000010000344c ldr x0, #0xc04 ; literal pool symbol address: __ZNSt3__14cerrE
0000000100003450 adr x1, #0xa40 ; literal pool for: "Invalid number: "
0000000100003454 nop
0000000100003458 mov w2, #0x10
000000010000345c bl __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
0000000100003460 mov x21, x0
0000000100003464 ldr x20, [x20, x22, lsl #3]
0000000100003468 mov x0, x20
000000010000346c bl 0x100003dbc ; symbol stub for: _strlen
0000000100003470 mov x2, x0
0000000100003474 mov x0, x21
0000000100003478 mov x1, x20
000000010000347c bl __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
0000000100003480 strb w23, [sp, #0xd]
0000000100003484 add x1, sp, #0xd
0000000100003488 b 0x1000034e0
000000010000348c bl 0x100003d80 ; symbol stub for: ___error
0000000100003490 ldr w8, [x0]
0000000100003494 cmp w8, #0x22
0000000100003498 b.ne 0x1000034e8
000000010000349c nop
00000001000034a0 ldr x0, #0xbb0 ; literal pool symbol address: __ZNSt3__14cerrE
00000001000034a4 adr x1, #0xa20 ; literal pool for: "Number out of range: "
00000001000034a8 nop
00000001000034ac mov w2, #0x15
00000001000034b0 bl __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
00000001000034b4 mov x21, x0
00000001000034b8 ldr x20, [x20, x22, lsl #3]
00000001000034bc mov x0, x20
00000001000034c0 bl 0x100003dbc ; symbol stub for: _strlen
00000001000034c4 mov x2, x0
00000001000034c8 mov x0, x21
00000001000034cc mov x1, x20
00000001000034d0 bl __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
00000001000034d4 mov w8, #0xa
00000001000034d8 strb w8, [sp, #0xf]
00000001000034dc add x1, sp, #0xf
00000001000034e0 mov w2, #0x1
00000001000034e4 bl __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
00000001000034e8 mov x0, x19
00000001000034ec ldp x29, x30, [sp, #0x40]
00000001000034f0 ldp x20, x19, [sp, #0x30]
00000001000034f4 ldp x22, x21, [sp, #0x20]
00000001000034f8 ldp x24, x23, [sp, #0x10]
00000001000034fc add sp, sp, #0x50
0000000100003500 ret
_main:
0000000100003504 sub sp, sp, #0x70
0000000100003508 stp x24, x23, [sp, #0x30]
000000010000350c stp x22, x21, [sp, #0x40]
0000000100003510 stp x20, x19, [sp, #0x50]
0000000100003514 stp x29, x30, [sp, #0x60]
0000000100003518 add x29, sp, #0x60
000000010000351c cmp w0, #0x3
0000000100003520 b.ne 0x100003628
0000000100003524 mov x19, x1
0000000100003528 mov x0, x1
000000010000352c mov w1, #0x1
0000000100003530 bl __Z9parse_argPPci
0000000100003534 mov x21, x0
0000000100003538 mov x0, x19
000000010000353c mov w1, #0x2
0000000100003540 bl __Z9parse_argPPci
0000000100003544 mov x22, x0
0000000100003548 stp xzr, xzr, [sp, #0x18]
000000010000354c str xzr, [sp, #0x28]
0000000100003550 cbz x21, 0x10000365c
0000000100003554 lsr x8, x21, #61
0000000100003558 cbnz x8, 0x1000036b8
000000010000355c lsl x23, x21, #3
0000000100003560 mov x0, x23
0000000100003564 bl 0x100003d50 ; symbol stub for: __Znwm
0000000100003568 mov x19, x0
000000010000356c add x8, x0, x21, lsl #3
0000000100003570 str x0, [sp, #0x18]
0000000100003574 str x8, [sp, #0x28]
0000000100003578 add x20, x23, x0
000000010000357c mov x1, x23
0000000100003580 bl 0x100003d8c ; symbol stub for: _bzero
0000000100003584 mov x23, #0x0
0000000100003588 adr x8, #0x1f4
000000010000358c nop
0000000100003590 adr x9, #0x194
0000000100003594 nop
0000000100003598 str x20, [sp, #0x20]
000000010000359c cmp x22, #0x0
00000001000035a0 csel x8, x9, x8, eq
00000001000035a4 str x8, [sp, #0x10]
00000001000035a8 adr x22, #0x994
00000001000035ac nop
00000001000035b0 add x0, sp, #0x8
00000001000035b4 add x1, sp, #0x10
00000001000035b8 mov x2, x22
00000001000035bc bl __ZNSt3__16threadC2IRPFviEJRKiEvEEOT_DpOT0_
00000001000035c0 ldr x8, [x19, x23, lsl #3]
00000001000035c4 cbnz x8, 0x1000036b4
00000001000035c8 ldr x8, [sp, #0x8]
00000001000035cc str x8, [x19, x23, lsl #3]
00000001000035d0 str xzr, [sp, #0x8]
00000001000035d4 add x0, sp, #0x8
00000001000035d8 bl 0x100003d14 ; symbol stub for: __ZNSt3__16threadD1Ev
00000001000035dc add x23, x23, #0x1
00000001000035e0 cmp x21, x23
00000001000035e4 b.ne 0x1000035b0
00000001000035e8 mov x21, x19
00000001000035ec cmp x21, x20
00000001000035f0 b.eq 0x100003688
00000001000035f4 mov x22, x21
00000001000035f8 mov x0, x22
00000001000035fc bl 0x100003d08 ; symbol stub for: __ZNSt3__16thread4joinEv
0000000100003600 add x22, x22, #0x8
0000000100003604 cmp x22, x20
0000000100003608 b.ne 0x1000035f8
000000010000360c cbz x21, 0x100003698
0000000100003610 sub x20, x20, #0x8
0000000100003614 mov x0, x20
0000000100003618 bl 0x100003d14 ; symbol stub for: __ZNSt3__16threadD1Ev
000000010000361c cmp x20, x21
0000000100003620 b.ne 0x100003610
0000000100003624 b 0x100003690
0000000100003628 nop
000000010000362c ldr x0, #0xa24 ; literal pool symbol address: __ZNSt3__14cerrE
0000000100003630 adr x1, #0x8aa ; literal pool for: "usage: prog [n_threads] [is_atomic '0' - mutex, any number - atomic ]\n"
0000000100003634 nop
0000000100003638 mov w2, #0x46
000000010000363c bl __ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m
0000000100003640 mov w0, #-0x1
0000000100003644 ldp x29, x30, [sp, #0x60]
0000000100003648 ldp x20, x19, [sp, #0x50]
000000010000364c ldp x22, x21, [sp, #0x40]
0000000100003650 ldp x24, x23, [sp, #0x30]
0000000100003654 add sp, sp, #0x70
0000000100003658 ret
000000010000365c mov x20, #0x0
0000000100003660 mov x19, #0x0
0000000100003664 adr x8, #0x118
0000000100003668 nop
000000010000366c adr x9, #0xb8
0000000100003670 nop
0000000100003674 cmp x22, #0x0
0000000100003678 csel x8, x9, x8, eq
000000010000367c str x8, [sp, #0x10]
0000000100003680 cmp x21, x20
0000000100003684 b.ne 0x1000035f4
0000000100003688 cbz x21, 0x100003698
000000010000368c mov x19, x21
0000000100003690 mov x0, x19
0000000100003694 bl 0x100003d44 ; symbol stub for: __ZdlPv
0000000100003698 mov w0, #0x0
000000010000369c ldp x29, x30, [sp, #0x60]
00000001000036a0 ldp x20, x19, [sp, #0x50]
00000001000036a4 ldp x22, x21, [sp, #0x40]
00000001000036a8 ldp x24, x23, [sp, #0x30]
00000001000036ac add sp, sp, #0x70
00000001000036b0 ret
00000001000036b4 bl 0x100003d38 ; symbol stub for: __ZSt9terminatev
00000001000036b8 add x0, sp, #0x18
00000001000036bc bl __ZNKSt3__113__vector_baseINS_6threadENS_9allocatorIS1_EEE20__throw_length_errorEv
00000001000036c0 brk #0x1
00000001000036c4 mov x22, x0
00000001000036c8 ldr x0, [sp, #0x18]
00000001000036cc cbz x0, 0x1000036e4
00000001000036d0 add x1, sp, #0x18
00000001000036d4 bl _main.cold.1
00000001000036d8 b 0x1000036e4
00000001000036dc mov x22, x0
00000001000036e0 cbnz x21, 0x1000036f4
00000001000036e4 mov x0, x22
00000001000036e8 bl 0x100003c6c ; symbol stub for: __Unwind_Resume
00000001000036ec mov x22, x0
00000001000036f0 mov x21, x19
00000001000036f4 cmp x20, x21
00000001000036f8 b.eq 0x100003714
00000001000036fc sub x20, x20, #0x8
0000000100003700 mov x0, x20
0000000100003704 bl 0x100003d14 ; symbol stub for: __ZNSt3__16threadD1Ev
0000000100003708 cmp x20, x21
000000010000370c b.ne 0x1000036fc
0000000100003710 mov x21, x19
0000000100003714 mov x0, x21
0000000100003718 bl 0x100003d44 ; symbol stub for: __ZdlPv
000000010000371c mov x0, x22
0000000100003720 bl 0x100003c6c ; symbol stub for: __Unwind_Resume
__ZN12_GLOBAL__N_110threadfuncEi:
0000000100003724 stp x22, x21, [sp, #-0x30]!
0000000100003728 stp x20, x19, [sp, #0x10]
000000010000372c stp x29, x30, [sp, #0x20]
0000000100003730 add x29, sp, #0x20
0000000100003734 mov x19, x0
0000000100003738 adrp x21, 5 ; 0x100008000
000000010000373c str wzr, [x21, #0x40]
0000000100003740 adr x20, #0x48c0
0000000100003744 nop
0000000100003748 mov x0, x20
000000010000374c bl 0x100003ce4 ; symbol stub for: __ZNSt3__15mutex4lockEv
0000000100003750 ldr w8, [x21, #0x40]
0000000100003754 add w22, w8, #0x1
0000000100003758 str w22, [x21, #0x40]
000000010000375c mov x0, x20
0000000100003760 bl 0x100003cf0 ; symbol stub for: __ZNSt3__15mutex6unlockEv
0000000100003764 cmp w22, w19
0000000100003768 b.lt 0x100003748
000000010000376c ldp x29, x30, [sp, #0x20]
0000000100003770 ldp x20, x19, [sp, #0x10]
0000000100003774 ldp x22, x21, [sp], #0x30
0000000100003778 ret
__ZN12_GLOBAL__N_117threadfunc_atomicEi:
000000010000377c adr x8, #0x48c8
0000000100003780 nop
0000000100003784 stlr wzr, [x8]
0000000100003788 mov w9, #0x1
000000010000378c ldaddal w9, w10, [x8]
0000000100003790 ldar w10, [x8]
0000000100003794 cmp w10, w0
0000000100003798 b.lt 0x10000378c
000000010000379c ret
___clang_call_terminate:
00000001000037a0 stp x29, x30, [sp, #-0x10]!
00000001000037a4 bl 0x100003d68 ; symbol stub for: ___cxa_begin_catch
00000001000037a8 bl 0x100003d38 ; symbol stub for: __ZSt9terminatev
__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m:
00000001000037ac sub sp, sp, #0x70
00000001000037b0 stp x26, x25, [sp, #0x20]
00000001000037b4 stp x24, x23, [sp, #0x30]
00000001000037b8 stp x22, x21, [sp, #0x40]
00000001000037bc stp x20, x19, [sp, #0x50]
00000001000037c0 stp x29, x30, [sp, #0x60]
00000001000037c4 add x29, sp, #0x60
00000001000037c8 mov x21, x2
00000001000037cc mov x20, x1
00000001000037d0 mov x19, x0
00000001000037d4 add x0, sp, #0x8
00000001000037d8 mov x1, x19
00000001000037dc bl 0x100003c9c ; symbol stub for: __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3_
00000001000037e0 ldrb w8, [sp, #0x8]
00000001000037e4 cbz w8, 0x10000388c
00000001000037e8 ldr x8, [x19]
00000001000037ec ldur x8, [x8, #-0x18]
00000001000037f0 add x22, x19, x8
00000001000037f4 ldr x23, [x22, #0x28]
00000001000037f8 ldr w25, [x22, #0x8]
00000001000037fc ldr w24, [x22, #0x90]
0000000100003800 cmn w24, #0x1
0000000100003804 b.ne 0x100003844
0000000100003808 add x8, sp, #0x18
000000010000380c mov x0, x22
0000000100003810 bl 0x100003c90 ; symbol stub for: __ZNKSt3__18ios_base6getlocEv
0000000100003814 nop
0000000100003818 ldr x1, #0x840 ; literal pool symbol address: __ZNSt3__15ctypeIcE2idE
000000010000381c add x0, sp, #0x18
0000000100003820 bl 0x100003c84 ; symbol stub for: __ZNKSt3__16locale9use_facetERNS0_2idE
0000000100003824 ldr x8, [x0]
0000000100003828 ldr x8, [x8, #0x38]
000000010000382c mov w1, #0x20
0000000100003830 blr x8
0000000100003834 mov x24, x0
0000000100003838 add x0, sp, #0x18
000000010000383c bl 0x100003cfc ; symbol stub for: __ZNSt3__16localeD1Ev
0000000100003840 str w24, [x22, #0x90]
0000000100003844 add x3, x20, x21
0000000100003848 mov w8, #0xb0
000000010000384c and w8, w25, w8
0000000100003850 cmp w8, #0x20
0000000100003854 csel x2, x3, x20, eq
0000000100003858 sxtb w5, w24
000000010000385c mov x0, x23
0000000100003860 mov x1, x20
0000000100003864 mov x4, x22
0000000100003868 bl __ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_
000000010000386c cbnz x0, 0x10000388c
0000000100003870 ldr x8, [x19]
0000000100003874 ldur x8, [x8, #-0x18]
0000000100003878 add x0, x19, x8
000000010000387c ldr w8, [x0, #0x20]
0000000100003880 mov w9, #0x5
0000000100003884 orr w1, w8, w9
0000000100003888 bl 0x100003d2c ; symbol stub for: __ZNSt3__18ios_base5clearEj
000000010000388c add x0, sp, #0x8
0000000100003890 bl 0x100003ca8 ; symbol stub for: __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev
0000000100003894 mov x0, x19
0000000100003898 ldp x29, x30, [sp, #0x60]
000000010000389c ldp x20, x19, [sp, #0x50]
00000001000038a0 ldp x22, x21, [sp, #0x40]
00000001000038a4 ldp x24, x23, [sp, #0x30]
00000001000038a8 ldp x26, x25, [sp, #0x20]
00000001000038ac add sp, sp, #0x70
00000001000038b0 ret
00000001000038b4 b 0x1000038c8
00000001000038b8 mov x20, x0
00000001000038bc add x0, sp, #0x18
00000001000038c0 bl 0x100003cfc ; symbol stub for: __ZNSt3__16localeD1Ev
00000001000038c4 b 0x1000038cc
00000001000038c8 mov x20, x0
00000001000038cc add x0, sp, #0x8
00000001000038d0 bl 0x100003ca8 ; symbol stub for: __ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev
00000001000038d4 b 0x1000038dc
00000001000038d8 mov x20, x0
00000001000038dc mov x0, x20
00000001000038e0 bl 0x100003d68 ; symbol stub for: ___cxa_begin_catch
00000001000038e4 ldr x8, [x19]
00000001000038e8 ldur x8, [x8, #-0x18]
00000001000038ec add x0, x19, x8
00000001000038f0 bl 0x100003d20 ; symbol stub for: __ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv
00000001000038f4 bl 0x100003d74 ; symbol stub for: ___cxa_end_catch
00000001000038f8 b 0x100003894
00000001000038fc mov x19, x0
0000000100003900 bl 0x100003d74 ; symbol stub for: ___cxa_end_catch
0000000100003904 mov x0, x19
0000000100003908 bl 0x100003c6c ; symbol stub for: __Unwind_Resume
000000010000390c bl ___clang_call_terminate
__ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4_:
0000000100003910 sub sp, sp, #0x70
0000000100003914 stp x26, x25, [sp, #0x20]
0000000100003918 stp x24, x23, [sp, #0x30]
000000010000391c stp x22, x21, [sp, #0x40]
0000000100003920 stp x20, x19, [sp, #0x50]
0000000100003924 stp x29, x30, [sp, #0x60]
0000000100003928 add x29, sp, #0x60
000000010000392c mov x19, x0
0000000100003930 cbz x0, 0x100003a54
0000000100003934 mov x24, x5
0000000100003938 mov x20, x4
000000010000393c mov x22, x3
0000000100003940 mov x21, x2
0000000100003944 ldr x8, [x4, #0x18]
0000000100003948 sub x9, x3, x1
000000010000394c subs x8, x8, x9
0000000100003950 csel x23, x8, xzr, gt
0000000100003954 sub x25, x2, x1
0000000100003958 cmp x25, #0x1
000000010000395c b.lt 0x10000397c
0000000100003960 ldr x8, [x19]
0000000100003964 ldr x8, [x8, #0x60]
0000000100003968 mov x0, x19
000000010000396c mov x2, x25
0000000100003970 blr x8
0000000100003974 cmp x0, x25
0000000100003978 b.ne 0x100003a50
000000010000397c cmp x23, #0x1
0000000100003980 b.lt 0x100003a1c
0000000100003984 cmp x23, #0x17
0000000100003988 b.hs 0x100003998
000000010000398c add x25, sp, #0x8
0000000100003990 strb w23, [sp, #0x1f]
0000000100003994 b 0x1000039b8
0000000100003998 add x8, x23, #0x10
000000010000399c and x26, x8, #0xfffffffffffffff0
00000001000039a0 mov x0, x26
00000001000039a4 bl 0x100003d50 ; symbol stub for: __Znwm
00000001000039a8 mov x25, x0
00000001000039ac orr x8, x26, #0x8000000000000000
00000001000039b0 stp x23, x8, [sp, #0x10]
00000001000039b4 str x0, [sp, #0x8]
00000001000039b8 mov x0, x25
00000001000039bc mov x1, x24
00000001000039c0 mov x2, x23
00000001000039c4 bl 0x100003d98 ; symbol stub for: _memset
00000001000039c8 strb wzr, [x25, x23]
00000001000039cc ldrsb w8, [sp, #0x1f]
00000001000039d0 ldr x9, [sp, #0x8]
00000001000039d4 cmp w8, #0x0
00000001000039d8 add x8, sp, #0x8
00000001000039dc csel x1, x9, x8, lt
00000001000039e0 ldr x8, [x19]
00000001000039e4 ldr x8, [x8, #0x60]
00000001000039e8 mov x0, x19
00000001000039ec mov x2, x23
00000001000039f0 blr x8
00000001000039f4 mov x24, x0
00000001000039f8 ldrsb w8, [sp, #0x1f]
00000001000039fc tbnz w8, #0x1f, 0x100003a0c
0000000100003a00 cmp x24, x23
0000000100003a04 b.ne 0x100003a50
0000000100003a08 b 0x100003a1c
0000000100003a0c ldr x0, [sp, #0x8]
0000000100003a10 bl 0x100003d44 ; symbol stub for: __ZdlPv
0000000100003a14 cmp x24, x23
0000000100003a18 b.ne 0x100003a50
0000000100003a1c sub x22, x22, x21
0000000100003a20 cmp x22, #0x1
0000000100003a24 b.lt 0x100003a48
0000000100003a28 ldr x8, [x19]
0000000100003a2c ldr x8, [x8, #0x60]
0000000100003a30 mov x0, x19
0000000100003a34 mov x1, x21
0000000100003a38 mov x2, x22
0000000100003a3c blr x8
0000000100003a40 cmp x0, x22
0000000100003a44 b.ne 0x100003a50
0000000100003a48 str xzr, [x20, #0x18]
0000000100003a4c b 0x100003a54
0000000100003a50 mov x19, #0x0
0000000100003a54 mov x0, x19
0000000100003a58 ldp x29, x30, [sp, #0x60]
0000000100003a5c ldp x20, x19, [sp, #0x50]
0000000100003a60 ldp x22, x21, [sp, #0x40]
0000000100003a64 ldp x24, x23, [sp, #0x30]
0000000100003a68 ldp x26, x25, [sp, #0x20]
0000000100003a6c add sp, sp, #0x70
0000000100003a70 ret
0000000100003a74 mov x19, x0
0000000100003a78 ldrsb w8, [sp, #0x1f]
0000000100003a7c tbz w8, #0x1f, 0x100003a88
0000000100003a80 ldr x0, [sp, #0x8]
0000000100003a84 bl 0x100003d44 ; symbol stub for: __ZdlPv
0000000100003a88 mov x0, x19
0000000100003a8c bl 0x100003c6c ; symbol stub for: __Unwind_Resume
__ZNKSt3__113__vector_baseINS_6threadENS_9allocatorIS1_EEE20__throw_length_errorEv:
0000000100003a90 stp x29, x30, [sp, #-0x10]!
0000000100003a94 mov x29, sp
0000000100003a98 bl 0x100003c78 ; symbol stub for: __ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv
__ZNSt3__16threadC2IRPFviEJRKiEvEEOT_DpOT0_:
0000000100003a9c stp x24, x23, [sp, #-0x40]!
0000000100003aa0 stp x22, x21, [sp, #0x10]
0000000100003aa4 stp x20, x19, [sp, #0x20]
0000000100003aa8 stp x29, x30, [sp, #0x30]
0000000100003aac add x29, sp, #0x30
0000000100003ab0 mov x22, x2
0000000100003ab4 mov x23, x1
0000000100003ab8 mov x20, x0
0000000100003abc mov w0, #0x8
0000000100003ac0 bl 0x100003d50 ; symbol stub for: __Znwm
0000000100003ac4 mov x21, x0
0000000100003ac8 bl 0x100003cb4 ; symbol stub for: __ZNSt3__115__thread_structC1Ev
0000000100003acc mov w0, #0x18
0000000100003ad0 bl 0x100003d50 ; symbol stub for: __Znwm
0000000100003ad4 mov x19, x0
0000000100003ad8 ldr x8, [x23]
0000000100003adc ldr w9, [x22]
0000000100003ae0 stp x21, x8, [x0]
0000000100003ae4 str w9, [x0, #0x10]
0000000100003ae8 adr x2, #0x88
0000000100003aec nop
0000000100003af0 mov x0, x20
0000000100003af4 mov x1, #0x0
0000000100003af8 mov x3, x19
0000000100003afc bl 0x100003da4 ; symbol stub for: _pthread_create
0000000100003b00 cbnz w0, 0x100003b1c
0000000100003b04 mov x0, x20
0000000100003b08 ldp x29, x30, [sp, #0x30]
0000000100003b0c ldp x20, x19, [sp, #0x20]
0000000100003b10 ldp x22, x21, [sp, #0x10]
0000000100003b14 ldp x24, x23, [sp], #0x40
0000000100003b18 ret
0000000100003b1c adr x1, #0x405 ; literal pool for: "thread constructor failed"
0000000100003b20 nop
0000000100003b24 bl 0x100003cd8 ; symbol stub for: __ZNSt3__120__throw_system_errorEiPKc
0000000100003b28 brk #0x1
0000000100003b2c mov x20, x0
0000000100003b30 mov x0, x21
0000000100003b34 bl 0x100003cc0 ; symbol stub for: __ZNSt3__115__thread_structD1Ev
0000000100003b38 b 0x100003b60
0000000100003b3c mov x20, x0
0000000100003b40 b 0x100003b60
0000000100003b44 mov x20, x0
0000000100003b48 ldr x0, [x19]
0000000100003b4c str xzr, [x19]
0000000100003b50 cbz x0, 0x100003b5c
0000000100003b54 bl 0x100003cc0 ; symbol stub for: __ZNSt3__115__thread_structD1Ev
0000000100003b58 bl 0x100003d44 ; symbol stub for: __ZdlPv
0000000100003b5c mov x21, x19
0000000100003b60 mov x0, x21
0000000100003b64 bl 0x100003d44 ; symbol stub for: __ZdlPv
0000000100003b68 mov x0, x20
0000000100003b6c bl 0x100003c6c ; symbol stub for: __Unwind_Resume
__ZNSt3__1L14__thread_proxyINS_5tupleIJNS_10unique_ptrINS_15__thread_structENS_14default_deleteIS3_EEEEPFviEiEEEEEPvSA_:
0000000100003b70 stp x20, x19, [sp, #-0x20]!
0000000100003b74 stp x29, x30, [sp, #0x10]
0000000100003b78 add x29, sp, #0x10
0000000100003b7c mov x19, x0
0000000100003b80 bl 0x100003ccc ; symbol stub for: __ZNSt3__119__thread_local_dataEv
0000000100003b84 ldr x1, [x19]
0000000100003b88 str xzr, [x19]
0000000100003b8c ldr x0, [x0]
0000000100003b90 bl 0x100003db0 ; symbol stub for: _pthread_setspecific
0000000100003b94 ldr x8, [x19, #0x8]
0000000100003b98 ldr w0, [x19, #0x10]
0000000100003b9c blr x8
0000000100003ba0 ldr x0, [x19]
0000000100003ba4 str xzr, [x19]
0000000100003ba8 cbz x0, 0x100003bb4
0000000100003bac bl 0x100003cc0 ; symbol stub for: __ZNSt3__115__thread_structD1Ev
0000000100003bb0 bl 0x100003d44 ; symbol stub for: __ZdlPv
0000000100003bb4 mov x0, x19
0000000100003bb8 bl 0x100003d44 ; symbol stub for: __ZdlPv
0000000100003bbc mov x0, #0x0
0000000100003bc0 ldp x29, x30, [sp, #0x10]
0000000100003bc4 ldp x20, x19, [sp], #0x20
0000000100003bc8 ret
0000000100003bcc mov x20, x0
0000000100003bd0 cbnz x19, 0x100003bdc
0000000100003bd4 b 0x100003bf8
0000000100003bd8 mov x20, x0
0000000100003bdc ldr x0, [x19]
0000000100003be0 str xzr, [x19]
0000000100003be4 cbz x0, 0x100003bf0
0000000100003be8 bl 0x100003cc0 ; symbol stub for: __ZNSt3__115__thread_structD1Ev
0000000100003bec bl 0x100003d44 ; symbol stub for: __ZdlPv
0000000100003bf0 mov x0, x19
0000000100003bf4 bl 0x100003d44 ; symbol stub for: __ZdlPv
0000000100003bf8 mov x0, x20
0000000100003bfc bl 0x100003c6c ; symbol stub for: __Unwind_Resume
__GLOBAL__sub_I_atomic_vs_mutex_cnt.cpp:
0000000100003c00 nop
0000000100003c04 ldr x0, #0x46c ; literal pool symbol address: __ZNSt3__15mutexD1Ev
0000000100003c08 adr x1, #0x43f8
0000000100003c0c nop
0000000100003c10 adr x2, #-0x3c10
0000000100003c14 nop
0000000100003c18 b 0x100003d5c ; symbol stub for: ___cxa_atexit
_main.cold.1:
0000000100003c1c stp x20, x19, [sp, #-0x20]!
0000000100003c20 stp x29, x30, [sp, #0x10]
0000000100003c24 add x29, sp, #0x10
0000000100003c28 mov x19, x1
0000000100003c2c mov x20, x0
0000000100003c30 ldr x0, [x1, #0x8]
0000000100003c34 cmp x0, x20
0000000100003c38 b.eq 0x100003c54
0000000100003c3c sub x0, x0, #0x8
0000000100003c40 bl 0x100003d14 ; symbol stub for: __ZNSt3__16threadD1Ev
0000000100003c44 cmp x0, x20
0000000100003c48 b.ne 0x100003c3c
0000000100003c4c ldr x0, [x19]
0000000100003c50 b 0x100003c58
0000000100003c54 mov x0, x20
0000000100003c58 str x20, [x19, #0x8]
0000000100003c5c bl 0x100003d44 ; symbol stub for: __ZdlPv
0000000100003c60 ldp x29, x30, [sp, #0x10]
0000000100003c64 ldp x20, x19, [sp], #0x20
0000000100003c68 ret
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
sns.set_style("darkgrid")
matplotlib.rcParams["figure.dpi"] = 300
df = pd.read_csv('counter_perf.csv')
atomic_seconds = df[df.isatomic != 0]
atomic_seconds = atomic_seconds.rename(columns={"seconds": "atomic_seconds"})
atomic_seconds.reset_index(inplace=True)
atomic_seconds = atomic_seconds.drop(['isatomic', 'index'], axis=1)
mutex_seconds = df[df.isatomic == 0]
mutex_seconds = mutex_seconds.rename(columns={"seconds": "mutex_seconds"})
mutex_seconds.reset_index(inplace=True)
mutex_seconds = mutex_seconds.drop(['isatomic', 'n_threads', 'index'], axis=1)
x = pd.concat([mutex_seconds, atomic_seconds], axis = 1)
ax = x.set_index('n_threads').plot()
ax.set_ylabel('Seconds')
plt.savefig('mutex_vs_atomic_m2_chart.png')
import time
import subprocess
n_samples = 5
print('n_threads,isatomic,seconds')
for n_threads in range(1, 11):
for sync in [0, 1]:
for run in range(n_samples):
tik = time.time()
subprocess.run(f'./a.out {n_threads} {sync}'.split())
tok = time.time()
print(f'{n_threads},{sync},{tok-tik}')
@dmitryhd
Copy link
Author

mutex_vs_atomic_M2_chart

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment