void tm_store(TXPARAMS volatile stm_word_t *addr, stm_word_t value) { TX_GET; if (!tx->software) { hytm_store(TXARGS addr, value); } else { stm_store(TXARGS addr, value); } }
static void testnloadnstore(size_t load_nb, size_t store_nb) { uint64_t m_s[MEASURE_NB]; uint64_t m_r[MEASURE_NB]; uint64_t m_w[MEASURE_NB]; uint64_t m_c[MEASURE_NB]; uint64_t m_rdtsc; uint64_t start; uint64_t min; double avg; uint64_t med; unsigned long i; size_t j; stm_tx_attr_t _a = {{.read_only = 0}}; m_rdtsc = ~0UL; for (i = 0; i < MEASURE_NB; i++) { start = rdtsc(); start = rdtsc() - start; if (start < m_rdtsc) m_rdtsc = start; } for (i = 0; i < MEASURE_NB; i++) { sigjmp_buf *_e; start = rdtsc(); _e = stm_start(_a); m_s[i] = rdtsc() - start; sigsetjmp(*_e, 0); for (j = 0; j < load_nb; j++) stm_load(&global_ctr[j]); for (j = 0; j < store_nb; j++) stm_store(&global_ctr[j], (stm_word_t)0); stm_inc_clock(); stm_commit(); } for (i = 0; i < MEASURE_NB; i++) { sigjmp_buf *_e = stm_start(_a); sigsetjmp(*_e, 0); start = rdtsc(); for (j = 0; j < load_nb; j++) stm_load(&global_ctr[j]); m_r[i] = rdtsc() - start; for (j = 0; j < store_nb; j++) stm_store(&global_ctr[j], (stm_word_t)0); stm_inc_clock(); stm_commit(); } for (i = 0; i < MEASURE_NB; i++) { sigjmp_buf *_e = stm_start(_a); sigsetjmp(*_e, 0); for (j = 0; j < load_nb; j++) stm_load(&global_ctr[j]); start = rdtsc(); for (j = 0; j < store_nb; j++) stm_store(&global_ctr[j], (stm_word_t)0); m_w[i] = rdtsc() - start; stm_inc_clock(); stm_commit(); } for (i = 0; i < MEASURE_NB; i++) { sigjmp_buf *_e = stm_start(_a); sigsetjmp(*_e, 0); for (j = 0; j < load_nb; j++) stm_load(&global_ctr[j]); for (j = 0; j < store_nb; j++) stm_store(&global_ctr[j], (stm_word_t)0); stm_inc_clock(); start = rdtsc(); stm_commit(); m_c[i] = rdtsc() - start; } remove_cst_cost(m_s, MEASURE_NB, m_rdtsc); remove_cst_cost(m_r, MEASURE_NB, m_rdtsc); remove_cst_cost(m_w, MEASURE_NB, m_rdtsc); remove_cst_cost(m_c, MEASURE_NB, m_rdtsc); printf("RW transaction - %lu load - %lu store\n", (unsigned long)load_nb, (unsigned long)store_nb); printf("%12s %12s %12s %12s\n", "", "min", "avg", "med"); stats(m_s, MEASURE_NB, &min, &avg, &med); printf("%12s %12lu %12.2f %12lu\n", "start", (unsigned long)min, avg, (unsigned long)med); stats(m_r, MEASURE_NB, &min, &avg, &med); if (load_nb) printf("%12s %12lu %12.2f %12lu\n", "load", (unsigned long)min/load_nb, avg/load_nb, (unsigned long)med/load_nb); stats(m_w, MEASURE_NB, &min, &avg, &med); if (store_nb) printf("%12s %12lu %12.2f %12lu\n", "store", (unsigned long)min/store_nb, avg/store_nb, (unsigned long)med/store_nb); stats(m_c, MEASURE_NB, &min, &avg, &med); printf("%12s %12lu %12.2f %12lu\n", "commit", (unsigned long)min, avg, (unsigned long)med); }