[Intel-gfx] [PATCH i-g-t 2/2] igt/gem_fence_upload: Stabilise results

Tvrtko Ursulin tursulin at ursulin.net
Thu Jun 8 09:58:12 UTC 2017


From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>

Most of the subtest were failing on my SKL GT2 and on the
various CI systems as well. Try to fix that by different
tweaks per subtests:

performance:

We cannot say how big the performance drop will be once the
fences are contented, just that there will be one, so modify
the assert accordingly.

thread-performance-*:

Similar to "performance", but also on some machine the peak
performance to compare against seems to be num_cpu dependant
which the biggest aggregate throughput with num_cpu clients.

On other machines the results are more stable so this change
should not affect those.

Also, on some machines writes are much faster than reads which
was making the "-write" subtest a bit unstable. Increased the
number of iterations to hopefully stabilise this.

thread-contention:

Same as "performance" - we don't know how big the drop to
expect.

wc-contention:

This subtest should not expect a tiled performance drop since
CPU WC maps are under test. Change a few things:

1.
Number of iterations was to small causing result instability
on some machines.

2.
There seems to be a performance valley with num_threads ==
num_cpus so do a pre-warm step in those cases which seem to fix
it.

3.
Only assert that the final step is slower than the reference,
and for the reference take the single thred result which looks
to be the fastest.

4.
Check that linear vs tiled results in each step are within
15% tolerance to verify the above attempts to stabilise the
test.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
---
 benchmarks/gem_fence_upload.c | 51 ++++++++++++++++++++++++++++---------------
 1 file changed, 33 insertions(+), 18 deletions(-)

diff --git a/benchmarks/gem_fence_upload.c b/benchmarks/gem_fence_upload.c
index 7d9acdc0fcb3..d656d4ea70f8 100644
--- a/benchmarks/gem_fence_upload.c
+++ b/benchmarks/gem_fence_upload.c
@@ -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
-- 
2.9.4



More information about the Intel-gfx mailing list