瀏覽代碼

add copy disk to disk function

Corentin Salingue 12 年之前
父節點
當前提交
772f2198d6
共有 4 個文件被更改,包括 40 次插入8 次删除
  1. 7 0
      include/starpu_disk.h
  2. 25 1
      src/core/disk.c
  3. 4 0
      src/datawizard/coherency.c
  4. 4 7
      src/drivers/disk/driver_disk.c

+ 7 - 0
include/starpu_disk.h

@@ -31,6 +31,7 @@ struct disk_ops {
 	/* readv, writev, read2d, write2d, etc. */
 	 void *  (*plug)   (void *parameter);
 	 void    (*unplug) (void *base);
+	  int    (*copy)   (void *base_src, void* obj_src, off_t offset_src,  void *base_dst, void* obj_dst, off_t offset_dst, size_t size);
 	 void    (*bandwidth) (void *base, unsigned node);
 };
 
@@ -54,4 +55,10 @@ ssize_t starpu_disk_read(unsigned node, void *obj, void *buf, off_t offset, size
 
 ssize_t starpu_disk_write(unsigned node, void *obj, const void *buf, off_t offset, size_t size);
 
+int starpu_disk_copy(unsigned node_src, void* obj_src, off_t offset_src, unsigned node_dst, void* obj_dst, off_t offset_dst, size_t size);
+
+/* interface to compare memory disk */
+
+int starpu_is_same_kind_disk(unsigned node1, unsigned node2);
+
 #endif /* __STARPU_DISK_H__ */

+ 25 - 1
src/core/disk.c

@@ -120,7 +120,6 @@ starpu_disk_free(unsigned node, void *obj, size_t size)
 	disk_register_list[pos]->functions->free(disk_register_list[pos]->base, obj, size);
 }
 
-
 ssize_t 
 starpu_disk_read(unsigned node, void *obj, void *buf, off_t offset, size_t size)
 {
@@ -136,6 +135,17 @@ starpu_disk_write(unsigned node, void *obj, const void *buf, off_t offset, size_
 	return disk_register_list[pos]->functions->write(disk_register_list[pos]->base, obj, buf, offset, size);
 }
 
+int
+starpu_disk_copy(unsigned node_src, void* obj_src, off_t offset_src, unsigned node_dst, void* obj_dst, off_t offset_dst, size_t size)
+{
+	int pos_src = get_location_with_node(node_src);
+	int pos_dst = get_location_with_node(node_dst);
+	/* both nodes have same copy function */
+	return disk_register_list[pos_src]->functions->copy(disk_register_list[pos_src]->base, void* obj_src, off_t offset_src, 
+						        disk_register_list[pos_dst]->base, void* obj_dst, off_t offset_dst,
+							size_t size);
+
+}
 
 static void 
 add_disk_in_list(unsigned node,  struct disk_ops * func, void * base)
@@ -181,6 +191,19 @@ get_location_with_node(unsigned node)
 	return -1;
 }
 
+int 
+starpu_is_same_kind_disk(unsigned node1, unsigned node2)
+{
+	
+	if(starpu_node_get_kind(node1) == STARPU_DISK_RAM && starpu_node_get_kind(node2) == STARPU_DISK_RAM)
+	{
+		int pos1 = get_location_with_node(node1);
+		int pos2 = get_location_with_node(node2);
+		if(disk_register_list[pos1]->functions == disk_register_list[pos2]->functions)
+			return 1;
+	}
+	return 0;
+}
 
 /* ------------------- use STDIO to write on disk -------------------  */
 
@@ -415,5 +438,6 @@ struct disk_ops write_on_file = {
 	.write = starpu_stdio_write,
 	.plug = starpu_stdio_plug,
 	.unplug = starpu_stdio_unplug,
+	.copy = NULL,
 	.bandwidth = get_stdio_bandwidth_between_disk_and_main_ram
 };

+ 4 - 0
src/datawizard/coherency.c

@@ -241,6 +241,10 @@ static int link_supports_direct_transfers(starpu_data_handle_t handle, unsigned
 		return 1;
 	}
 
+	/* link between disk and disk, and they have the same kind */
+	if (starpu_is_same_kind_disk(src_node, dst_node))
+		return 1;
+
 	return 0;
 }
 

+ 4 - 7
src/drivers/disk/driver_disk.c

@@ -37,13 +37,10 @@ int _starpu_disk_copy_disk_to_src(void * src, size_t src_offset, unsigned src_no
 
 int _starpu_disk_copy_disk_to_disk(void * src, size_t src_offset, unsigned src_node, void * dst, size_t dst_offset, unsigned dst_node, size_t size)
 {
-	void * tmp = malloc(size*sizeof(char));
+	STARPU_ASSERT(starpu_node_get_kind(src_node) == STARPU_DISK_RAM && starpu_node_get_kind(dst_node) == STARPU_DISK_RAM);
 
-	starpu_disk_read(src_node, src, tmp, src_offset, size);
+       return starpu_disk_copy(unsigned node_src, void* obj_src, off_t offset_src, 
+			       unsigned node_dst, void* obj_dst, off_t offset_dst,
+			       size_t size);
 
-	starpu_disk_write(dst_node, dst, tmp, dst_offset, size);
-
-	free(tmp);
-
-	return 0;
 }