uint8_t stm_load_u8(TXPARAMS volatile uint8_t *addr) { if (sizeof(stm_word_t) == 4) { convert_32_t val; val.u32 = (uint32_t)stm_load(TXARGS (volatile stm_word_t *)((uintptr_t)addr & ~(uintptr_t)0x03)); return val.u8[(uintptr_t)addr & 0x03]; } else { convert_64_t val; val.u64 = (uint64_t)stm_load(TXARGS (volatile stm_word_t *)((uintptr_t)addr & ~(uintptr_t)0x07)); return val.u8[(uintptr_t)addr & 0x07]; } }
stm_word_t tm_load(TXPARAMS volatile stm_word_t *addr) { TX_GET; if (!tx->software) { return hytm_load(TXARGS addr); } else { return stm_load(TXARGS addr); } }
uint16_t stm_load_u16(TXPARAMS volatile uint16_t *addr) { if (((uintptr_t)addr & 0x01) != 0) { uint16_t val; stm_load_bytes(TXARGS (volatile uint8_t *)addr, (uint8_t *)&val, sizeof(uint16_t)); return val; } else if (sizeof(stm_word_t) == 4) { convert_32_t val; val.u32 = (uint32_t)stm_load(TXARGS (volatile stm_word_t *)((uintptr_t)addr & ~(uintptr_t)0x03)); return val.u16[((uintptr_t)addr & 0x03) >> 1]; } else {
static void test1load(int ro) { uint64_t m_s[MEASURE_NB]; uint64_t m_r[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; stm_tx_attr_t _a = {{.read_only = ro}}; 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); stm_load(&global_ctr[0]); stm_inc_clock(); stm_commit(); } for (i = 0; i < MEASURE_NB; i++) { sigjmp_buf *_e = stm_start(_a); sigsetjmp(*_e, 0); start = rdtsc(); stm_load(&global_ctr[0]); m_r[i] = rdtsc() - start; stm_inc_clock(); stm_commit(); } for (i = 0; i < MEASURE_NB; i++) { sigjmp_buf *_e = stm_start(_a); sigsetjmp(*_e, 0); stm_load(&global_ctr[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_c, MEASURE_NB, m_rdtsc); if (ro) printf("RO transaction - 1 load\n"); else printf("RW transaction - 1 load\n"); 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); printf("%12s %12lu %12.2f %12lu\n", "load", (unsigned long)min, avg, (unsigned long)med); stats(m_c, MEASURE_NB, &min, &avg, &med); printf("%12s %12lu %12.2f %12lu\n", "commit", (unsigned long)min, avg, (unsigned long)med); }
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); }