예제 #1
0
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];
  }
}
예제 #2
0
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);
    }
}
예제 #3
0
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 {
예제 #4
0
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);
}
예제 #5
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);
}