Browse Source

Add _starpu_allocate_buffer_on_node, to be used by all interfaces to simplify allocation

Samuel Thibault 12 years ago
parent
commit
b7a026b908

+ 3 - 53
src/datawizard/interfaces/variable_interface.c

@@ -200,66 +200,16 @@ size_t starpu_variable_get_elemsize(starpu_data_handle_t handle)
 static ssize_t allocate_variable_buffer_on_node(void *data_interface_, uint32_t dst_node)
 {
 	struct starpu_variable_interface *variable_interface = (struct starpu_variable_interface *) data_interface_;
-
-	unsigned fail = 0;
-	uintptr_t addr = 0;
-	ssize_t allocated_memory;
-
 	size_t elemsize = variable_interface->elemsize;
+	uintptr_t addr = _starpu_allocate_buffer_on_node(dst_node, elemsize);
 
-	enum starpu_node_kind kind = starpu_node_get_kind(dst_node);
-
-#ifdef STARPU_USE_CUDA
-	cudaError_t status;
-#endif
-
-	switch(kind)
-	{
-		case STARPU_CPU_RAM:
-			addr = (uintptr_t)malloc(elemsize);
-			if (!addr)
-				fail = 1;
-			break;
-#ifdef STARPU_USE_CUDA
-		case STARPU_CUDA_RAM:
-			status = cudaMalloc((void **)&addr, elemsize);
-			if (!addr || (status != cudaSuccess))
-			{
-				if (STARPU_UNLIKELY(status != cudaErrorMemoryAllocation))
-					STARPU_CUDA_REPORT_ERROR(status);
-
-				fail = 1;
-			}
-			break;
-#endif
-#ifdef STARPU_USE_OPENCL
-	        case STARPU_OPENCL_RAM:
-			{
-                                int ret;
-				cl_mem ptr;
-                                ret = starpu_opencl_allocate_memory(&ptr, elemsize, CL_MEM_READ_WRITE);
-                                addr = (uintptr_t)ptr;
-				if (ret)
-				{
-					fail = 1;
-				}
-				break;
-			}
-#endif
-		default:
-			STARPU_ABORT();
-	}
-
-	if (fail)
+	if (!addr)
 		return -ENOMEM;
 
-	/* allocation succeeded */
-	allocated_memory = elemsize;
-
 	/* update the data properly in consequence */
 	variable_interface->ptr = addr;
 
-	return allocated_memory;
+	return elemsize;
 }
 
 static void free_variable_buffer_on_node(void *data_interface, uint32_t node)

+ 46 - 0
src/datawizard/memalloc.c

@@ -750,6 +750,52 @@ static size_t _starpu_get_global_mem_size(int dst_node)
 	return global_mem_size;
 }
 
+uintptr_t
+_starpu_allocate_buffer_on_node(uint32_t dst_node, size_t size)
+{
+	uintptr_t addr = 0;
+
+#ifdef STARPU_USE_CUDA
+	cudaError_t status;
+#endif
+
+	switch(starpu_node_get_kind(dst_node))
+	{
+		case STARPU_CPU_RAM:
+			addr = (uintptr_t)malloc(size);
+			break;
+#ifdef STARPU_USE_CUDA
+		case STARPU_CUDA_RAM:
+			status = cudaMalloc((void **)&addr, size);
+			if (!addr || (status != cudaSuccess))
+			{
+				if (STARPU_UNLIKELY(status != cudaErrorMemoryAllocation))
+					STARPU_CUDA_REPORT_ERROR(status);
+
+				addr = 0;
+			}
+			break;
+#endif
+#ifdef STARPU_USE_OPENCL
+	        case STARPU_OPENCL_RAM:
+			{
+                                int ret;
+				cl_mem ptr;
+                                ret = starpu_opencl_allocate_memory(&ptr, size, CL_MEM_READ_WRITE);
+				if (ret)
+					addr = 0;
+				else
+					addr = (uintptr_t)ptr;
+				break;
+			}
+#endif
+		default:
+			STARPU_ABORT();
+	}
+
+	return addr;
+}
+
 /*
  * In order to allocate a piece of data, we try to reuse existing buffers if
  * its possible.

+ 1 - 0
src/datawizard/memalloc.h

@@ -60,6 +60,7 @@ void _starpu_init_mem_chunk_lists(void);
 void _starpu_deinit_mem_chunk_lists(void);
 void _starpu_request_mem_chunk_removal(starpu_data_handle_t handle, unsigned node, int handle_deleted);
 int _starpu_allocate_memory_on_node(starpu_data_handle_t handle, struct _starpu_data_replicate *replicate, unsigned is_prefetch);
+uintptr_t _starpu_allocate_buffer_on_node(uint32_t dst_node, size_t size);
 size_t _starpu_free_all_automatically_allocated_buffers(uint32_t node);
 void _starpu_memchunk_recently_used(struct _starpu_mem_chunk *mc, unsigned node);