Kaynağa Gözat

Teach helgrind about other happens before/after given by atomic counters

Samuel Thibault 10 yıl önce
ebeveyn
işleme
1b10c4b468

+ 18 - 2
examples/heat/dw_factolu.c

@@ -24,6 +24,16 @@
 
 #include "dw_factolu.h"
 
+#ifdef STARPU_HAVE_HELGRIND_H
+#include <valgrind/helgrind.h>
+#endif
+#ifndef ANNOTATE_HAPPENS_BEFORE
+#define ANNOTATE_HAPPENS_BEFORE(obj) ((void)0)
+#endif
+#ifndef ANNOTATE_HAPPENS_AFTER
+#define ANNOTATE_HAPPENS_AFTER(obj) ((void)0)
+#endif
+
 #if 0
 #define debug(fmt, ...) fprintf(stderr, fmt, ## __VA_ARGS__)
 #else
@@ -531,9 +541,12 @@ void dw_callback_codelet_update_u22(void *argcb)
 {
 	int ret;
 	cl_args *args = argcb;	
+	unsigned remaining = STARPU_ATOMIC_ADD(args->remaining, (-1));
+	ANNOTATE_HAPPENS_BEFORE(args->remaining);
 
-	if (STARPU_ATOMIC_ADD(args->remaining, (-1)) == 0)
+	if (remaining == 0)
 	{
+		ANNOTATE_HAPPENS_AFTER(args->remaining);
 		/* all worker already used the counter */
 		free(args->remaining);
 
@@ -564,9 +577,12 @@ void dw_callback_codelet_update_u12_21(void *argcb)
 {
 	int ret;
 	cl_args *args = argcb;	
+	unsigned remaining = STARPU_ATOMIC_ADD(args->remaining, -1);
+	ANNOTATE_HAPPENS_BEFORE(args->remaining);
 
-	if (STARPU_ATOMIC_ADD(args->remaining, -1) == 0)
+	if (remaining == 0)
 	{
+		ANNOTATE_HAPPENS_AFTER(args->remaining);
 		/* now launch the update of LU22 */
 		unsigned i = args->i;
 		unsigned nblocks = args->nblocks;

+ 14 - 0
examples/mandelbrot/mandelbrot.c

@@ -30,6 +30,16 @@
 int use_x11 = 1;
 #endif
 
+#ifdef STARPU_HAVE_HELGRIND_H
+#include <valgrind/helgrind.h>
+#endif
+#ifndef ANNOTATE_HAPPENS_BEFORE
+#define ANNOTATE_HAPPENS_BEFORE(obj) ((void)0)
+#endif
+#ifndef ANNOTATE_HAPPENS_AFTER
+#define ANNOTATE_HAPPENS_AFTER(obj) ((void)0)
+#endif
+
 int demo = 0;
 static double demozoom = 0.05;
 
@@ -336,8 +346,12 @@ static void compute_block_spmd(void *descr[], void *cl_arg)
 	while (1)
 	{
 		local_iy = STARPU_ATOMIC_ADD((unsigned int *)pcnt, 1) - 1;
+		ANNOTATE_HAPPENS_BEFORE(pcnt);
 		if (local_iy >= block_size)
+		{
+			ANNOTATE_HAPPENS_AFTER(pcnt);
 			break;
+		}
 
 		iy = iby*block_size + local_iy;
 

+ 13 - 0
examples/spmv/dw_block_spmv.c

@@ -23,6 +23,17 @@
  */
 #include "dw_block_spmv.h"
 #include "matrix_market/mm_to_bcsr.h"
+
+#ifdef STARPU_HAVE_HELGRIND_H
+#include <valgrind/helgrind.h>
+#endif
+#ifndef ANNOTATE_HAPPENS_BEFORE
+#define ANNOTATE_HAPPENS_BEFORE(obj) ((void)0)
+#endif
+#ifndef ANNOTATE_HAPPENS_AFTER
+#define ANNOTATE_HAPPENS_AFTER(obj) ((void)0)
+#endif
+
 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0)
 
 static double start;
@@ -94,12 +105,14 @@ void init_problem_callback(void *arg)
 	unsigned *remaining = arg;
 
 	unsigned val = STARPU_ATOMIC_ADD(remaining, -1);
+	ANNOTATE_HAPPENS_BEFORE(&remaining);
 
 /*	if (val < 10)
 		printf("callback %d remaining \n", val); */
 
 	if ( val == 0 )
 	{
+		ANNOTATE_HAPPENS_AFTER(&remaining);
 		printf("DONE ...\n");
 		end = starpu_timing_now();
 

+ 13 - 1
examples/tag_example/tag_example.c

@@ -1,6 +1,6 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
- * Copyright (C) 2009-2010, 2012-2013  Université de Bordeaux
+ * Copyright (C) 2009-2010, 2012-2013, 2015  Université de Bordeaux
  * Copyright (C) 2010, 2011, 2012, 2013  CNRS
  *
  * StarPU is free software; you can redistribute it and/or modify
@@ -33,6 +33,16 @@
 
 #include <starpu.h>
 
+#ifdef STARPU_HAVE_HELGRIND_H
+#include <valgrind/helgrind.h>
+#endif
+#ifndef ANNOTATE_HAPPENS_BEFORE
+#define ANNOTATE_HAPPENS_BEFORE(obj) ((void)0)
+#endif
+#ifndef ANNOTATE_HAPPENS_AFTER
+#define ANNOTATE_HAPPENS_AFTER(obj) ((void)0)
+#endif
+
 #define FPRINTF(ofile, fmt, ...) do { if (!getenv("STARPU_SSILENT")) {fprintf(ofile, fmt, ## __VA_ARGS__); }} while(0)
 #define TAG(i, j, iter)	((starpu_tag_t) ( ((uint64_t)(iter)<<48) |  ((uint64_t)(j)<<24) | (i)) )
 
@@ -152,9 +162,11 @@ static int create_task_grid(unsigned piter)
 void callback_cpu(void *argcb STARPU_ATTRIBUTE_UNUSED)
 {
 	unsigned newcnt = STARPU_ATOMIC_ADD(&callback_cnt, -1);	
+	ANNOTATE_HAPPENS_BEFORE(&callback_cnt);
 
 	if (newcnt == 0)
 	{
+		ANNOTATE_HAPPENS_AFTER(&callback_cnt);
 		if (++iter < nk)
 		{
 			/* cleanup old grids ... */

+ 3 - 0
include/starpu_config.h.in

@@ -132,4 +132,7 @@ typedef ssize_t starpu_ssize_t;
 #undef STARPU_HAVE_PTHREAD_BARRIER
 #undef STARPU_HAVE_STRUCT_TIMESPEC
 
+/* This is only for building examples */
+#undef STARPU_HAVE_HELGRIND_H
+
 #endif

+ 3 - 1
tests/datawizard/dsm_stress.c

@@ -1,6 +1,6 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
- * Copyright (C) 2010, 2012  Université de Bordeaux
+ * Copyright (C) 2010, 2012, 2015  Université de Bordeaux
  * Copyright (C) 2010, 2011, 2012, 2013  CNRS
  *
  * StarPU is free software; you can redistribute it and/or modify
@@ -45,9 +45,11 @@ static unsigned *v2;
 static void callback(void *arg)
 {
 	unsigned res = STARPU_ATOMIC_ADD(&cnt, -1);
+	ANNOTATE_HAPPENS_BEFORE(&cnt);
 
 	if (res == 0)
 	{
+		ANNOTATE_HAPPENS_AFTER(&cnt);
 		STARPU_PTHREAD_MUTEX_LOCK(&mutex);
 		finished = 1;
 		STARPU_PTHREAD_COND_SIGNAL(&cond);

+ 14 - 0
tests/helper.h

@@ -23,6 +23,10 @@
 #include <valgrind/valgrind.h>
 #endif
 
+#ifdef STARPU_HAVE_HELGRIND_H
+#include <valgrind/helgrind.h>
+#endif
+
 #define STARPU_TEST_SKIPPED 77
 
 //void *ALL_IS_OK = (void *)123456789L;
@@ -73,4 +77,14 @@ static int _starpu_valgrind_print_once STARPU_ATTRIBUTE_UNUSED = 0;
 #  define STARPU_SKIP_IF_VALGRIND
 #endif  /* defined(STARPU_HAVE_VALGRIND_H) && !defined(STARPU_VALGRIND_FULL) */
 
+#ifndef ANNOTATE_HAPPENS_BEFORE
+#define ANNOTATE_HAPPENS_BEFORE(obj) ((void)0)
+#endif
+#ifndef ANNOTATE_HAPPENS_BEFORE_FORGET_ALL
+#define ANNOTATE_HAPPENS_BEFORE_FORGET_ALL(obj) ((void)0)
+#endif
+#ifndef ANNOTATE_HAPPENS_AFTER
+#define ANNOTATE_HAPPENS_AFTER(obj) ((void)0)
+#endif
+
 #endif /* _TESTS_HELPER_H */

+ 3 - 1
tests/main/execute_on_a_specific_worker.c

@@ -1,6 +1,6 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
- * Copyright (C) 2009, 2010, 2012  Université de Bordeaux
+ * Copyright (C) 2009, 2010, 2012, 2015  Université de Bordeaux
  * Copyright (C) 2010, 2011, 2012, 2013  CNRS
  *
  * StarPU is free software; you can redistribute it and/or modify
@@ -44,9 +44,11 @@ static unsigned *v;
 static void callback(void *arg)
 {
 	unsigned res = STARPU_ATOMIC_ADD(&cnt, -1);
+	ANNOTATE_HAPPENS_BEFORE(&cnt);
 
 	if (res == 0)
 	{
+		ANNOTATE_HAPPENS_AFTER(&cnt);
 		STARPU_PTHREAD_MUTEX_LOCK(&mutex);
 		finished = 1;
 		STARPU_PTHREAD_COND_SIGNAL(&cond);

+ 3 - 1
tests/main/regenerate_pipeline.c

@@ -1,6 +1,6 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
- * Copyright (C) 2010-2014  Université de Bordeaux
+ * Copyright (C) 2010-2015  Université de Bordeaux
  * Copyright (C) 2010, 2011, 2012, 2013  CNRS
  *
  * StarPU is free software; you can redistribute it and/or modify
@@ -42,9 +42,11 @@ void callback(void *arg)
 	unsigned res;
 
 	res = STARPU_ATOMIC_ADD(cnt, 1);
+	ANNOTATE_HAPPENS_BEFORE(&cnt);
 
 	if (res == ntasks)
 	{
+		ANNOTATE_HAPPENS_AFTER(&cnt);
 		task->regenerate = 0;
 		FPRINTF(stderr, "Stop !\n");
 

+ 2 - 0
tests/overlap/overlap.c

@@ -44,9 +44,11 @@ static unsigned cnt = NTASKS;
 static void callback(void *arg)
 {
 	unsigned res = STARPU_ATOMIC_ADD(&cnt, -1);
+	ANNOTATE_HAPPENS_BEFORE(&cnt);
 
 	if (res == 0)
 	{
+		ANNOTATE_HAPPENS_AFTER(&cnt);
 		STARPU_PTHREAD_MUTEX_LOCK(&mutex);
 		finished = 1;
 		STARPU_PTHREAD_COND_SIGNAL(&cond);