Browse Source

bandwidth: prevent compiler from optimizing some loops away

Samuel Thibault 5 years ago
parent
commit
9188b0341a
1 changed files with 21 additions and 10 deletions
  1. 21 10
      tests/microbenchs/bandwidth.c

+ 21 - 10
tests/microbenchs/bandwidth.c

@@ -39,32 +39,30 @@ static unsigned iter = 30;
 static unsigned total_ncpus;
 static starpu_pthread_barrier_t barrier;
 static float *result;
+static void **buffers;
 
 void bw_func(void *descr[], void *arg)
 {
-	void *src;
-	void *dst;
+	void *src = buffers[starpu_worker_get_id()];
+	void *dst = src + size;
 	unsigned i;
 	double start, stop;
 	int ret;
 
-	ret = posix_memalign(&src, getpagesize(), size);
-	STARPU_ASSERT(ret == 0);
-	ret = posix_memalign(&dst, getpagesize(), size);
-	STARPU_ASSERT(ret == 0);
 	memset(src, 0, size);
+	memset(dst, 0, size);
 
 	STARPU_PTHREAD_BARRIER_WAIT(&barrier);
 	start = starpu_timing_now();
 	for (i = 0; i < iter; i++)
+	{
 		memcpy(dst, src, size);
+		STARPU_SYNCHRONIZE();
+	}
 	stop = starpu_timing_now();
 	STARPU_PTHREAD_BARRIER_WAIT(&barrier);
 
 	result[starpu_worker_get_id()] = (size*iter) / (stop - start);
-
-	free(src);
-	free(dst);
 }
 
 static struct starpu_codelet bw_codelet =
@@ -189,9 +187,19 @@ int main(int argc, char **argv)
 	starpu_shutdown();
 
 	result = malloc(total_ncpus * sizeof(result[0]));
+	buffers = malloc(total_ncpus * sizeof(*buffers));
+	for (n = 0; n < total_ncpus; n++)
+	{
+#ifdef STARPU_HAVE_POSIX_MEMALIGN
+		ret = posix_memalign(&buffers[n], getpagesize(), 2*size);
+		STARPU_ASSERT(ret == 0);
+#else
+		buffers[n] = malloc(2*size);
+#endif
+	}
 
 	printf("# nw\talone\t\t+idle\t\tefficiency\talone int.l\t+idle int.l\tefficiency\n");
-	for (n = 1; n <= total_ncpus; n += cpustep)
+	for (n = cpustep; n <= total_ncpus; n += cpustep)
 	{
 		if (noalone)
 		{
@@ -211,6 +219,9 @@ int main(int argc, char **argv)
 
 	free(result);
 
+	for (n = 0; n < total_ncpus; n++)
+		free(buffers[n]);
+
 	return EXIT_SUCCESS;
 
 enodev: