CLG_(instrument_state) = CLG_(clo).instrument_atstart;
if (VG_(clo_verbosity > 0)) {
- VG_(message)(Vg_UserMsg, "");
VG_(message)(Vg_UserMsg,
"For interactive control, run 'callgrind_control -h'.");
}
noinst_SCRIPTS = filter_stderr
-EXTRA_DIST = clreq.vgtest clreq.stderr.exp
+EXTRA_DIST = clreq.vgtest clreq.stderr.exp \
+ simwork1.vgtest simwork1.stdout.exp simwork1.stderr.exp \
+ simwork2.vgtest simwork2.stdout.exp simwork2.stderr.exp \
+ simwork3.vgtest simwork3.stdout.exp simwork3.stderr.exp \
+ threads.vgtest threads.stderr.exp
-check_PROGRAMS = clreq
+check_PROGRAMS = clreq simwork threads
AM_CPPFLAGS = -I$(top_srcdir)/include
AM_CFLAGS = $(WERROR) -Winline -Wall -Wshadow -g $(AM_FLAG_M3264_PRI)
-
+threads_LDADD = -lpthread
+
+
+Events : Ir
+Collected :
+
+I refs:
prog: clreq
-vgopts: -q
+vgopts:
cleanup: rm callgrind.out.*
# Remove "Callgrind, ..." line and the following copyright line.
sed "/^Callgrind, a call-graph generating cache profiler./ , /./ d" |
+# Remove pointer to callgrind_control
+sed "/^For interactive control,.*$/d" |
+
+# Remove numbers from "Collected" line
+sed "s/^\(Collected *:\)[ 0-9]*$/\1/" |
+
# Remove numbers from I/D/L2 "refs:" lines
sed "s/\(\(I\|D\|L2\) *refs:\)[ 0-9,()+rdw]*$/\1/" |
--- /dev/null
+// Some work exercising the cache simulator
+// with a simple call graph
+
+#include "../callgrind.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define SIZE 100000
+
+double *a, *b, *c;
+
+void init()
+{
+ int i;
+ for(i = 0; i< SIZE; i++) a[i] = b[i] = 1.0;
+}
+
+void do_add()
+{
+ int i;
+ for(i = 0; i< SIZE; i++) {
+ a[i] += 1.0;
+ c[i] = a[i] + b[i];
+ }
+}
+
+double do_sum()
+{
+ int i;
+ double sum=0.0;
+
+ do_add();
+ for(i = 0; i< SIZE; i++) sum += c[i];
+
+ return sum;
+}
+
+double do_some_work(int iter)
+{
+ double sum=0.0;
+
+ if (iter > 0) sum += do_some_work(iter-1);
+ do_add();
+ sum += do_sum();
+
+ return sum;
+}
+
+int main(void)
+{
+ double res;
+
+ a = (double*) malloc(SIZE * sizeof(double));
+ b = (double*) malloc(SIZE * sizeof(double));
+ c = (double*) malloc(SIZE * sizeof(double));
+
+ CALLGRIND_ZERO_STATS;
+ init();
+ res = do_some_work(1);
+ CALLGRIND_DUMP_STATS;
+
+ printf("Sum: %.0f\n", res);
+ return RUNNING_ON_VALGRIND;
+}
+
--- /dev/null
+
+
+Events : Ir Dr Dw I1mr D1mr D1mw I2mr D2mr D2mw
+Collected :
+
+I refs:
+I1 misses:
+L2i misses:
+I1 miss rate:
+L2i miss rate:
+
+D refs:
+D1 misses:
+L2d misses:
+D1 miss rate:
+L2d miss rate:
+
+L2 refs:
+L2 misses:
+L2 miss rate:
--- /dev/null
+Sum: 1000000
--- /dev/null
+prog: simwork
+vgopts: --simulate-hwpref=yes
+cleanup: rm callgrind.out.*
--- /dev/null
+
+
+Events : Ir Dr Dw I1mr D1mr D1mw I2mr D2mr D2mw I2dmr D2dmr D2dmw
+Collected :
+
+I refs:
+I1 misses:
+L2i misses:
+I1 miss rate:
+L2i miss rate:
+
+D refs:
+D1 misses:
+L2d misses:
+D1 miss rate:
+L2d miss rate:
+
+L2 refs:
+L2 misses:
+L2 miss rate:
--- /dev/null
+Sum: 1000000
--- /dev/null
+prog: simwork
+vgopts: --simulate-wb=yes --simulate-hwpref=yes
+cleanup: rm callgrind.out.*
--- /dev/null
+
+
+Events : Ir Dr Dw I1mr D1mr D1mw I2mr D2mr D2mw AcCost1 SpLoss1 AcCost2 SpLoss2
+Collected :
+
+I refs:
+I1 misses:
+L2i misses:
+I1 miss rate:
+L2i miss rate:
+
+D refs:
+D1 misses:
+L2d misses:
+D1 miss rate:
+L2d miss rate:
+
+L2 refs:
+L2 misses:
+L2 miss rate:
--- /dev/null
+Sum: 1000000
--- /dev/null
+prog: simwork
+vgopts: --cacheuse=yes
+cleanup: rm callgrind.out.*
--- /dev/null
+/* A simple example with 4 threads */
+
+#include <pthread.h>
+#include <unistd.h>
+
+double a[1000];
+
+static void init()
+{
+ int i;
+ for(i=0;i<1000;i++) a[i] = (double)i;
+}
+
+static void *th(void *v)
+{
+ double sum = 0.0;
+ int i,j;
+
+ for(j=0;j<1000;j++)
+ for(i=0;i<1000;i++)
+ sum += a[i];
+
+ *( (double*)v ) = sum;
+
+ /* make sure that no threads is so fast that it finishes
+ * before last thread is created, thus reusing the TID */
+ sleep(1);
+
+ return 0;
+}
+
+int main()
+{
+ pthread_t t[4];
+ double sum[4];
+ int i;
+
+ init();
+
+ for(i=0;i<4;i++)
+ pthread_create(&t[i], NULL, th, &sum[i]);
+
+ for(i=0;i<4;i++)
+ pthread_join(t[i], NULL);
+
+ return 0;
+}
--- /dev/null
+
+
+Events : Ir
+Collected :
+
+I refs:
--- /dev/null
+prog: threads
+vgopts: --separate-threads=yes
+cleanup: rm callgrind.out.*