|
From: <sv...@va...> - 2009-05-22 18:16:45
|
Author: bart
Date: 2009-05-22 19:16:28 +0100 (Fri, 22 May 2009)
New Revision: 10112
Log:
- New command-line parameter: --segment-merging-interval=<n>.
- Performance optimization: further reduced the number of conflict set
updates.
Modified:
branches/DRDDEV/drd/drd_barrier.c
branches/DRDDEV/drd/drd_main.c
branches/DRDDEV/drd/drd_mutex.c
branches/DRDDEV/drd/drd_rwlock.c
branches/DRDDEV/drd/drd_semaphore.c
branches/DRDDEV/drd/drd_thread.c
branches/DRDDEV/drd/drd_thread.h
Modified: branches/DRDDEV/drd/drd_barrier.c
===================================================================
--- branches/DRDDEV/drd/drd_barrier.c 2009-05-22 18:12:46 UTC (rev 10111)
+++ branches/DRDDEV/drd/drd_barrier.c 2009-05-22 18:16:28 UTC (rev 10112)
@@ -466,7 +466,7 @@
if (r != q)
{
tl_assert(r->sg[p->post_iteration]);
- DRD_(thread_combine_vc2)(tid, &r->sg[p->post_iteration]->vc);
+ DRD_(thread_combine_vc2)(tid, r->sg[p->post_iteration]);
}
}
Modified: branches/DRDDEV/drd/drd_main.c
===================================================================
--- branches/DRDDEV/drd/drd_main.c 2009-05-22 18:12:46 UTC (rev 10111)
+++ branches/DRDDEV/drd/drd_main.c 2009-05-22 18:16:28 UTC (rev 10112)
@@ -70,6 +70,7 @@
int first_race_only = -1;
int report_signal_unlocked = -1;
int segment_merging = -1;
+ int segment_merge_interval = -1;
int shared_threshold_ms = -1;
int show_confl_seg = -1;
int trace_barrier = -1;
@@ -88,8 +89,11 @@
if VG_BOOL_CLO(arg, "--check-stack-var", check_stack_accesses) {}
else if VG_BOOL_CLO(arg, "--drd-stats", DRD_(s_print_stats)) {}
else if VG_BOOL_CLO(arg, "--first-race-only", first_race_only) {}
- else if VG_BOOL_CLO(arg,"--report-signal-unlocked",report_signal_unlocked) {}
+ else if VG_BOOL_CLO(arg,"--report-signal-unlocked",report_signal_unlocked)
+ {}
else if VG_BOOL_CLO(arg, "--segment-merging", segment_merging) {}
+ else if VG_INT_CLO (arg, "--segment-merging-interval", segment_merge_interval)
+ {}
else if VG_BOOL_CLO(arg, "--show-confl-seg", show_confl_seg) {}
else if VG_BOOL_CLO(arg, "--show-stack-usage",
DRD_(s_show_stack_usage)) {}
@@ -132,6 +136,8 @@
}
if (segment_merging != -1)
DRD_(thread_set_segment_merging)(segment_merging);
+ if (segment_merge_interval != 1)
+ DRD_(thread_set_segment_merge_interval)(segment_merge_interval);
if (show_confl_seg != -1)
DRD_(set_show_conflicting_segments)(show_confl_seg);
if (trace_address)
@@ -183,6 +189,8 @@
" data race detection algorithm. Disabling segment merging may\n"
" improve the accuracy of the so-called 'other segments' displayed\n"
" in race reports but can also trigger an out of memory error.\n"
+" --segment-merging-interval=<n> Perform segment merging every time n new\n"
+" segments have been created. Default: 32.\n"
" --shared-threshold=<n> Print an error message if a reader lock\n"
" is held longer than the specified time (in milliseconds).\n"
" --show-confl-seg=yes|no Show conflicting segments in race reports [yes].\n"
@@ -582,20 +590,19 @@
DRD_(sg_get_max_segments_alive_count)(),
DRD_(thread_get_discard_ordered_segments_count)());
VG_(message)(Vg_UserMsg,
- " %lld merges.",
+ " %lld merges",
DRD_(sg_get_segment_merge_count)());
VG_(message)(Vg_UserMsg,
- " (%lld m, %lld rw, %lld s, %lld b)",
+ " (%lld mutex, %lld rwlock, %lld semaphore,"
+ " %lld barrier).",
DRD_(get_mutex_segment_creation_count)(),
DRD_(get_rwlock_segment_creation_count)(),
DRD_(get_semaphore_segment_creation_count)(),
DRD_(get_barrier_segment_creation_count)());
VG_(message)(Vg_UserMsg,
- " bitmaps: %lld level 1 / %lld level 2 bitmap refs",
+ " bitmaps: %lld level 1"
+ " and %lld level 2 bitmaps were allocated.",
DRD_(bm_get_bitmap_creation_count)(),
- DRD_(bm_get_bitmap2_node_creation_count)());
- VG_(message)(Vg_UserMsg,
- " and %lld level 2 bitmaps were allocated.",
DRD_(bm_get_bitmap2_creation_count)());
VG_(message)(Vg_UserMsg,
" mutex: %lld non-recursive lock/unlock events.",
Modified: branches/DRDDEV/drd/drd_mutex.c
===================================================================
--- branches/DRDDEV/drd/drd_mutex.c 2009-05-22 18:12:46 UTC (rev 10111)
+++ branches/DRDDEV/drd/drd_mutex.c 2009-05-22 18:16:28 UTC (rev 10112)
@@ -308,7 +308,7 @@
if (last_owner != drd_tid && last_owner != DRD_INVALID_THREADID)
{
tl_assert(p->last_locked_segment);
- DRD_(thread_combine_vc2)(drd_tid, &p->last_locked_segment->vc);
+ DRD_(thread_combine_vc2)(drd_tid, p->last_locked_segment);
}
DRD_(thread_new_segment)(drd_tid);
s_mutex_segment_creation_count++;
Modified: branches/DRDDEV/drd/drd_rwlock.c
===================================================================
--- branches/DRDDEV/drd/drd_rwlock.c 2009-05-22 18:12:46 UTC (rev 10111)
+++ branches/DRDDEV/drd/drd_rwlock.c 2009-05-22 18:16:28 UTC (rev 10112)
@@ -174,7 +174,7 @@
{
if (q->tid != tid && (readers_too || q->last_lock_was_writer_lock))
{
- DRD_(thread_combine_vc2)(tid, &q->last_unlock_segment->vc);
+ DRD_(thread_combine_vc2)(tid, q->last_unlock_segment);
}
}
}
Modified: branches/DRDDEV/drd/drd_semaphore.c
===================================================================
--- branches/DRDDEV/drd/drd_semaphore.c 2009-05-22 18:12:46 UTC (rev 10111)
+++ branches/DRDDEV/drd/drd_semaphore.c 2009-05-22 18:16:28 UTC (rev 10112)
@@ -302,7 +302,7 @@
if (p->last_sem_post_tid != tid
&& p->last_sem_post_tid != DRD_INVALID_THREADID)
{
- DRD_(thread_combine_vc2)(tid, &sg->vc);
+ DRD_(thread_combine_vc2)(tid, sg);
}
DRD_(sg_put)(sg);
DRD_(thread_new_segment)(tid);
Modified: branches/DRDDEV/drd/drd_thread.c
===================================================================
--- branches/DRDDEV/drd/drd_thread.c 2009-05-22 18:12:46 UTC (rev 10111)
+++ branches/DRDDEV/drd/drd_thread.c 2009-05-22 18:16:28 UTC (rev 10112)
@@ -72,6 +72,8 @@
static Bool s_trace_conflict_set = False;
static Bool s_trace_fork_join = False;
static Bool s_segment_merging = True;
+static Bool s_new_segments_since_last_merge;
+static int s_segment_merge_interval = 32;
/* Function definitions. */
@@ -110,6 +112,12 @@
s_segment_merging = m;
}
+/** Set the segment merging interval. */
+void DRD_(thread_set_segment_merge_interval)(const int i)
+{
+ s_segment_merge_interval = i;
+}
+
/**
* Convert Valgrind's ThreadId into a DrdThreadId.
*
@@ -841,6 +849,8 @@
{
unsigned i;
+ s_new_segments_since_last_merge = 0;
+
for (i = 0; i < sizeof(DRD_(g_threadinfo)) / sizeof(DRD_(g_threadinfo)[0]);
i++)
{
@@ -957,7 +967,8 @@
DRD_(thread_discard_ordered_segments)();
- if (s_segment_merging)
+ if (s_segment_merging
+ && ++s_new_segments_since_last_merge >= s_segment_merge_interval)
{
thread_merge_segments();
}
@@ -988,16 +999,27 @@
* synchronization until the memory accesses in the segment with vector clock
* 'vc' finished.
*/
-void DRD_(thread_combine_vc2)(DrdThreadId tid, const VectorClock* const vc)
+void DRD_(thread_combine_vc2)(DrdThreadId tid, const Segment* sg)
{
+ const VectorClock* const vc = &sg->vc;
+
tl_assert(0 <= (int)tid && tid < DRD_N_THREADS
&& tid != DRD_INVALID_THREADID);
tl_assert(DRD_(g_threadinfo)[tid].last);
+ tl_assert(sg);
tl_assert(vc);
- DRD_(vc_combine)(&DRD_(g_threadinfo)[tid].last->vc, vc);
- thread_compute_conflict_set(&DRD_(g_conflict_set), tid);
- DRD_(thread_discard_ordered_segments)();
- s_conflict_set_combine_vc_count++;
+
+ if (tid != sg->tid)
+ {
+ DRD_(vc_combine)(&DRD_(g_threadinfo)[tid].last->vc, vc);
+ thread_compute_conflict_set(&DRD_(g_conflict_set), tid);
+ s_conflict_set_combine_vc_count++;
+ DRD_(thread_discard_ordered_segments)();
+ }
+ else
+ {
+ tl_assert(DRD_(vc_lte)(vc, &DRD_(g_threadinfo)[tid].last->vc));
+ }
}
/**
Modified: branches/DRDDEV/drd/drd_thread.h
===================================================================
--- branches/DRDDEV/drd/drd_thread.h 2009-05-22 18:12:46 UTC (rev 10111)
+++ branches/DRDDEV/drd/drd_thread.h 2009-05-22 18:16:28 UTC (rev 10112)
@@ -116,6 +116,7 @@
Bool DRD_(thread_get_trace_fork_join)(void);
void DRD_(thread_set_trace_fork_join)(const Bool t);
void DRD_(thread_set_segment_merging)(const Bool m);
+void DRD_(thread_set_segment_merge_interval)(const int i);
DrdThreadId DRD_(VgThreadIdToDrdThreadId)(const ThreadId tid);
DrdThreadId DRD_(NewVgThreadIdToDrdThreadId)(const ThreadId tid);
@@ -148,8 +149,7 @@
void DRD_(thread_get_latest_segment)(Segment** sg, const DrdThreadId tid);
void DRD_(thread_combine_vc)(const DrdThreadId joiner,
const DrdThreadId joinee);
-void DRD_(thread_combine_vc2)(const DrdThreadId tid,
- const VectorClock* const vc);
+void DRD_(thread_combine_vc2)(const DrdThreadId tid, const Segment* sg);
void DRD_(thread_stop_using_mem)(const Addr a1, const Addr a2);
void DRD_(thread_start_recording)(const DrdThreadId tid);
|