[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32377] branches/particles-2010/source/ blender/nodes/intern/simulation: * renamed SimTask to "SimJob": jobs are internal struct to manage parallel execution of kernels in multiple threads (invisible to node coders), tasks describe 1-item jobs ( along the lines of OpenCL specs, see clEnqueueTask)

Lukas Toenne lukas.toenne at googlemail.com
Fri Oct 8 12:39:26 CEST 2010


Revision: 32377
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32377
Author:   lukastoenne
Date:     2010-10-08 12:39:26 +0200 (Fri, 08 Oct 2010)

Log Message:
-----------
* renamed SimTask to "SimJob": jobs are internal struct to manage parallel execution of kernels in multiple threads (invisible to node coders), tasks describe 1-item jobs (along the lines of OpenCL specs, see clEnqueueTask)
* added public sim_enqueue_task function, use "task" to enqueue custom 1-item jobs
* added a wait_for_events at input iterator begin to make sure input iterators are using valid data.

Modified Paths:
--------------
    branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.c
    branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.h
    branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c
    branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.h
    branches/particles-2010/source/blender/nodes/intern/simulation/node_tree_simulation.c
    branches/particles-2010/source/blender/nodes/intern/simulation/nodes/SIM_math.c
    branches/particles-2010/source/blender/nodes/intern/simulation/nodes/SIM_set_data.c

Modified: branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.c	2010-10-08 08:56:04 UTC (rev 32376)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.c	2010-10-08 10:39:26 UTC (rev 32377)
@@ -47,7 +47,7 @@
 
 void sim_event_init(SimEvent *event)
 {
-	event->impl = MEM_callocN(sizeof(SimTaskEvent), "SimTaskEvent");
+	event->impl = MEM_callocN(sizeof(SimJobEvent), "SimJobEvent");
 	event->impl->status = SIM_QUEUED;
 }
 
@@ -105,47 +105,47 @@
 }
 #endif
 
-SimTask *sim_enqueue_task(SimExecData *execdata, SimTaskFunction execfunc, void *data, int totitems, int workgroupsize, ListBase *wait_events, ListBase *event_list)
+SimJob *sim_enqueue_job(SimExecData *execdata, SimJobFunction execfunc, void *data, int totitems, int workgroupsize, ListBase *wait_events, ListBase *event_list)
 {
-	SimTask *task= MEM_callocN(sizeof(SimTask), "SimTask");
-	task->data = data;
-	task->execfunc = execfunc;
-	task->totitems = totitems;
-	task->workgroupsize = (workgroupsize > 0 ? workgroupsize : execdata->default_workgroupsize);
-	task->startitem = 0;
-	BLI_duplicatelist(&task->wait_events, wait_events);
-	sim_event_init(&task->event);
+	SimJob *job= MEM_callocN(sizeof(SimJob), "SimJob");
+	job->data = data;
+	job->execfunc = execfunc;
+	job->totitems = totitems;
+	job->workgroupsize = (workgroupsize > 0 ? workgroupsize : execdata->default_workgroupsize);
+	job->startitem = 0;
+	BLI_duplicatelist(&job->wait_events, wait_events);
+	sim_event_init(&job->event);
 	if (event_list)
-		sim_eventlist_append(event_list, &task->event);
+		sim_eventlist_append(event_list, &job->event);
 	
-	if (sim_eventlist_status(&task->wait_events)==SIM_COMPLETE)
-		task->event.impl->status = SIM_SUBMITTED;
+	if (sim_eventlist_status(&job->wait_events)==SIM_COMPLETE)
+		job->event.impl->status = SIM_SUBMITTED;
 	else
-		task->event.impl->status = SIM_QUEUED;
-	BLI_addtail(&execdata->queue, task);
+		job->event.impl->status = SIM_QUEUED;
+	BLI_addtail(&execdata->queue, job);
 	
 	pthread_cond_signal(&execdata->workercond);
 	
-	return task;
+	return job;
 }
 
-void sim_finish_task(SimExecData *execdata, SimTask *task)
+void sim_finish_job(SimExecData *execdata, SimJob *job)
 {
-	task->event.impl->status = SIM_COMPLETE;
-	for (task=task->next; task; task = task->next) {
-		if (sim_event_status(&task->event) == SIM_QUEUED && sim_eventlist_status(&task->wait_events)==SIM_COMPLETE) {
-			/* activate the task */
-			task->event.impl->status = SIM_SUBMITTED;
+	job->event.impl->status = SIM_COMPLETE;
+	for (job=job->next; job; job = job->next) {
+		if (sim_event_status(&job->event) == SIM_QUEUED && sim_eventlist_status(&job->wait_events)==SIM_COMPLETE) {
+			/* activate the job */
+			job->event.impl->status = SIM_SUBMITTED;
 		}
 	}
 }
 
-void sim_free_task(SimExecData *execdata, SimTask *task)
+void sim_free_job(SimExecData *execdata, SimJob *job)
 {
-	BLI_remlink(&execdata->queue, task);
-	sim_event_free(&task->event);
-	BLI_freelistN(&task->wait_events);
-	if (task->data)
-		MEM_freeN(task->data);
-	MEM_freeN(task);
+	BLI_remlink(&execdata->queue, job);
+	sim_event_free(&job->event);
+	BLI_freelistN(&job->wait_events);
+	if (job->data)
+		MEM_freeN(job->data);
+	MEM_freeN(job);
 }

Modified: branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.h
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.h	2010-10-08 08:56:04 UTC (rev 32376)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/SIM_internal.h	2010-10-08 10:39:26 UTC (rev 32377)
@@ -65,7 +65,7 @@
 	#ifdef WITH_OPENCL
 	cl_event impl_cl;
 	#endif
-	struct SimTaskEvent *impl;
+	struct SimJobEvent *impl;
 } SimEvent;
 
 typedef struct SimEventLink {
@@ -73,13 +73,9 @@
 	struct SimEvent event;
 } SimEventLink;
 
-typedef struct SimTaskEvent {
-	SimEventStatus status;
-} SimTaskEvent;
-
-typedef void (*SimTaskFunction)(void *data, int start, int total);
-typedef struct SimTask {
-	struct SimTask *next, *prev;
+typedef void (*SimJobFunction)(void *data, int start, int total);
+typedef struct SimJob {
+	struct SimJob *next, *prev;
 	int active;						/* number of threads working on this task */
 	
 	ListBase wait_events;
@@ -89,9 +85,13 @@
 	int startitem;					/* starting index for the next worker thread */
 	
 	void *data;
-	SimTaskFunction execfunc;
-} SimTask;
+	SimJobFunction execfunc;
+} SimJob;
 
+typedef struct SimJobEvent {
+	SimEventStatus status;
+} SimJobEvent;
+
 typedef struct SimWorkerThread {
 	struct SimExecData *execdata;
 	int num;
@@ -106,8 +106,8 @@
 void sim_create_cl_event_list(struct ListBase *events, int *num_events, cl_event **events_cl);
 #endif
 
-struct SimTask *sim_enqueue_task(struct SimExecData *execdata, SimTaskFunction execfunc, void *data, int totitems, int workgroupsize, struct ListBase *wait_events, struct ListBase *event_list);
-void sim_finish_task(struct SimExecData *execdata, struct SimTask *task);
-void sim_free_task(struct SimExecData *execdata, struct SimTask *task);
+struct SimJob *sim_enqueue_job(struct SimExecData *execdata, SimJobFunction execfunc, void *data, int totitems, int workgroupsize, struct ListBase *wait_events, struct ListBase *event_list);
+void sim_finish_job(struct SimExecData *execdata, struct SimJob *job);
+void sim_free_job(struct SimExecData *execdata, struct SimJob *job);
 
 #endif

Modified: branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c	2010-10-08 08:56:04 UTC (rev 32376)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.c	2010-10-08 10:39:26 UTC (rev 32377)
@@ -495,6 +495,9 @@
 
 void sim_input_begin(SimExecData *execdata, SimSocketStack *sock, SimSocketIterator *iter)
 {
+	/* make sure the input socket is valid */
+	sim_wait_for_events(execdata, &sock->node->inputevents);
+	
 	iter->valid = 1;
 	if (execdata->error) {
 		iter->valid = 0;
@@ -1054,7 +1057,7 @@
 	}
 }
 
-static void exec_kernel_task(void *data, int start, int total)
+static void exec_kernel(void *data, int start, int total)
 {
 	SimKernel *kernel= (SimKernel*)data;
 	int i;
@@ -1087,10 +1090,38 @@
 	else
 #endif
 	{
-		sim_enqueue_task(execdata, exec_kernel_task, kernel, (int)total, 0, wait_events, event_list);
+		sim_enqueue_job(execdata, exec_kernel, kernel, (int)total, 0, wait_events, event_list);
 	}
 }
 
+void sim_task_enqueue(struct SimExecData *execdata, SimKernel *kernel, struct ListBase *wait_events, struct ListBase *event_list)
+{
+	if (execdata->error)
+		return;
+	
+#ifdef WITH_OPENCL
+	if (BKE_opencl_is_active()) {
+		cl_int res;
+		int num_wait_events;
+		cl_event *wait_events_cl;
+		SimEvent event;
+		
+		sim_create_cl_event_list(wait_events, &num_wait_events, &wait_events_cl);
+		res = clEnqueueTask(execdata->opencl_queue, kernel->impl_cl, num_wait_events, wait_events_cl, &event.impl_cl);
+		MEM_freeN(wait_events_cl);
+		sim_eventlist_append(event_list, &event);
+		
+		if (res != CL_SUCCESS) {
+			execdata->error = 1;
+			sprintf(execdata->error_string, "Error enqueueing OpenCL kernel: %s", BKE_opencl_message(res));
+		}
+	}
+	else
+#endif
+	{
+		sim_enqueue_job(execdata, exec_kernel, kernel, 1, 1, wait_events, event_list);
+	}
+}
 
 /***************************/
 /* kernel helper functions */

Modified: branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.h
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.h	2010-10-08 08:56:04 UTC (rev 32376)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/SIM_util.h	2010-10-08 10:39:26 UTC (rev 32377)
@@ -246,6 +246,7 @@
 void sim_kernel_set_node(struct SimExecData *execdata, struct SimKernel *kernel, struct SimNodeStack *node, int num_args);
 void sim_kernel_set_arg(struct SimExecData *execdata, struct SimKernel *kernel, int arg_index, size_t arg_size, const void *arg_value);
 void sim_kernel_enqueue(struct SimExecData *execdata, struct SimKernel *kernel, size_t total, struct ListBase *wait_events, struct ListBase *event_list);
+void sim_task_enqueue(struct SimExecData *execdata, struct SimKernel *kernel, struct ListBase *wait_events, struct ListBase *event_list);
 
 /*******************************/
 /**** Socket Data Iterators ****/

Modified: branches/particles-2010/source/blender/nodes/intern/simulation/node_tree_simulation.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/simulation/node_tree_simulation.c	2010-10-08 08:56:04 UTC (rev 32376)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/node_tree_simulation.c	2010-10-08 10:39:26 UTC (rev 32377)
@@ -732,7 +732,7 @@
 {
 	SimWorkerThread *thread= (SimWorkerThread*)data;
 	SimExecData *execdata= thread->execdata;
-	SimTask *task;
+	SimJob *job;
 	int start, total;
 	
 	pthread_mutex_lock(&execdata->hostmutex);
@@ -742,52 +742,52 @@
 	pthread_cond_signal(&execdata->hostcond);
 	
 	while (1) {
-		for (task=execdata->queue.first; task; task = task->next) {
-			SimEventStatus status= sim_event_status(&task->event);
+		for (job=execdata->queue.first; job; job = job->next) {
+			SimEventStatus status= sim_event_status(&job->event);
 			if (status == SIM_COMPLETE)
 				continue;
-			if (status == SIM_SUBMITTED || (status == SIM_RUNNING && task->startitem < task->totitems))
+			if (status == SIM_SUBMITTED || (status == SIM_RUNNING && job->startitem < job->totitems))
 				break;
 		}
 		
 		#if 1
 		{
 			int t;
-			SimTask *dbgtask;
-			printf("[%d/%d] searching task:\n", thread->num, execdata->totthreads);
-			for (dbgtask=execdata->queue.first, t=0; dbgtask; dbgtask = dbgtask->next, ++t) {
-				printf("[%d/%d] task %d: ", thread->num, execdata->totthreads, t);
-				switch (sim_event_status(&dbgtask->event)) {
+			SimJob *dbgjob;
+			printf("[%d/%d] searching job:\n", thread->num, execdata->totthreads);
+			for (dbgjob=execdata->queue.first, t=0; dbgjob; dbgjob = dbgjob->next, ++t) {
+				printf("[%d/%d] job %d: ", thread->num, execdata->totthreads, t);
+				switch (sim_event_status(&dbgjob->event)) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list