Browse Source

starpupy: add two more methods to unpack argument from starpu_codelet_pack_arg_data

HE Kun 4 years ago
parent
commit
af37a41186
3 changed files with 58 additions and 9 deletions
  1. 18 1
      include/starpu_task_util.h
  2. 23 0
      src/util/starpu_task_insert_utils.c
  3. 17 8
      starpupy/src/starpu_task_wrapper.c

+ 18 - 1
include/starpu_task_util.h

@@ -517,11 +517,28 @@ void starpu_codelet_unpack_args(void *cl_arg, ...);
 void starpu_codelet_unpack_arg_init(struct starpu_codelet_pack_arg_data *state, void **cl_arg, size_t *cl_arg_size);
 
 /**
-   Unpack one argument from struct starpu_codelet_pack_arg \p state into ptr.
+   Unpack one argument from struct starpu_codelet_pack_arg \p state into ptr with a copy. 
    That structure has to be initialized before with starpu_codelet_unpack_arg_init().
+   Size is stored in starpu_task->cl_arg, and it is a known parameter in this function .
 */
 void starpu_codelet_unpack_arg(struct starpu_codelet_pack_arg_data *state, void *ptr, size_t size);
 
+/**
+   Unpack one argument from struct starpu_codelet_pack_arg \p state into ptr with a copy.
+   That structure has to be initialized before with starpu_codelet_unpack_arg_init(). 
+   Size is stored in starpu_task->cl_arg, and it is an unknown parameter in this function. 
+   It will be returned from starpu_task->cl_arg with a copy.
+*/
+void starpu_codelet_dup_arg(struct starpu_codelet_pack_arg_data *state, void **ptr, size_t *size);
+
+/**
+   Unpack one argument from struct starpu_codelet_pack_arg \p state into ptr, and the pointer of ptr will be returned.
+   That structure has to be initialized before with starpu_codelet_unpack_arg_init(). 
+   Size is stored in starpu_task->cl_arg, and it is an unknown parameter in this function. 
+   It will be returned from starpu_task->cl_arg with a copy.
+*/
+void starpu_codelet_pick_arg(struct starpu_codelet_pack_arg_data *state, void **ptr, size_t *size); 
+
 void starpu_codelet_unpack_arg_fini(struct starpu_codelet_pack_arg_data *state);
 
 /**

+ 23 - 0
src/util/starpu_task_insert_utils.c

@@ -84,6 +84,29 @@ void starpu_codelet_unpack_arg(struct starpu_codelet_pack_arg_data *state, void
 	state->nargs++;
 }
 
+void starpu_codelet_dup_arg(struct starpu_codelet_pack_arg_data *state, void **ptr, size_t *size)
+{
+	memcpy((void*)size, state->arg_buffer+state->current_offset, sizeof(*size));
+	state->current_offset += sizeof(*size);
+
+	*ptr = malloc(*size);
+	memcpy(*ptr, state->arg_buffer+state->current_offset, *size);
+	state->current_offset += *size;
+
+	state->nargs++;
+}
+
+void starpu_codelet_pick_arg(struct starpu_codelet_pack_arg_data *state, void **ptr, size_t *size)
+{
+	memcpy((void*)size, state->arg_buffer+state->current_offset, sizeof(*size));
+	state->current_offset += sizeof(*size);
+	
+	*ptr = state->arg_buffer+state->current_offset;
+	state->current_offset += *size;
+
+	state->nargs++;
+}
+
 void starpu_codelet_unpack_arg_fini(struct starpu_codelet_pack_arg_data *state)
 {
 

+ 17 - 8
starpupy/src/starpu_task_wrapper.c

@@ -92,14 +92,22 @@ void starpupy_codelet_func(void *buffers[], void *cl_arg)
 	starpu_codelet_unpack_arg_init(&data, &task->cl_arg, &task->cl_arg_size);
 
 	/*get func_py char*/
-	starpu_codelet_unpack_arg(&data, &func_data_size, sizeof(func_data_size));
-    func_data = (char *)malloc(func_data_size);
-    starpu_codelet_unpack_arg(&data, func_data, func_data_size);
+	// starpu_codelet_unpack_arg(&data, &func_data_size, sizeof(func_data_size));
+    // func_data = (char *)malloc(func_data_size);
+    // starpu_codelet_unpack_arg(&data, func_data, func_data_size);
+    /*skip func_data_size*/
+    starpu_codelet_unpack_discard_arg(&data);
+    /*get func_data*/
+    starpu_codelet_pick_arg(&data, &func_data, &func_data_size);
 	//starpu_codelet_unpack_arg(&data, &func_py, sizeof(func_py));
 	/*get argList char*/
-	starpu_codelet_unpack_arg(&data, &arg_data_size, sizeof(arg_data_size));
-    arg_data = (char *)malloc(arg_data_size);
-    starpu_codelet_unpack_arg(&data, arg_data, arg_data_size);
+	// starpu_codelet_unpack_arg(&data, &arg_data_size, sizeof(arg_data_size));
+    // arg_data = (char *)malloc(arg_data_size);
+    // starpu_codelet_unpack_arg(&data, arg_data, arg_data_size);
+    /*skip arg_data_size*/
+    starpu_codelet_unpack_discard_arg(&data);
+    /*get arg_data*/
+    starpu_codelet_pick_arg(&data, &arg_data, &arg_data_size);
 	//starpu_codelet_unpack_arg(&data, &argList, sizeof(argList));
 	/*skip fut*/
 	starpu_codelet_unpack_discard_arg(&data);
@@ -217,8 +225,9 @@ void cb_func(void *v)
 	/*else use cloudpickle to load rv*/
 	else
 	{
-		rv_data = (char *)malloc(rv_data_size);
-    	starpu_codelet_unpack_arg(&data, rv_data, rv_data_size);
+		// rv_data = (char *)malloc(rv_data_size);
+        // starpu_codelet_unpack_arg(&data, rv_data, rv_data_size);
+		starpu_codelet_pick_arg(&data, &rv_data, &rv_data_size);
 		rv=starpu_cloudpickle_loads(rv_data, rv_data_size);
 	}