|
@@ -1,6 +1,6 @@
|
|
|
/* StarPU --- Runtime system for heterogeneous multicore architectures.
|
|
|
*
|
|
|
- * Copyright (C) 2009-2015 Université de Bordeaux
|
|
|
+ * Copyright (C) 2009-2015, 2020 Université de Bordeaux
|
|
|
* Copyright (C) 2010 Mehdi Juhoor <mjuhoor@gmail.com>
|
|
|
* Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS
|
|
|
* Copyright (C) 2011 Télécom-SudParis
|
|
@@ -466,6 +466,16 @@ printf("fpga to ram, fpga @= %p\n",src);
|
|
|
return 0;
|
|
|
//LMemLoopback_readLMem(src, size, dst);
|
|
|
}
|
|
|
+/* Transfert SIZE bytes from the address pointed by SRC in the SRC_NODE memory
|
|
|
+ * node to the address pointed by DST in the DST_NODE memory node
|
|
|
+ */
|
|
|
+int _starpu_fpga_copy_fpga_to_fpga(void *src, void *dst, size_t size)
|
|
|
+{
|
|
|
+printf("fpga to ram, fpga @= %p\n",src);
|
|
|
+ memcpy(dst,src,size);
|
|
|
+ return 0;
|
|
|
+ //LMemLoopback_XXXLMem(src, size, dst);
|
|
|
+}
|
|
|
|
|
|
/* Asynchronous transfers */
|
|
|
int _starpu_fpga_copy_ram_to_fpga_async(void *src, void *dst, size_t size)
|
|
@@ -528,6 +538,85 @@ void _starpu_fpga_transfer_data(void *buffers[], struct _starpu_job *j, int chnl
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+int _starpu_fpga_copy_data_from_cpu_to_fpga(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t ssize, struct _starpu_async_channel *async_channel)
|
|
|
+{
|
|
|
+ return _starpu_fpga_copy_ram_to_fpga(src + src_offset, dst + dst_offset, size);
|
|
|
+}
|
|
|
+
|
|
|
+int _starpu_fpga_copy_data_from_fpga_to_cpu(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t ssize, struct _starpu_async_channel *async_channel)
|
|
|
+{
|
|
|
+ return _starpu_fpga_copy_fpga_to_ram(src + src_offset, dst + dst_offset, size);
|
|
|
+}
|
|
|
+
|
|
|
+int _starpu_fpga_copy_data_from_fpga_to_fpga(uintptr_t src, size_t src_offset, unsigned src_node, uintptr_t dst, size_t dst_offset, unsigned dst_node, size_t ssize, struct _starpu_async_channel *async_channel)
|
|
|
+{
|
|
|
+ return _starpu_fpga_copy_fpga_to_fpga(src + src_offset, dst + dst_offset, size);
|
|
|
+}
|
|
|
+
|
|
|
+int _starpu_fpga_copy_interface_from_fpga_to_cpu(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req)
|
|
|
+{
|
|
|
+ int src_kind = starpu_node_get_kind(src_node);
|
|
|
+ int dst_kind = starpu_node_get_kind(dst_node);
|
|
|
+
|
|
|
+ STARPU_ASSERT(src_kind == STARPU_FPGA_RAM && dst_kind == STARPU_CPU_RAM);
|
|
|
+
|
|
|
+ const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods;
|
|
|
+ if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_fpga_copy_disabled() ||
|
|
|
+ !(copy_methods->fpga_to_ram_async || copy_methods->any_to_any))
|
|
|
+ {
|
|
|
+ /* this is not associated to a request so it's synchronous */
|
|
|
+ STARPU_ASSERT(copy_methods->fpga_to_ram || copy_methods->any_to_any);
|
|
|
+ if (copy_methods->fpga_to_ram)
|
|
|
+ copy_methods->fpga_to_ram(src_interface, src_node, dst_interface, dst_node);
|
|
|
+ else
|
|
|
+ copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //req->async_channel.type = STARPU_FPGA_RAM;
|
|
|
+ if (copy_methods->fpga_to_ram_async)
|
|
|
+ copy_methods->fpga_to_ram_async(src_interface, src_node, dst_interface, dst_node);
|
|
|
+ else
|
|
|
+ {
|
|
|
+ STARPU_ASSERT(copy_methods->any_to_any);
|
|
|
+ copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, &req->async_channel);
|
|
|
+ }
|
|
|
+ //_starpu_fpga_init_event(&(req->async_channel.event.fpga_event), src_node);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+int _starpu_fpga_copy_interface_from_cpu_to_fpga(starpu_data_handle_t handle, void *src_interface, unsigned src_node, void *dst_interface, unsigned dst_node, struct _starpu_data_request *req)
|
|
|
+{
|
|
|
+ int src_kind = starpu_node_get_kind(src_node);
|
|
|
+ int dst_kind = starpu_node_get_kind(dst_node);
|
|
|
+ STARPU_ASSERT(src_kind == STARPU_CPU_RAM && dst_kind == STARPU_FPGA_RAM);
|
|
|
+
|
|
|
+ const struct starpu_data_copy_methods *copy_methods = handle->ops->copy_methods;
|
|
|
+
|
|
|
+ if (!req || starpu_asynchronous_copy_disabled() || starpu_asynchronous_fpga_copy_disabled() ||
|
|
|
+ !(copy_methods->ram_to_fpga_async || copy_methods->any_to_any))
|
|
|
+ {
|
|
|
+ /* this is not associated to a request so it's synchronous */
|
|
|
+ STARPU_ASSERT(copy_methods->ram_to_fpga || copy_methods->any_to_any);
|
|
|
+ if (copy_methods->ram_to_fpga)
|
|
|
+ copy_methods->ram_to_fpga(src_interface, src_node, dst_interface, dst_node);
|
|
|
+ else
|
|
|
+ copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, NULL);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //req->async_channel.type = STARPU_FPGA_RAM;
|
|
|
+ if (copy_methods->ram_to_fpga_async)
|
|
|
+ copy_methods->ram_to_fpga_async(src_interface, src_node, dst_interface, dst_node);
|
|
|
+ else
|
|
|
+ {
|
|
|
+ STARPU_ASSERT(copy_methods->any_to_any);
|
|
|
+ copy_methods->any_to_any(src_interface, src_node, dst_interface, dst_node, &req->async_channel);
|
|
|
+ }
|
|
|
+ //_starpu_fpga_init_event(&(req->async_channel.event.fpga_event), dst_node);
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
|
|
|
struct _starpu_driver_ops _starpu_driver_fpga_ops =
|
|
@@ -538,19 +627,19 @@ struct _starpu_driver_ops _starpu_driver_fpga_ops =
|
|
|
.deinit = _starpu_fpga_driver_deinit_from_worker
|
|
|
};
|
|
|
|
|
|
-// TODO: structure node_ops, comme dans driver_cuda.c, avec starpu_fpga_allocate_memory, _starpu_fpga_copy_ram_to_fpga, etc.
|
|
|
+// TODO: structure node_ops, comme dans driver_cuda.c, avec starpu_fpga_allocate_memory, etc.
|
|
|
struct _starpu_node_ops _starpu_driver_fpga_node_ops =
|
|
|
{
|
|
|
.copy_data_to[STARPU_UNUSED] = NULL,
|
|
|
- .copy_data_to[STARPU_CPU_RAM] = _starpu_fpga_copy_fpga_to_ram,
|
|
|
- .copy_data_to[STARPU_FPGA_RAM] = _starpu_fpga_copy_ram_to_fpga,
|
|
|
+ .copy_data_to[STARPU_CPU_RAM] = _starpu_fpga_copy_data_from_fpga_to_cpu,
|
|
|
+ .copy_data_to[STARPU_FPGA_RAM] = _starpu_fpga_copy_data_from_fpga_to_fpga,
|
|
|
.copy_data_to[STARPU_OPENCL_RAM] = NULL,
|
|
|
.copy_data_to[STARPU_DISK_RAM] = NULL,
|
|
|
.copy_data_to[STARPU_MIC_RAM] = NULL,
|
|
|
.copy_data_to[STARPU_MPI_MS_RAM] = NULL,
|
|
|
|
|
|
.copy_interface_to[STARPU_UNUSED] = NULL,
|
|
|
- .copy_interface_to[STARPU_CPU_RAM] = NULL,
|
|
|
+ .copy_interface_to[STARPU_CPU_RAM] = _starpu_fpga_copy_interface_from_fpga_to_cpu,
|
|
|
.copy_interface_to[STARPU_FPGA_RAM] = NULL,
|
|
|
.copy_interface_to[STARPU_OPENCL_RAM] = NULL,
|
|
|
.copy_interface_to[STARPU_DISK_RAM] = NULL,
|