[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