Example #1
0
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);
    }
}
Example #2
0
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);
}