Browse Source

Data interfaces: when an asynchronous copy fails, try to copy synchronously

Nathalie Furmento 15 years ago
parent
commit
012aa8ecff

+ 30 - 18
src/datawizard/interfaces/block_interface.c

@@ -721,44 +721,56 @@ static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node __att
 {
 {
 	starpu_block_interface_t *src_block = src_interface;
 	starpu_block_interface_t *src_block = src_interface;
 	starpu_block_interface_t *dst_block = dst_interface;
 	starpu_block_interface_t *dst_block = dst_interface;
-
-	cl_event *event = _event;
+        int err,ret=EAGAIN;
 
 
 	/* XXX non contiguous buffers are not properly supported yet. (TODO) */
 	/* XXX non contiguous buffers are not properly supported yet. (TODO) */
 	STARPU_ASSERT((src_block->nx == src_block->ldy) && (src_block->ldy == dst_block->ldy));
 	STARPU_ASSERT((src_block->nx == src_block->ldy) && (src_block->ldy == dst_block->ldy));
 
 
-	int err = _starpu_opencl_copy_to_opencl((void*)src_block->ptr, (cl_mem)dst_block->dev_handle,
-                                                src_block->nx*src_block->ny*src_block->nz*src_block->elemsize,
-                                                dst_block->offset, event);
-
-	if (STARPU_UNLIKELY(err))
-                STARPU_OPENCL_REPORT_ERROR(err);
+	err = _starpu_opencl_copy_to_opencl((void*)src_block->ptr, (cl_mem)dst_block->dev_handle,
+                                            src_block->nx*src_block->ny*src_block->nz*src_block->elemsize,
+                                            dst_block->offset, (cl_event*)_event);
+        if (STARPU_UNLIKELY(err)) {
+                if (_event) {
+                        err = _starpu_opencl_copy_to_opencl((void*)src_block->ptr, (cl_mem)dst_block->dev_handle,
+                                                            src_block->nx*src_block->ny*src_block->nz*src_block->elemsize,
+                                                            dst_block->offset, NULL);
+                        ret = 0;
+                }
+                if (STARPU_UNLIKELY(err))
+                        STARPU_OPENCL_REPORT_ERROR(err);
+        }
 
 
 	STARPU_TRACE_DATA_COPY(src_node, dst_node, src_block->nx*src_block->ny*src_block->nz*src_block->elemsize);
 	STARPU_TRACE_DATA_COPY(src_node, dst_node, src_block->nx*src_block->ny*src_block->nz*src_block->elemsize);
 
 
-	return EAGAIN;
+	return ret;
 }
 }
 
 
 static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node __attribute__((unused)), void *dst_interface, unsigned dst_node __attribute__((unused)), void *_event)
 static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node __attribute__((unused)), void *dst_interface, unsigned dst_node __attribute__((unused)), void *_event)
 {
 {
 	starpu_block_interface_t *src_block = src_interface;
 	starpu_block_interface_t *src_block = src_interface;
 	starpu_block_interface_t *dst_block = dst_interface;
 	starpu_block_interface_t *dst_block = dst_interface;
-
-	cl_event *event = _event;
+        int err,ret=EAGAIN;
 
 
 	/* XXX non contiguous buffers are not properly supported yet. (TODO) */
 	/* XXX non contiguous buffers are not properly supported yet. (TODO) */
 	STARPU_ASSERT((src_block->nx == src_block->ldy) && (src_block->ldy == dst_block->ldy));
 	STARPU_ASSERT((src_block->nx == src_block->ldy) && (src_block->ldy == dst_block->ldy));
 
 
-	int err = _starpu_opencl_copy_from_opencl((cl_mem)src_block->dev_handle, (void*)dst_block->ptr,
-                                                  src_block->nx*src_block->ny*src_block->nz*src_block->elemsize,
-                                                  src_block->offset, event);
-
-	if (STARPU_UNLIKELY(err))
-                STARPU_OPENCL_REPORT_ERROR(err);
+        err = _starpu_opencl_copy_from_opencl((cl_mem)src_block->dev_handle, (void*)dst_block->ptr,
+                                              src_block->nx*src_block->ny*src_block->nz*src_block->elemsize,
+                                              src_block->offset, (cl_event*)_event);
+	if (STARPU_UNLIKELY(err)) {
+                if (_event) {
+                        err = _starpu_opencl_copy_from_opencl((cl_mem)src_block->dev_handle, (void*)dst_block->ptr,
+                                                              src_block->nx*src_block->ny*src_block->nz*src_block->elemsize,
+                                                              src_block->offset, NULL);
+                        ret = 0;
+                }
+                if (STARPU_UNLIKELY(err))
+                        STARPU_OPENCL_REPORT_ERROR(err);
+        }
 
 
 	STARPU_TRACE_DATA_COPY(src_node, dst_node, src_block->nx*src_block->ny*src_block->nz*src_block->elemsize);
 	STARPU_TRACE_DATA_COPY(src_node, dst_node, src_block->nx*src_block->ny*src_block->nz*src_block->elemsize);
 
 
-	return EAGAIN;
+	return ret;
 }
 }
 
 
 static int copy_ram_to_opencl(void *src_interface, unsigned src_node __attribute__((unused)), void *dst_interface, unsigned dst_node __attribute__((unused)))
 static int copy_ram_to_opencl(void *src_interface, unsigned src_node __attribute__((unused)), void *dst_interface, unsigned dst_node __attribute__((unused)))

+ 30 - 16
src/datawizard/interfaces/matrix_interface.c

@@ -470,43 +470,57 @@ static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node __att
 {
 {
 	starpu_matrix_interface_t *src_matrix = src_interface;
 	starpu_matrix_interface_t *src_matrix = src_interface;
 	starpu_matrix_interface_t *dst_matrix = dst_interface;
 	starpu_matrix_interface_t *dst_matrix = dst_interface;
-
-	cl_event *event = _event;
+        int err,ret=EAGAIN;
 
 
 	/* XXX non contiguous matrices are not supported with OpenCL yet ! (TODO) */
 	/* XXX non contiguous matrices are not supported with OpenCL yet ! (TODO) */
 	STARPU_ASSERT((src_matrix->ld == src_matrix->nx) && (dst_matrix->ld == dst_matrix->nx));
 	STARPU_ASSERT((src_matrix->ld == src_matrix->nx) && (dst_matrix->ld == dst_matrix->nx));
 
 
-	int err = _starpu_opencl_copy_to_opencl((void*)src_matrix->ptr, (cl_mem)dst_matrix->dev_handle, src_matrix->nx*src_matrix->ny*src_matrix->elemsize,
-                                                dst_matrix->offset, event);
+	err = _starpu_opencl_copy_to_opencl((void*)src_matrix->ptr, (cl_mem)dst_matrix->dev_handle, src_matrix->nx*src_matrix->ny*src_matrix->elemsize,
+                                            dst_matrix->offset, (cl_event*)_event);
 
 
-	if (STARPU_UNLIKELY(err))
-                STARPU_OPENCL_REPORT_ERROR(err);
+	if (STARPU_UNLIKELY(err)) {
+                if (_event) {
+                        err = _starpu_opencl_copy_to_opencl((void*)src_matrix->ptr, (cl_mem)dst_matrix->dev_handle,
+                                                            src_matrix->nx*src_matrix->ny*src_matrix->elemsize,
+                                                            dst_matrix->offset, NULL);
+                        ret = 0;
+                }
+                if (STARPU_UNLIKELY(err))
+                        STARPU_OPENCL_REPORT_ERROR(err);
+        }
 
 
 	STARPU_TRACE_DATA_COPY(src_node, dst_node, src_matrix->nx*src_matrix->ny*src_matrix->elemsize);
 	STARPU_TRACE_DATA_COPY(src_node, dst_node, src_matrix->nx*src_matrix->ny*src_matrix->elemsize);
 
 
-	return EAGAIN;
+	return ret;
 }
 }
 
 
 static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node __attribute__((unused)), void *dst_interface, unsigned dst_node __attribute__((unused)), void *_event)
 static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node __attribute__((unused)), void *dst_interface, unsigned dst_node __attribute__((unused)), void *_event)
 {
 {
 	starpu_matrix_interface_t *src_matrix = src_interface;
 	starpu_matrix_interface_t *src_matrix = src_interface;
 	starpu_matrix_interface_t *dst_matrix = dst_interface;
 	starpu_matrix_interface_t *dst_matrix = dst_interface;
-
-	cl_event *event = _event;
+        int err,ret=EAGAIN;
 
 
 	/* XXX non contiguous matrices are not supported with OpenCL yet ! (TODO) */
 	/* XXX non contiguous matrices are not supported with OpenCL yet ! (TODO) */
 	STARPU_ASSERT((src_matrix->ld == src_matrix->nx) && (dst_matrix->ld == dst_matrix->nx));
 	STARPU_ASSERT((src_matrix->ld == src_matrix->nx) && (dst_matrix->ld == dst_matrix->nx));
 
 
-	int err = _starpu_opencl_copy_from_opencl((cl_mem)src_matrix->dev_handle, (void*)dst_matrix->ptr,
-                                                  src_matrix->nx*src_matrix->ny*src_matrix->elemsize,
-                                                  src_matrix->offset, event);
-
-	if (STARPU_UNLIKELY(err))
-                STARPU_OPENCL_REPORT_ERROR(err);
+        err = _starpu_opencl_copy_from_opencl((cl_mem)src_matrix->dev_handle, (void*)dst_matrix->ptr,
+                                              src_matrix->nx*src_matrix->ny*src_matrix->elemsize,
+                                              src_matrix->offset, (cl_event*)_event);
+
+	if (STARPU_UNLIKELY(err)) {
+                if (_event) {
+                        err = _starpu_opencl_copy_from_opencl((cl_mem)src_matrix->dev_handle, (void*)dst_matrix->ptr,
+                                                              src_matrix->nx*src_matrix->ny*src_matrix->elemsize,
+                                                              src_matrix->offset, NULL);
+                        ret = 0;
+                }
+                if (STARPU_UNLIKELY(err))
+                        STARPU_OPENCL_REPORT_ERROR(err);
+        }
 
 
 	STARPU_TRACE_DATA_COPY(src_node, dst_node, src_matrix->nx*src_matrix->ny*src_matrix->elemsize);
 	STARPU_TRACE_DATA_COPY(src_node, dst_node, src_matrix->nx*src_matrix->ny*src_matrix->elemsize);
 
 
-	return EAGAIN;
+	return ret;
 }
 }
 
 
 static int copy_ram_to_opencl(void *src_interface, unsigned src_node __attribute__((unused)), void *dst_interface, unsigned dst_node __attribute__((unused)))
 static int copy_ram_to_opencl(void *src_interface, unsigned src_node __attribute__((unused)), void *dst_interface, unsigned dst_node __attribute__((unused)))

+ 29 - 19
src/datawizard/interfaces/variable_interface.c

@@ -352,45 +352,55 @@ static int copy_ram_to_cuda_async(void *src_interface, unsigned src_node __attri
 
 
 	return EAGAIN;
 	return EAGAIN;
 }
 }
-
-
 #endif // STARPU_USE_CUDA
 #endif // STARPU_USE_CUDA
 
 
 #ifdef STARPU_USE_OPENCL
 #ifdef STARPU_USE_OPENCL
-static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node __attribute__((unused)), void *dst_interface, unsigned dst_node __attribute__((unused)), void *_event)
+static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node __attribute__((unused)), void *dst_interface,
+                                    unsigned dst_node __attribute__((unused)), void *_event)
 {
 {
 	starpu_variable_interface_t *src_variable = src_interface;
 	starpu_variable_interface_t *src_variable = src_interface;
 	starpu_variable_interface_t *dst_variable = dst_interface;
 	starpu_variable_interface_t *dst_variable = dst_interface;
-
-	cl_event *event = _event;
-
-	int err = _starpu_opencl_copy_to_opencl((void*)src_variable->ptr, (cl_mem)dst_variable->ptr, src_variable->elemsize,
-                                                0, event);
-
-	if (STARPU_UNLIKELY(err))
-                STARPU_OPENCL_REPORT_ERROR(err);
+        int err,ret=EAGAIN;
+
+	err = _starpu_opencl_copy_to_opencl((void*)src_variable->ptr, (cl_mem)dst_variable->ptr, src_variable->elemsize,
+                                            0, (cl_event*)_event);
+	if (STARPU_UNLIKELY(err)) {
+                if (_event) {
+                        err = _starpu_opencl_copy_to_opencl((void*)src_variable->ptr, (cl_mem)dst_variable->ptr, src_variable->elemsize,
+                                                            0, NULL);
+                        ret = 0;
+                }
+                if (STARPU_UNLIKELY(err))
+                        STARPU_OPENCL_REPORT_ERROR(err);
+        }
 
 
 	STARPU_TRACE_DATA_COPY(src_node, dst_node, src_variable->elemsize);
 	STARPU_TRACE_DATA_COPY(src_node, dst_node, src_variable->elemsize);
 
 
-	return EAGAIN;
+	return ret;
 }
 }
 
 
 static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node __attribute__((unused)), void *dst_interface, unsigned dst_node __attribute__((unused)), void *_event)
 static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node __attribute__((unused)), void *dst_interface, unsigned dst_node __attribute__((unused)), void *_event)
 {
 {
 	starpu_variable_interface_t *src_variable = src_interface;
 	starpu_variable_interface_t *src_variable = src_interface;
 	starpu_variable_interface_t *dst_variable = dst_interface;
 	starpu_variable_interface_t *dst_variable = dst_interface;
+        int err,ret=EAGAIN;
 
 
-	cl_event *event = _event;
+	err = _starpu_opencl_copy_from_opencl((cl_mem)src_variable->ptr, (void*)dst_variable->ptr, src_variable->elemsize,
+                                              0, (cl_event*)_event);
 
 
-	int err = _starpu_opencl_copy_from_opencl((cl_mem)src_variable->ptr, (void*)dst_variable->ptr, src_variable->elemsize,
-                                                  0, event);
-
-	if (STARPU_UNLIKELY(err))
-                STARPU_OPENCL_REPORT_ERROR(err);
+	if (STARPU_UNLIKELY(err)) {
+                if (_event) {
+                        err = _starpu_opencl_copy_from_opencl((cl_mem)src_variable->ptr, (void*)dst_variable->ptr, src_variable->elemsize,
+                                                              0, NULL);
+                        ret = 0;
+                }
+                if (STARPU_UNLIKELY(err))
+                        STARPU_OPENCL_REPORT_ERROR(err);
+        }
 
 
 	STARPU_TRACE_DATA_COPY(src_node, dst_node, src_variable->elemsize);
 	STARPU_TRACE_DATA_COPY(src_node, dst_node, src_variable->elemsize);
 
 
-	return EAGAIN;
+	return ret;
 }
 }
 
 
 static int copy_ram_to_opencl(void *src_interface, unsigned src_node __attribute__((unused)), void *dst_interface, unsigned dst_node __attribute__((unused)))
 static int copy_ram_to_opencl(void *src_interface, unsigned src_node __attribute__((unused)), void *dst_interface, unsigned dst_node __attribute__((unused)))

+ 31 - 23
src/datawizard/interfaces/vector_interface.c

@@ -391,46 +391,55 @@ static int copy_ram_to_cuda_async(void *src_interface, unsigned src_node __attri
 
 
 	return EAGAIN;
 	return EAGAIN;
 }
 }
-
-
 #endif // STARPU_USE_CUDA
 #endif // STARPU_USE_CUDA
+
 #ifdef STARPU_USE_OPENCL
 #ifdef STARPU_USE_OPENCL
 static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node __attribute__((unused)),
 static int copy_ram_to_opencl_async(void *src_interface, unsigned src_node __attribute__((unused)),
                                     void *dst_interface, unsigned dst_node __attribute__((unused)), void *_event)
                                     void *dst_interface, unsigned dst_node __attribute__((unused)), void *_event)
 {
 {
 	starpu_vector_interface_t *src_vector = src_interface;
 	starpu_vector_interface_t *src_vector = src_interface;
 	starpu_vector_interface_t *dst_vector = dst_interface;
 	starpu_vector_interface_t *dst_vector = dst_interface;
-
-	cl_event *event = _event;
-
-	int err = _starpu_opencl_copy_to_opencl((void*)src_vector->ptr, (cl_mem)dst_vector->dev_handle, src_vector->nx*src_vector->elemsize,
-                                                dst_vector->offset, event);
-
-	if (STARPU_UNLIKELY(err))
-                STARPU_OPENCL_REPORT_ERROR(err);
+        int err, ret=EAGAIN;
+
+	err = _starpu_opencl_copy_to_opencl((void*)src_vector->ptr, (cl_mem)dst_vector->dev_handle, src_vector->nx*src_vector->elemsize,
+                                            dst_vector->offset, (cl_event*)_event);
+        if (STARPU_UNLIKELY(err)) {
+                if (_event) {
+                        err = _starpu_opencl_copy_to_opencl((void*)src_vector->ptr, (cl_mem)dst_vector->dev_handle, src_vector->nx*src_vector->elemsize,
+                                                            dst_vector->offset, NULL);
+                        ret = 0;
+                }
+                if (STARPU_UNLIKELY(err))
+                        STARPU_OPENCL_REPORT_ERROR(err);
+        }
 
 
 	STARPU_TRACE_DATA_COPY(src_node, dst_node, src_vector->nx*src_vector->elemsize);
 	STARPU_TRACE_DATA_COPY(src_node, dst_node, src_vector->nx*src_vector->elemsize);
 
 
-	return EAGAIN;
+	return ret;
 }
 }
 
 
 static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node __attribute__((unused)),
 static int copy_opencl_to_ram_async(void *src_interface, unsigned src_node __attribute__((unused)),
-					void *dst_interface, unsigned dst_node __attribute__((unused)), void *_event)
+                                    void *dst_interface, unsigned dst_node __attribute__((unused)), void *_event)
 {
 {
 	starpu_vector_interface_t *src_vector = src_interface;
 	starpu_vector_interface_t *src_vector = src_interface;
 	starpu_vector_interface_t *dst_vector = dst_interface;
 	starpu_vector_interface_t *dst_vector = dst_interface;
-
-	cl_event *event = _event;
-
-	int err = _starpu_opencl_copy_from_opencl((cl_mem)src_vector->dev_handle, (void*)dst_vector->ptr, src_vector->nx*src_vector->elemsize,
-                                                  src_vector->offset, event);
-
-	if (STARPU_UNLIKELY(err))
-                STARPU_OPENCL_REPORT_ERROR(err);
+        int err, ret = EAGAIN;
+
+	err = _starpu_opencl_copy_from_opencl((cl_mem)src_vector->dev_handle, (void*)dst_vector->ptr, src_vector->nx*src_vector->elemsize,
+                                              src_vector->offset, (cl_event *)_event);
+	if (STARPU_UNLIKELY(err)) {
+                if (_event) {
+                        err = _starpu_opencl_copy_from_opencl((cl_mem)src_vector->dev_handle, (void*)dst_vector->ptr, src_vector->nx*src_vector->elemsize,
+                                                              src_vector->offset, NULL);
+                        ret = 0;
+                }
+                if (STARPU_UNLIKELY(err))
+                        STARPU_OPENCL_REPORT_ERROR(err);
+        }
 
 
 	STARPU_TRACE_DATA_COPY(src_node, dst_node, src_vector->nx*src_vector->elemsize);
 	STARPU_TRACE_DATA_COPY(src_node, dst_node, src_vector->nx*src_vector->elemsize);
 
 
-	return EAGAIN;
+	return ret;
 }
 }
 
 
 static int copy_ram_to_opencl(void *src_interface, unsigned src_node __attribute__((unused)),
 static int copy_ram_to_opencl(void *src_interface, unsigned src_node __attribute__((unused)),
@@ -446,8 +455,7 @@ static int copy_opencl_to_ram(void *src_interface, unsigned src_node __attribute
         copy_opencl_to_ram_async(src_interface, src_node, dst_interface, dst_node, NULL);
         copy_opencl_to_ram_async(src_interface, src_node, dst_interface, dst_node, NULL);
 	return 0;
 	return 0;
 }
 }
-
-#endif
+#endif // STARPU_USE_OPENCL
 
 
 static int dummy_copy_ram_to_ram(void *src_interface, unsigned src_node __attribute__((unused)),
 static int dummy_copy_ram_to_ram(void *src_interface, unsigned src_node __attribute__((unused)),
 					void *dst_interface, unsigned dst_node __attribute__((unused)))
 					void *dst_interface, unsigned dst_node __attribute__((unused)))