Beispiel #1
0
static void *
thread(void *b)
{
	ck_barrier_mcs_t *barrier = b;
	ck_barrier_mcs_state_t state;
	int j, counter;
	int i = 0;

	aff_iterate(&a);

	ck_barrier_mcs_subscribe(barrier, &state);

	ck_pr_inc_int(&barrier_wait);
	while (ck_pr_load_int(&barrier_wait) != nthr)
		ck_pr_stall();

	for (j = 0; j < ITERATE; j++) {
		i = j++ & (ENTRIES - 1);
		ck_pr_inc_int(&counters[i]);
		ck_barrier_mcs(barrier, &state);
		counter = ck_pr_load_int(&counters[i]);
		if (counter != nthr * (j / ENTRIES + 1)) {
			fprintf(stderr, "FAILED [%d:%d]: %d != %d\n", i, j - 1, counter, nthr);
			exit(EXIT_FAILURE);
		}
	}

	return (NULL);
}
Beispiel #2
0
static void *
thread(void *group)
{
	ck_barrier_combining_state_t state = CK_BARRIER_COMBINING_STATE_INITIALIZER;
	int j, counter;
	int i = 0;

	aff_iterate(&a);

	ck_pr_inc_int(&barrier_wait);
	while (ck_pr_load_int(&barrier_wait) != (nthr * ngroups))
		ck_pr_stall();

	for (j = 0; j < ITERATE; j++) {
		i = j++ & (ENTRIES - 1);
		ck_pr_inc_int(&counters[i]);
		ck_barrier_combining(&barrier, group, &state);
		counter = ck_pr_load_int(&counters[i]);
		if (counter != nthr * ngroups * (j / ENTRIES + 1)) {
			fprintf(stderr, "FAILED [%d:%d]: %d != %d\n", i, j - 1, counter, nthr * ngroups);
			exit(EXIT_FAILURE);
		}
	}

	return (NULL);
}
Beispiel #3
0
static void *
thread_brlock(void *pun)
{
	uint64_t s_b, e_b, a, i;
	ck_brlock_reader_t r;
	uint64_t *value = pun;

	if (aff_iterate(&affinity) != 0) {
		perror("ERROR: Could not affine thread");
		exit(EXIT_FAILURE);
	}

	ck_brlock_read_register(&brlock, &r);
	ck_pr_inc_int(&barrier);
	while (ck_pr_load_int(&barrier) != threads)
		ck_pr_stall();

	for (i = 1, a = 0;; i++) {
		s_b = rdtsc();
		ck_brlock_read_lock(&brlock, &r);
		ck_brlock_read_unlock(&r);
		ck_brlock_read_lock(&brlock, &r);
		ck_brlock_read_unlock(&r);
		ck_brlock_read_lock(&brlock, &r);
		ck_brlock_read_unlock(&r);
		ck_brlock_read_lock(&brlock, &r);
		ck_brlock_read_unlock(&r);
		ck_brlock_read_lock(&brlock, &r);
		ck_brlock_read_unlock(&r);
		ck_brlock_read_lock(&brlock, &r);
		ck_brlock_read_unlock(&r);
		ck_brlock_read_lock(&brlock, &r);
		ck_brlock_read_unlock(&r);
		ck_brlock_read_lock(&brlock, &r);
		ck_brlock_read_unlock(&r);
		ck_brlock_read_lock(&brlock, &r);
		ck_brlock_read_unlock(&r);
		ck_brlock_read_lock(&brlock, &r);
		ck_brlock_read_unlock(&r);
		ck_brlock_read_lock(&brlock, &r);
		ck_brlock_read_unlock(&r);
		ck_brlock_read_lock(&brlock, &r);
		ck_brlock_read_unlock(&r);
		ck_brlock_read_lock(&brlock, &r);
		ck_brlock_read_unlock(&r);
		ck_brlock_read_lock(&brlock, &r);
		ck_brlock_read_unlock(&r);
		ck_brlock_read_lock(&brlock, &r);
		ck_brlock_read_unlock(&r);
		ck_brlock_read_lock(&brlock, &r);
		ck_brlock_read_unlock(&r);
		e_b = rdtsc();

		a += (e_b - s_b) >> 4;

		if (ck_pr_load_uint(&flag) == 1)
			break;
	}

	ck_pr_inc_int(&barrier);
	while (ck_pr_load_int(&barrier) != threads * 2)
		ck_pr_stall();

	*value = (a / i);
	return NULL;
}
Beispiel #4
0
static void *
thread_lock_rtm(void *pun)
{
	uint64_t s_b, e_b, a, i;
	uint64_t *value = pun;

	if (aff_iterate(&affinity) != 0) {
		perror("ERROR: Could not affine thread");
		exit(EXIT_FAILURE);
	}

	ck_pr_inc_int(&barrier);
	while (ck_pr_load_int(&barrier) != threads)
		ck_pr_stall();

	for (i = 1, a = 0;; i++) {
		s_b = rdtsc();
		CK_ELIDE_LOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_UNLOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_LOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_UNLOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_LOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_UNLOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_LOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_UNLOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_LOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_UNLOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_LOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_UNLOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_LOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_UNLOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_LOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_UNLOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_LOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_UNLOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_LOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_UNLOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_LOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_UNLOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_LOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_UNLOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_LOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_UNLOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_LOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_UNLOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_LOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_UNLOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_LOCK(ck_rwlock_read, &rw.lock);
		CK_ELIDE_UNLOCK(ck_rwlock_read, &rw.lock);
		e_b = rdtsc();

		a += (e_b - s_b) >> 4;

		if (ck_pr_load_uint(&flag) == 1)
			break;
	}

	ck_pr_inc_int(&barrier);
	while (ck_pr_load_int(&barrier) != threads * 2)
		ck_pr_stall();

	*value = (a / i);
	return NULL;
}