Forráskód Böngészése

Do not compare and interface identifier to STARPU_MULTIFORMAT_ID to determine whether the interface uses multiple format. This allows other interfaces to use multiple formats and to trigger the creation of conversion tasks.

Cyril Roelandt 13 éve
szülő
commit
e332089751

+ 5 - 0
include/starpu_data_interfaces.h

@@ -129,6 +129,8 @@ struct starpu_data_interface_ops
 	enum starpu_data_interface_id interfaceid;
 	/* The size of the interface data descriptor */
 	size_t interface_size;
+
+	int is_multiformat;
 };
 
 void starpu_data_register(starpu_data_handle_t *handleptr, uint32_t home_node,
@@ -398,11 +400,14 @@ void starpu_multiformat_data_register(starpu_data_handle_t *handle,
 
 #define STARPU_MULTIFORMAT_GET_NX(interface)  (((struct starpu_multiformat_interface *)(interface))->nx)
 
+int starpu_is_multiformat_handle(starpu_data_handle_t handle);
+
 enum starpu_data_interface_id starpu_get_handle_interface_id(starpu_data_handle_t handle);
 
 /* Lookup a ram pointer into a StarPU handle */
 extern starpu_data_handle_t starpu_data_lookup(const void *ptr);
 
+
 #ifdef __cplusplus
 }
 #endif

+ 1 - 3
src/core/perfmodel/perfmodel.c

@@ -260,13 +260,11 @@ double starpu_task_expected_conversion_time(struct starpu_task *task,
 
 	for (i = 0; i < task->cl->nbuffers; i++)
 	{
-		enum starpu_data_interface_id id;
 		starpu_data_handle_t handle;
 		struct starpu_task *conversion_task;
 
 		handle = task->handles[i];
-		id = starpu_get_handle_interface_id(handle);
-		if (id != STARPU_MULTIFORMAT_INTERFACE_ID)
+		if (!starpu_is_multiformat_handle(handle))
 			continue;
 
 		if (arch >= STARPU_CPU_DEFAULT && arch < STARPU_CUDA_DEFAULT)

+ 1 - 3
src/core/task.c

@@ -658,9 +658,7 @@ _starpu_task_uses_multiformat_handles(struct starpu_task *task)
 	unsigned i;
 	for (i = 0; i < task->cl->nbuffers; i++)
 	{
-		enum starpu_data_interface_id id;
-		id = starpu_get_handle_interface_id(task->handles[i]);
-		if (id == STARPU_MULTIFORMAT_INTERFACE_ID)
+		if (starpu_is_multiformat_handle(task->handles[i]))
 			return 1;
 	}
 

+ 1 - 2
src/datawizard/filters.c

@@ -269,8 +269,7 @@ void starpu_data_unpartition(starpu_data_handle_t root_handle, uint32_t gatherin
 			starpu_data_unpartition(child_handle, gathering_node);
 
 		/* If this is a multiformat handle, we must convert the data now */
-		unsigned int id = starpu_get_handle_interface_id(child_handle);
-		if (id == STARPU_MULTIFORMAT_INTERFACE_ID &&
+		if (starpu_is_multiformat_handle(child_handle) &&
 			starpu_node_get_kind(child_handle->mf_node) != STARPU_CPU_RAM)
 		{
 			struct starpu_codelet cl =

+ 7 - 3
src/datawizard/interfaces/data_interface.c

@@ -91,6 +91,11 @@ starpu_data_handle_t starpu_data_lookup(const void *ptr)
 	return result;
 }
 
+int
+starpu_is_multiformat_handle(starpu_data_handle_t handle)
+{
+	return handle->ops->is_multiformat;
+}
 /*
  * Start monitoring a piece of data
  */
@@ -450,12 +455,11 @@ static void _starpu_data_unregister(starpu_data_handle_t handle, unsigned cohere
 			_starpu_release_data_on_node(handle, 0, &handle->per_node[home_node]);
 		}
 
-		/* If this handle uses the multiformat interface, we may have to convert
+		/* If this handle uses a multiformat interface, we may have to convert
 		 * this piece of data back into the CPU format.
 		 * XXX : This is quite hacky, could we submit a task instead ?
 		 */
-		enum starpu_data_interface_id id = starpu_get_handle_interface_id(handle);
-		if (id == STARPU_MULTIFORMAT_INTERFACE_ID &&
+		if (starpu_is_multiformat_handle(handle) &&
 			starpu_node_get_kind(handle->mf_node) != STARPU_CPU_RAM)
 		{
 			_STARPU_DEBUG("Conversion needed\n");

+ 2 - 2
src/datawizard/interfaces/multiformat_interface.c

@@ -79,7 +79,6 @@ static uint32_t starpu_multiformat_get_nx(starpu_data_handle_t handle);
 static int convert_multiformat_to_gordon(void *data_interface, uint64_t *ptr, gordon_strideSize_t *ss);
 #endif
 
-
 static struct starpu_data_interface_ops interface_multiformat_ops =
 {
 	.register_data_handle  = register_multiformat_handle,
@@ -95,7 +94,8 @@ static struct starpu_data_interface_ops interface_multiformat_ops =
 #endif
 	.interfaceid           = STARPU_MULTIFORMAT_INTERFACE_ID,
 	.interface_size        = sizeof(struct starpu_multiformat_interface),
-	.display               = display_multiformat_interface
+	.display               = display_multiformat_interface,
+	.is_multiformat        = 1,
 };
 
 static void *multiformat_handle_to_pointer(starpu_data_handle_t handle, uint32_t node)

+ 1 - 2
src/datawizard/user_interactions.c

@@ -207,8 +207,7 @@ int starpu_data_acquire(starpu_data_handle_t handle, enum starpu_access_mode mod
 		return -EDEADLK;
         }
 
-	enum starpu_data_interface_id id = starpu_get_handle_interface_id(handle);
-	if (id == STARPU_MULTIFORMAT_INTERFACE_ID &&
+	if (starpu_is_multiformat_handle(handle) &&
 	    _starpu_handle_needs_conversion_task(handle, 0))
 	{
 		struct starpu_task *task = _starpu_create_conversion_task(handle, 0);