Browse Source

Have `starpu_handle_to_pointer' return the pointer to lazily-allocated data.

Ludovic Courtès 14 years ago
parent
commit
e4ae862b15
2 changed files with 55 additions and 8 deletions
  1. 8 1
      src/datawizard/interfaces/data_interface.c
  2. 47 7
      tests/datawizard/handle_to_pointer.c

+ 8 - 1
src/datawizard/interfaces/data_interface.c

@@ -265,7 +265,14 @@ void starpu_data_register(starpu_data_handle *handleptr, uint32_t home_node,
 
 void *starpu_handle_to_pointer(starpu_data_handle handle)
 {
-	if (handle->ops->handle_to_pointer && handle->home_node != -1)
+	unsigned int local_node;
+
+	local_node = _starpu_get_local_memory_node();
+
+	/* Check whether the operation is supported and the node has actually
+	 * been allocated.  */
+	if (handle->ops->handle_to_pointer
+	    && starpu_data_test_if_allocated_on_node(handle, local_node))
 	{
 		return handle->ops->handle_to_pointer(handle);
 	}

+ 47 - 7
tests/datawizard/handle_to_pointer.c

@@ -20,17 +20,36 @@
 #include <starpu.h>
 #include <stdlib.h>
 
-#define COUNT 123
+static void task(void **buffers, void *args)
+{
+	float *numbers;
+	size_t size, i;
+
+	numbers = (float *) STARPU_VECTOR_GET_PTR(buffers[0]);
+	starpu_unpack_cl_args (args, &size);
+	for(i = 0; i < size; i++)
+	{
+		numbers[i] = i;
+	}
+}
+
+static starpu_codelet cl = {
+	.where = STARPU_CPU,
+	.cpu_func = task,
+	.nbuffers = 1
+};
 
 int main(int argc, char *argv[])
 {
 	int err;
+	size_t i;
 	void *pointer;
 	starpu_data_handle handle;
+	static const size_t count = 123;
 
 	starpu_init(NULL);
 
-	err = starpu_malloc(&pointer, COUNT * sizeof(float));
+	err = starpu_malloc(&pointer, count * sizeof(float));
 	assert((err == 0) && (pointer != NULL));
 
 	starpu_variable_data_register(&handle, 0, (uintptr_t)pointer,
@@ -39,22 +58,43 @@ int main(int argc, char *argv[])
 	starpu_data_unregister(handle);
 
 	starpu_vector_data_register(&handle, 0, (uintptr_t)pointer,
-				    COUNT, sizeof(float));
+				    count, sizeof(float));
 	assert(starpu_handle_to_pointer(handle) == pointer);
 	starpu_data_unregister(handle);
 
 	starpu_matrix_data_register(&handle, 0, (uintptr_t)pointer, 0,
-				    COUNT, 1, sizeof(float));
+				    count, 1, sizeof(float));
 	assert(starpu_handle_to_pointer(handle) == pointer);
 	starpu_data_unregister(handle);
 
+	starpu_free(pointer);
+	pointer = NULL;
+
 	/* Lazy allocation.  */
 	starpu_vector_data_register(&handle, -1, 0 /* NULL */,
-				    COUNT, sizeof(float));
+				    count, sizeof(float));
 	assert(starpu_handle_to_pointer(handle) == NULL);
-	starpu_data_unregister(handle);
 
-	starpu_free(pointer);
+	/* Pass the handle to a task.  */
+	starpu_insert_task(&cl,
+			   STARPU_W, handle,
+			   STARPU_VALUE, &count, sizeof(count),
+			   0);
+
+	/* Acquire the handle, forcing a local allocation.  */
+	starpu_data_acquire(handle, STARPU_R);
+
+	/* Make sure we have a local pointer to it.  */
+	pointer = starpu_handle_to_pointer(handle);
+	assert(pointer != NULL);
+	for(i = 0; i < count; i++)
+	{
+		float *numbers = (float *)pointer;
+		assert(numbers[i] == i);
+	}
+	starpu_data_release(handle);
+
+	starpu_data_unregister(handle);
 
 	starpu_shutdown();