ソースを参照

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 年 前
コミット
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);