Corentin Salingue 12 年之前
父节点
当前提交
c3c143fcc8

+ 6 - 0
ChangeLog

@@ -41,7 +41,13 @@ Small features:
   * New functions starpu_data_acquire_cb_sequential_consistency() and
     starpu_data_acquire_on_node_cb_sequential_consistency() which allows
     to enable or disable sequential consistency
+  * New configure option --enable-fxt-lock which enables additional
+    trace events focused on locks behaviour during the execution
 
+Changes:
+  * Fix of the livelock issue discovered while executing applications
+    on a CPU+GPU cluster of machines by adding a maximum trylock 
+    threshold before a blocking lock.
 
 StarPU 1.1.0 (svn revision xxxx)
 ==============================================

+ 7 - 0
doc/doxygen/chapters/configure_options.doxy

@@ -356,6 +356,13 @@ Enable performance debugging through gprof.
 Enable performance model debugging.
 </dd>
 
+<dt>--enable-fxt-lock</dt>
+<dd>
+\anchor enable-fxt-lock
+\addindex __configure__--enable-fxt-lock
+Enable additional trace events which describes locks behaviour.
+</dd>
+
 <dt>--enable-stats</dt>
 <dd>
 \anchor enable-stats

+ 4 - 0
doc/doxygen/chapters/performance_feedback.doxy

@@ -253,6 +253,10 @@ starpu_shutdown(). The trace is a binary file whose name has the form
 <c>/tmp/</c> directory by default, or by the directory specified by
 the environment variable \ref STARPU_FXT_PREFIX.
 
+The additional configure option \ref enable-fxt-lock "--enable-fxt-lock" can 
+be used to generate trace events which describes the locks behaviour during 
+the execution.
+
 \subsection CreatingAGanttDiagram Creating a Gantt Diagram
 
 When the FxT trace file <c>filename</c> has been generated, it is possible to

+ 89 - 112
src/common/thread.c

@@ -84,43 +84,41 @@ int starpu_pthread_mutex_destroy(starpu_pthread_mutex_t *mutex)
 
 int starpu_pthread_mutex_lock(starpu_pthread_mutex_t *mutex)
 {
-	const char *file;   
-	file = strrchr(__FILE__,'/'); 
+	const char *file;
+	file = strrchr(__FILE__,'/');
 	file += sizeof(char);
-	_STARPU_TRACE_LOCKING_MUTEX(file,__LINE__); 
+
+	_STARPU_TRACE_LOCKING_MUTEX(file,__LINE__);
 
 	if (!*mutex) STARPU_PTHREAD_MUTEX_INIT(mutex, NULL);
-	
+
 	xbt_mutex_acquire(*mutex);
-	file = strrchr(__FILE__,'/'); 
-	file += sizeof(char);
-	_STARPU_TRACE_MUTEX_LOCKED(file,__LINE__); 
-	
+
+	_STARPU_TRACE_MUTEX_LOCKED(file,__LINE__);
+
 	return 0;
 }
 
 int starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex)
 {
-	const char *file;   
-	file = strrchr(__FILE__,'/'); 
+	const char *file;
+	file = strrchr(__FILE__,'/');
 	file += sizeof(char);
-	_STARPU_TRACE_UNLOCKING_MUTEX(file,__LINE__); 
+	_STARPU_TRACE_UNLOCKING_MUTEX(file,__LINE__);
 
 	xbt_mutex_release(*mutex);
-	
-	file = strrchr(__FILE__,'/'); 
-	file += sizeof(char);
-	_STARPU_TRACE_MUTEX_UNLOCKED(file,__LINE__); 
-	
+
+	_STARPU_TRACE_MUTEX_UNLOCKED(file,__LINE__);
+
 	return 0;
 }
 
 int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex)
 {
-	const char *file;   
-	file = strrchr(__FILE__,'/'); 
+	const char *file;
+	file = strrchr(__FILE__,'/');
 	file += sizeof(char);
-	_STARPU_TRACE_TRYLOCK_MUTEX(file,__LINE__); 
+	_STARPU_TRACE_TRYLOCK_MUTEX(file,__LINE__);
 
 	xbt_mutex_acquire(*mutex);
 	return 0;
@@ -187,19 +185,17 @@ int starpu_pthread_cond_broadcast(starpu_pthread_cond_t *cond)
 
 int starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex)
 {
-	const char* file;													
-	file = strrchr(__FILE__,'/');							
-	file += sizeof(char);										
-	_STARPU_TRACE_COND_WAIT_BEGIN(file,__LINE__);			
+	const char* file;
+	file = strrchr(__FILE__,'/');
+	file += sizeof(char);
+	_STARPU_TRACE_COND_WAIT_BEGIN(file,__LINE__);
 
 	if (!*cond)
 		STARPU_PTHREAD_COND_INIT(cond, NULL);
 	xbt_cond_wait(*cond, *mutex);
-	
-	file = strrchr(__FILE__,'/');							
-	file += sizeof(char);										
-	_STARPU_TRACE_COND_WAIT_END(file,__LINE__);			
-	
+
+	_STARPU_TRACE_COND_WAIT_END(file,__LINE__);
+
 	return 0;
 }
 
@@ -222,49 +218,43 @@ int starpu_pthread_rwlock_destroy(starpu_pthread_rwlock_t *rwlock)
 
 int starpu_pthread_rwlock_rdlock(starpu_pthread_rwlock_t *rwlock)
 {
-	const char* file;													
-	file = strrchr(__FILE__,'/');							
-	file += sizeof(char);										
-	_STARPU_TRACE_RDLOCKING_RWLOCK(file,__LINE__);			
+	const char* file;
+	file = strrchr(__FILE__,'/');
+	file += sizeof(char);
+	_STARPU_TRACE_RDLOCKING_RWLOCK(file,__LINE__);
 
  	int p_ret = starpu_pthread_mutex_lock(rwlock);
-	
-	file = strrchr(__FILE__,'/');							
-	file += sizeof(char);										
-	_STARPU_TRACE_RWLOCK_RDLOCKED(file,__LINE__);			
-	
+
+	_STARPU_TRACE_RWLOCK_RDLOCKED(file,__LINE__);
+
 	return p_ret;
 }
 
 int starpu_pthread_rwlock_wrlock(starpu_pthread_rwlock_t *rwlock)
 {
-	const char* file;													
-	file = strrchr(__FILE__,'/');							
-	file += sizeof(char);										
-	_STARPU_TRACE_WRLOCKING_RWLOCK(file,__LINE__);			
+	const char* file;
+	file = strrchr(__FILE__,'/');
+	file += sizeof(char);
+	_STARPU_TRACE_WRLOCKING_RWLOCK(file,__LINE__);
 
  	int p_ret = starpu_pthread_mutex_lock(rwlock);
-	
-	file = strrchr(__FILE__,'/');							
-	file += sizeof(char);										
-	_STARPU_TRACE_RWLOCK_WRLOCKED(file,__LINE__);			
-	
+
+	_STARPU_TRACE_RWLOCK_WRLOCKED(file,__LINE__);
+
 	return p_ret;
 }
 
 int starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock)
 {
-	const char* file;													
-	file = strrchr(__FILE__,'/');							
-	file += sizeof(char);										
-	_STARPU_TRACE_UNLOCKING_RWLOCK(file,__LINE__);			
-	
+	const char* file;
+	file = strrchr(__FILE__,'/');
+	file += sizeof(char);
+	_STARPU_TRACE_UNLOCKING_RWLOCK(file,__LINE__);
+
  	int p_ret = starpu_pthread_mutex_unlock(rwlock);
-	
-	file = strrchr(__FILE__,'/');							
-	file += sizeof(char);										
-	_STARPU_TRACE_RWLOCK_UNLOCKED(file,__LINE__);			
-	
+
+	_STARPU_TRACE_RWLOCK_UNLOCKED(file,__LINE__);
+
 	return p_ret;
 }
 
@@ -272,108 +262,95 @@ int starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock)
 
 int starpu_pthread_mutex_lock(starpu_pthread_mutex_t *mutex)
 {
-	const char *file;   
-	file = strrchr(__FILE__,'/'); 
+	const char *file;
+	file = strrchr(__FILE__,'/');
 	file += sizeof(char);
-	_STARPU_TRACE_LOCKING_MUTEX(file,__LINE__); 
+	_STARPU_TRACE_LOCKING_MUTEX(file,__LINE__);
 
-	pthread_mutex_lock(mutex);
+	int p_ret = pthread_mutex_lock(mutex);
 
-	file = strrchr(__FILE__,'/'); 
-	file += sizeof(char);
-	_STARPU_TRACE_MUTEX_LOCKED(file,__LINE__); 
+	_STARPU_TRACE_MUTEX_LOCKED(file,__LINE__);
 
-	return 0;
+	return p_ret;
 }
 
 int starpu_pthread_mutex_unlock(starpu_pthread_mutex_t *mutex)
 {
-	const char *file;   
-	file = strrchr(__FILE__,'/'); 
+	const char *file;
+	file = strrchr(__FILE__,'/');
 	file += sizeof(char);
-	_STARPU_TRACE_UNLOCKING_MUTEX(file,__LINE__); 
+	_STARPU_TRACE_UNLOCKING_MUTEX(file,__LINE__);
 
-	pthread_mutex_unlock(mutex);
+	int p_ret = pthread_mutex_unlock(mutex);
 
-	file = strrchr(__FILE__,'/'); 
-	file += sizeof(char);
-	_STARPU_TRACE_MUTEX_UNLOCKED(file,__LINE__); 
+	_STARPU_TRACE_MUTEX_UNLOCKED(file,__LINE__);
 
-	return 0;
+	return p_ret;
 }
 
 int starpu_pthread_mutex_trylock(starpu_pthread_mutex_t *mutex)
 {
-	const char *file;   
-	file = strrchr(__FILE__,'/'); 
+	const char *file;
+	file = strrchr(__FILE__,'/');
 	file += sizeof(char);
-	_STARPU_TRACE_LOCKING_MUTEX(file,__LINE__); 
+	_STARPU_TRACE_LOCKING_MUTEX(file,__LINE__);
 
-	pthread_mutex_trylock(mutex);
-	return 0;
+	return pthread_mutex_trylock(mutex);
 }
 
 int starpu_pthread_cond_wait(starpu_pthread_cond_t *cond, starpu_pthread_mutex_t *mutex)
 {
-	const char* file;													
-	file = strrchr(__FILE__,'/');							
-	file += sizeof(char);										
-	_STARPU_TRACE_COND_WAIT_BEGIN(file,__LINE__);			
+	const char* file;
+	file = strrchr(__FILE__,'/');
+	file += sizeof(char);
+	_STARPU_TRACE_COND_WAIT_BEGIN(file,__LINE__);
 
- 	pthread_cond_wait(cond, mutex);
+ 	int p_ret = pthread_cond_wait(cond, mutex);
 
-	file = strrchr(__FILE__,'/');							
-	file += sizeof(char);										
-	_STARPU_TRACE_COND_WAIT_END(file,__LINE__);			
+	_STARPU_TRACE_COND_WAIT_END(file,__LINE__);
 
-	return 0;
+	return p_ret;
 }
 
 int starpu_pthread_rwlock_rdlock(starpu_pthread_rwlock_t *rwlock)
 {
-	const char* file;													
-	file = strrchr(__FILE__,'/');							
-	file += sizeof(char);										
-	_STARPU_TRACE_RDLOCKING_RWLOCK(file,__LINE__);			
+	const char* file;
+	file = strrchr(__FILE__,'/');
+	file += sizeof(char);
+	_STARPU_TRACE_RDLOCKING_RWLOCK(file,__LINE__);
 
  	int p_ret = pthread_rwlock_rdlock(rwlock);
-	
-	file = strrchr(__FILE__,'/');							
-	file += sizeof(char);										
-	_STARPU_TRACE_RWLOCK_RDLOCKED(file,__LINE__);			
+
+	_STARPU_TRACE_RWLOCK_RDLOCKED(file,__LINE__);
 
 	return p_ret;
 }
 
 int starpu_pthread_rwlock_wrlock(starpu_pthread_rwlock_t *rwlock)
 {
-	const char* file;													
-	file = strrchr(__FILE__,'/');							
-	file += sizeof(char);										
-	_STARPU_TRACE_WRLOCKING_RWLOCK(file,__LINE__);			
+	const char* file;
+	file = strrchr(__FILE__,'/');
+	file += sizeof(char);
+	_STARPU_TRACE_WRLOCKING_RWLOCK(file,__LINE__);
 
  	int p_ret = pthread_rwlock_wrlock(rwlock);
-	
-	file = strrchr(__FILE__,'/');							
-	file += sizeof(char);										
-	_STARPU_TRACE_RWLOCK_WRLOCKED(file,__LINE__);			
-	
+
+	_STARPU_TRACE_RWLOCK_WRLOCKED(file,__LINE__);
+
 	return p_ret;
 }
 
 int starpu_pthread_rwlock_unlock(starpu_pthread_rwlock_t *rwlock)
 {
-	const char* file;													
-	file = strrchr(__FILE__,'/');							
-	file += sizeof(char);										
-	_STARPU_TRACE_UNLOCKING_RWLOCK(file,__LINE__);			
+	const char* file;
+	file = strrchr(__FILE__,'/');
+	file += sizeof(char);
+	_STARPU_TRACE_UNLOCKING_RWLOCK(file,__LINE__);
 
  	int p_ret = pthread_rwlock_unlock(rwlock);
-	
-	file = strrchr(__FILE__,'/');							
-	file += sizeof(char);										
-	_STARPU_TRACE_RWLOCK_UNLOCKED(file,__LINE__);			
-	
+
+	_STARPU_TRACE_RWLOCK_UNLOCKED(file,__LINE__);
+
 	return p_ret;
 }
 

+ 1 - 1
src/sched_policies/fifo_queues.c

@@ -163,7 +163,7 @@ struct starpu_task *_starpu_fifo_pop_local_task(struct _starpu_fifo_taskq *fifo_
 
 	if (!starpu_task_list_empty(&fifo_queue->taskq))
 	{
-		task = starpu_task_list_pop_back(&fifo_queue->taskq);
+		task = starpu_task_list_pop_front(&fifo_queue->taskq);
 		fifo_queue->ntasks--;
 		_STARPU_TRACE_JOB_POP(task, 0);
 	}