| tldm_data convergence_data(“convergence”); |
| tldm _iteration_domain id_ti; |
| id_ti.insert_iterator(iterator_t); // “t” for the while loop |
| id_ti.insert_iterator(iterator_i); // “i” |
| id_ti.insert_affine_constraint(“i”, 1, “>=”, 0); // i*1 >= 0 |
| id_ti.insert_affine_constraint(“i”, -1, “N”, 1, “>”, 0); // -i+N > 0 |
| id_ti.insert_affine_constraint(“t”, 1, “>=”, 0); // t >= 0 |
| tldm_expression exe_condition(&iterator_t, “!”, &convergence_data); |
| id_ti.insert_exe_condition(&exe_condition); |
| // non-DSA access: different iterations access the same scalar data unit |
| tldm_access convergence_acc (&convergence_data, WRITE); |
| tldm_task task1(“task1”); |
| seq_cholesky.attach_id(&id_ti); |
| seq_cholesky.attach_access(&convergence_acc); |
| // dependence is needed to specify to avoid access conflicts |
| tldm_dependence dept(&task1, &task1); |
| // dependence : task1<t> → task1<t+1> |
| // dept.insert_affine_constraint (“t”, 1, 0, “->”, “t”, 1, 1); // (t+0) → (t+1) |
| // dependence are added to make the while loop iterations to execute in sequence, 0, 1, 2, … |
| < > :: [convergence]; |
| [N] -> < id_ti : t, j> {cond(!convergence); 0<=i<N;}; |
| <id_ti> ::(task1) {body_id(“task1”)}; |
| (task1: t, i) -> [convergence] |
| (task1 : t-1, 0..N) -> (task1 : t, 0..N); |