From 1d9ea4a751b47d00fa09c61c34fdc2aca355a60c Mon Sep 17 00:00:00 2001
From: Florent Pruvost <florent.pruvost@inria.fr>
Date: Mon, 15 Oct 2018 14:10:18 +0200
Subject: [PATCH] save the exit status of kernels when possible

---
 runtime/quark/codelets/codelet_zlag2c.c         |  3 ---
 runtime/starpu/codelets/codelet_zgetrf.c        | 11 ++++++++++-
 runtime/starpu/codelets/codelet_zgetrf_incpiv.c | 11 +++++++++--
 runtime/starpu/codelets/codelet_zgetrf_nopiv.c  | 11 ++++++++++-
 runtime/starpu/codelets/codelet_zpotrf.c        | 10 +++++++++-
 runtime/starpu/codelets/codelet_ztrtri.c        | 12 ++++++++++--
 runtime/starpu/codelets/codelet_ztstrf.c        | 13 +++++++++++--
 7 files changed, 59 insertions(+), 12 deletions(-)

diff --git a/runtime/quark/codelets/codelet_zlag2c.c b/runtime/quark/codelets/codelet_zlag2c.c
index 0cbac51c0..9e097eb26 100644
--- a/runtime/quark/codelets/codelet_zlag2c.c
+++ b/runtime/quark/codelets/codelet_zlag2c.c
@@ -35,12 +35,9 @@ void CORE_zlag2c_quark(Quark *quark)
     int ldb;
     RUNTIME_sequence_t *sequence;
     RUNTIME_request_t *request;
-    int info;
 
     quark_unpack_args_8(quark, m, n, A, lda, B, ldb, sequence, request);
     CORE_zlag2c( m, n, A, lda, B, ldb);
-    if (sequence->status == CHAMELEON_SUCCESS && info != 0)
-        RUNTIME_sequence_flush(quark, sequence, request, info);
 }
 
 void INSERT_TASK_zlag2c(const RUNTIME_option_t *options,
diff --git a/runtime/starpu/codelets/codelet_zgetrf.c b/runtime/starpu/codelets/codelet_zgetrf.c
index 74ed2c3e6..bfdfc86e5 100644
--- a/runtime/starpu/codelets/codelet_zgetrf.c
+++ b/runtime/starpu/codelets/codelet_zgetrf.c
@@ -47,6 +47,8 @@ void INSERT_TASK_zgetrf( const RUNTIME_option_t *options,
         STARPU_VALUE,                  &IPIV,                      sizeof(int*),
         STARPU_VALUE,    &check_info,                sizeof(cham_bool_t),
         STARPU_VALUE,         &iinfo,                        sizeof(int),
+        STARPU_VALUE,    &(options->sequence),       sizeof(RUNTIME_sequence_t*),
+        STARPU_VALUE,    &(options->request),        sizeof(RUNTIME_request_t*),
         STARPU_PRIORITY,    options->priority,
         STARPU_CALLBACK,    callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
@@ -66,11 +68,18 @@ static void cl_zgetrf_cpu_func(void *descr[], void *cl_arg)
     int *IPIV;
     cham_bool_t check_info;
     int iinfo;
+    RUNTIME_sequence_t *sequence;
+    RUNTIME_request_t *request;
     int info = 0;
 
     A = (CHAMELEON_Complex64_t *)STARPU_MATRIX_GET_PTR(descr[0]);
-    starpu_codelet_unpack_args(cl_arg, &m, &n, &lda, &IPIV, &check_info, &iinfo);
+
+    starpu_codelet_unpack_args(cl_arg, &m, &n, &lda, &IPIV, &check_info, &iinfo, &sequence, &request);
     CORE_zgetrf( m, n, A, lda, IPIV, &info );
+
+    if ( (sequence->status == CHAMELEON_SUCCESS) && (info != 0) ) {
+        RUNTIME_sequence_flush( NULL, sequence, request, iinfo+info );
+    }
 }
 #endif /* !defined(CHAMELEON_SIMULATION) */
 
diff --git a/runtime/starpu/codelets/codelet_zgetrf_incpiv.c b/runtime/starpu/codelets/codelet_zgetrf_incpiv.c
index 4c701b35c..7b78a48e8 100644
--- a/runtime/starpu/codelets/codelet_zgetrf_incpiv.c
+++ b/runtime/starpu/codelets/codelet_zgetrf_incpiv.c
@@ -113,6 +113,8 @@ void INSERT_TASK_zgetrf_incpiv(const RUNTIME_option_t *options,
         STARPU_VALUE,    &iinfo,             sizeof(int),
         STARPU_SCRATCH,   options->ws_worker,
         STARPU_VALUE,    &h_work,            sizeof(CHAMELEON_starpu_ws_t *),
+        STARPU_VALUE,    &(options->sequence),       sizeof(RUNTIME_sequence_t*),
+        STARPU_VALUE,    &(options->request),        sizeof(RUNTIME_request_t*),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
@@ -134,13 +136,18 @@ static void cl_zgetrf_incpiv_cpu_func(void *descr[], void *cl_arg)
     int *IPIV;
     cham_bool_t check_info;
     int iinfo;
-
+    RUNTIME_sequence_t *sequence;
+    RUNTIME_request_t *request;
     int info = 0;
 
     A = (CHAMELEON_Complex64_t *)STARPU_MATRIX_GET_PTR(descr[0]);
 
-    starpu_codelet_unpack_args(cl_arg, &m, &n, &ib, &lda, &ldl, &IPIV, &check_info, &iinfo, &h_work);
+    starpu_codelet_unpack_args(cl_arg, &m, &n, &ib, &lda, &ldl, &IPIV, &check_info, &iinfo, &h_work, &sequence, &request);
     CORE_zgetrf_incpiv(m, n, ib, A, lda, IPIV, &info);
+
+    if ( (sequence->status == CHAMELEON_SUCCESS) && (info != 0) ) {
+        RUNTIME_sequence_flush( NULL, sequence, request, iinfo+info );
+    }
 }
 #endif /* !defined(CHAMELEON_SIMULATION) */
 
diff --git a/runtime/starpu/codelets/codelet_zgetrf_nopiv.c b/runtime/starpu/codelets/codelet_zgetrf_nopiv.c
index 95037a66f..70e9c9d1b 100644
--- a/runtime/starpu/codelets/codelet_zgetrf_nopiv.c
+++ b/runtime/starpu/codelets/codelet_zgetrf_nopiv.c
@@ -92,6 +92,8 @@ void INSERT_TASK_zgetrf_nopiv(const RUNTIME_option_t *options,
         STARPU_RW,        RTBLKADDR(A, CHAMELEON_Complex64_t, Am, An),
         STARPU_VALUE,    &lda,                       sizeof(int),
         STARPU_VALUE,    &iinfo,                     sizeof(int),
+        STARPU_VALUE,    &(options->sequence),       sizeof(RUNTIME_sequence_t*),
+        STARPU_VALUE,    &(options->request),        sizeof(RUNTIME_request_t*),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
@@ -112,11 +114,18 @@ static void cl_zgetrf_nopiv_cpu_func(void *descr[], void *cl_arg)
     CHAMELEON_Complex64_t *A;
     int lda;
     int iinfo;
+    RUNTIME_sequence_t *sequence;
+    RUNTIME_request_t *request;
     int info = 0;
 
     A = (CHAMELEON_Complex64_t *)STARPU_MATRIX_GET_PTR(descr[0]);
-    starpu_codelet_unpack_args(cl_arg, &m, &n, &ib, &lda, &iinfo);
+
+    starpu_codelet_unpack_args(cl_arg, &m, &n, &ib, &lda, &iinfo, &sequence, &request);
     CORE_zgetrf_nopiv(m, n, ib, A, lda, &info);
+
+    if ( (sequence->status == CHAMELEON_SUCCESS) && (info != 0) ) {
+        RUNTIME_sequence_flush( NULL, sequence, request, iinfo+info );
+    }
 }
 #endif /* !defined(CHAMELEON_SIMULATION) */
 
diff --git a/runtime/starpu/codelets/codelet_zpotrf.c b/runtime/starpu/codelets/codelet_zpotrf.c
index cabfed48c..fc55ced7a 100644
--- a/runtime/starpu/codelets/codelet_zpotrf.c
+++ b/runtime/starpu/codelets/codelet_zpotrf.c
@@ -51,6 +51,8 @@ void INSERT_TASK_zpotrf(const RUNTIME_option_t *options,
         STARPU_RW,        RTBLKADDR(A, CHAMELEON_Complex64_t, Am, An),
         STARPU_VALUE,    &lda,                       sizeof(int),
         STARPU_VALUE,    &iinfo,                     sizeof(int),
+        STARPU_VALUE,    &(options->sequence),       sizeof(RUNTIME_sequence_t*),
+        STARPU_VALUE,    &(options->request),        sizeof(RUNTIME_request_t*),
         /* STARPU_SCRATCH,   options->ws_worker, */
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
@@ -69,12 +71,18 @@ static void cl_zpotrf_cpu_func(void *descr[], void *cl_arg)
     CHAMELEON_Complex64_t *A;
     int lda;
     int iinfo;
+    RUNTIME_sequence_t *sequence;
+    RUNTIME_request_t *request;
     int info = 0;
 
     A = (CHAMELEON_Complex64_t *)STARPU_MATRIX_GET_PTR(descr[0]);
 
-    starpu_codelet_unpack_args(cl_arg, &uplo, &n, &lda, &iinfo);
+    starpu_codelet_unpack_args(cl_arg, &uplo, &n, &lda, &iinfo, &sequence, &request);
     CORE_zpotrf(uplo, n, A, lda, &info);
+
+    if ( (sequence->status == CHAMELEON_SUCCESS) && (info != 0) ) {
+        RUNTIME_sequence_flush( NULL, sequence, request, iinfo+info );
+    }
 }
 #endif /* !defined(CHAMELEON_SIMULATION) */
 
diff --git a/runtime/starpu/codelets/codelet_ztrtri.c b/runtime/starpu/codelets/codelet_ztrtri.c
index 0d1311093..823237a59 100644
--- a/runtime/starpu/codelets/codelet_ztrtri.c
+++ b/runtime/starpu/codelets/codelet_ztrtri.c
@@ -53,6 +53,8 @@ void INSERT_TASK_ztrtri(const RUNTIME_option_t *options,
         STARPU_RW,        RTBLKADDR(A, CHAMELEON_Complex64_t, Am, An),
         STARPU_VALUE,    &lda,               sizeof(int),
         STARPU_VALUE,    &iinfo,             sizeof(int),
+        STARPU_VALUE,    &(options->sequence),       sizeof(RUNTIME_sequence_t*),
+        STARPU_VALUE,    &(options->request),        sizeof(RUNTIME_request_t*),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
@@ -71,12 +73,18 @@ static void cl_ztrtri_cpu_func(void *descr[], void *cl_arg)
     CHAMELEON_Complex64_t *A;
     int LDA;
     int iinfo;
-
+    RUNTIME_sequence_t *sequence;
+    RUNTIME_request_t *request;
     int info = 0;
 
     A = (CHAMELEON_Complex64_t *)STARPU_MATRIX_GET_PTR(descr[0]);
-    starpu_codelet_unpack_args(cl_arg, &uplo, &diag, &N, &LDA, &iinfo);
+
+    starpu_codelet_unpack_args(cl_arg, &uplo, &diag, &N, &LDA, &iinfo, &sequence, &request);
     CORE_ztrtri(uplo, diag, N, A, LDA, &info);
+
+    if ( (sequence->status == CHAMELEON_SUCCESS) && (info != 0) ) {
+        RUNTIME_sequence_flush( NULL, sequence, request, iinfo+info );
+    }
 }
 #endif /* !defined(CHAMELEON_SIMULATION) */
 
diff --git a/runtime/starpu/codelets/codelet_ztstrf.c b/runtime/starpu/codelets/codelet_ztstrf.c
index b943c4091..b97bae2a9 100644
--- a/runtime/starpu/codelets/codelet_ztstrf.c
+++ b/runtime/starpu/codelets/codelet_ztstrf.c
@@ -130,6 +130,8 @@ void INSERT_TASK_ztstrf(const RUNTIME_option_t *options,
         STARPU_VALUE,    &nb,                        sizeof(int),
         STARPU_VALUE,    &check_info,                sizeof(cham_bool_t),
         STARPU_VALUE,    &iinfo,                     sizeof(int),
+        STARPU_VALUE,    &(options->sequence),       sizeof(RUNTIME_sequence_t*),
+        STARPU_VALUE,    &(options->request),        sizeof(RUNTIME_request_t*),
         STARPU_PRIORITY,  options->priority,
         STARPU_CALLBACK,  callback,
 #if defined(CHAMELEON_CODELETS_HAVE_NAME)
@@ -158,7 +160,8 @@ static void cl_ztstrf_cpu_func(void *descr[], void *cl_arg)
     int ldwork;
     cham_bool_t check_info;
     int iinfo;
-
+    RUNTIME_sequence_t *sequence;
+    RUNTIME_request_t *request;
     int info = 0;
 
     U = (CHAMELEON_Complex64_t *)STARPU_MATRIX_GET_PTR(descr[0]);
@@ -166,9 +169,15 @@ static void cl_ztstrf_cpu_func(void *descr[], void *cl_arg)
     L = (CHAMELEON_Complex64_t *)STARPU_MATRIX_GET_PTR(descr[2]);
     WORK = (CHAMELEON_Complex64_t *)STARPU_MATRIX_GET_PTR(descr[3]);
 
-    starpu_codelet_unpack_args(cl_arg, &m, &n, &ib, &nb, &ldu, &lda, &ldl, &IPIV, &d_work, &ldwork, &check_info, &iinfo);
+    starpu_codelet_unpack_args(cl_arg, &m, &n, &ib, &nb, &ldu, &lda, &ldl,
+                               &IPIV, &d_work, &ldwork, &check_info, &iinfo,
+                               &sequence, &request);
 
     CORE_ztstrf(m, n, ib, nb, U, ldu, A, lda, L, ldl, IPIV, WORK, ldwork, &info);
+
+    if ( (sequence->status == CHAMELEON_SUCCESS) && (info != 0) ) {
+        RUNTIME_sequence_flush( NULL, sequence, request, iinfo+info );
+    }
 }
 #endif /* !defined(CHAMELEON_SIMULATION) */
 
-- 
GitLab