@@ -103,7 +103,7 @@ static void performance(void)
errno = 0;
igt_assert(linear[1] > 0.75 * linear[0]);
- igt_assert(tiled[1] > 0.75 * tiled[0]);
+ igt_assert(tiled[1] < tiled[0]);
}
struct thread_performance {
@@ -155,7 +155,8 @@ static const char *direction_string(unsigned mask)
}
static void thread_performance(unsigned mask)
{
- const int loops = 4096;
+ const int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
+ const int loops = (mask & READ) ? 4096 : 32768;
int n, count;
int fd, num_fences;
double linear[2], tiled[2];
@@ -164,9 +165,11 @@ static void thread_performance(unsigned mask)
num_fences = gem_available_fences(fd);
igt_require(num_fences > 0);
+ igt_require(num_fences > ncpus);
for (count = 2; count < 4*num_fences; count *= 2) {
const int nthreads = (mask & READ ? count : 0) + (mask & WRITE ? count : 0);
+ const int idx = ncpus != count;
struct timeval start, end;
struct thread_performance readers[count];
struct thread_performance writers[count];
@@ -209,8 +212,8 @@ static void thread_performance(unsigned mask)
}
gettimeofday(&end, NULL);
- linear[count != 2] = nthreads * loops / elapsed(&start, &end) / (OBJECT_SIZE / 4096);
- igt_info("%s rate for %d linear surfaces, %d threads: %7.3fMiB/s\n", direction_string(mask), count, nthreads, linear[count != 2]);
+ linear[idx] = nthreads * loops / elapsed(&start, &end) / (OBJECT_SIZE / 4096);
+ igt_info("%s rate for %d linear surfaces, %d threads: %7.3fMiB/s\n", direction_string(mask), count, nthreads, linear[idx]);
for (n = 0; n < count; n++)
gem_set_tiling(fd, handle[n], I915_TILING_X, 1024);
@@ -230,8 +233,8 @@ static void thread_performance(unsigned mask)
}
gettimeofday(&end, NULL);
- tiled[count != 2] = nthreads * loops / elapsed(&start, &end) / (OBJECT_SIZE / 4096);
- igt_info("%s rate for %d tiled surfaces, %d threads: %7.3fMiB/s\n", direction_string(mask), count, nthreads, tiled[count != 2]);
+ tiled[idx] = nthreads * loops / elapsed(&start, &end) / (OBJECT_SIZE / 4096);
+ igt_info("%s rate for %d tiled surfaces, %d threads: %7.3fMiB/s\n", direction_string(mask), count, nthreads, tiled[idx]);
for (n = 0; n < count; n++) {
munmap(ptr[n], OBJECT_SIZE);
@@ -241,7 +244,7 @@ static void thread_performance(unsigned mask)
errno = 0;
igt_assert(linear[1] > 0.75 * linear[0]);
- igt_assert(tiled[1] > 0.75 * tiled[0]);
+ igt_assert(tiled[1] < tiled[0]);
}
struct thread_contention {
@@ -329,13 +332,13 @@ static void thread_contention(void)
errno = 0;
igt_assert(linear[1] > 0.75 * linear[0]);
- igt_assert(tiled[1] > 0.75 * tiled[0]);
+ igt_assert(tiled[1] < tiled[0]);
}
static void wc_contention(void)
{
- const int loops = 4096;
- int n, count;
+ const int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
+ int n, count, order;
int fd, num_fences;
double linear[2], tiled[2];
@@ -344,8 +347,13 @@ static void wc_contention(void)
num_fences = gem_available_fences(fd);
igt_require(num_fences > 0);
+ igt_require(num_fences > ncpus);
- for (count = 1; count < 4*num_fences; count *= 2) {
+ for (count = 1, order = log2(num_fences * 2) + 1;
+ count < 4 * num_fences;
+ count *= 2, order--) {
+ const int loops = 4096 * order * 2;
+ const int idx = 1 != count;
struct timeval start, end;
struct thread_contention threads[count];
@@ -355,15 +363,20 @@ static void wc_contention(void)
threads[n].fd = fd;
}
+ if (count <= ncpus / 2) {
+ for (n = 0; n < count; n++)
+ pthread_create(&threads[n].thread, NULL, wc_mmap, &threads[n]);
+ for (n = 0; n < count; n++)
+ pthread_join(threads[n].thread, NULL);
+ }
gettimeofday(&start, NULL);
for (n = 0; n < count; n++)
pthread_create(&threads[n].thread, NULL, wc_mmap, &threads[n]);
for (n = 0; n < count; n++)
pthread_join(threads[n].thread, NULL);
gettimeofday(&end, NULL);
-
- linear[count != 2] = count * loops / elapsed(&start, &end) / (OBJECT_SIZE / 4096);
- igt_info("Contended upload rate for %d linear threads/wc: %7.3fMiB/s\n", count, linear[count != 2]);
+ linear[idx] = count * loops / elapsed(&start, &end) / (OBJECT_SIZE / 4096);
+ igt_info("Contended upload rate for %d linear threads/wc: %7.3fMiB/s\n", count, linear[idx]);
for (n = 0; n < count; n++)
gem_set_tiling(fd, threads[n].handle, I915_TILING_X, 1024);
@@ -375,17 +388,19 @@ static void wc_contention(void)
pthread_join(threads[n].thread, NULL);
gettimeofday(&end, NULL);
- tiled[count != 2] = count * loops / elapsed(&start, &end) / (OBJECT_SIZE / 4096);
- igt_info("Contended upload rate for %d tiled threads/wc: %7.3fMiB/s\n", count, tiled[count != 2]);
+ tiled[idx] = count * loops / elapsed(&start, &end) / (OBJECT_SIZE / 4096);
+ igt_info("Contended upload rate for %d tiled threads/wc: %7.3fMiB/s\n", count, tiled[idx]);
for (n = 0; n < count; n++) {
gem_close(fd, threads[n].handle);
}
+
+ igt_require(fabs((linear[idx] - tiled[idx]) / linear[idx]) < 0.15);
}
errno = 0;
- igt_assert(linear[1] > 0.75 * linear[0]);
- igt_assert(tiled[1] > 0.75 * tiled[0]);
+ igt_assert(linear[1] < linear[0]);
+ igt_assert(tiled[1] < tiled[0]);
}
igt_main