1- // Cubist programming assignment.
2- //
3- // Author: Tsung-Wei Huang
4- //
5- // This program is accomplished by my self, without any advice or help from
6- // other individuals. This is my own products.
7- //
8- // Dependency: taskflow.hpp
9- // taskflow.hpp is a c++ DAG-based task scheduler. It has been used in my open-source
10- // projects DtCraft and OpenTimer.
11- // Check my github for more details: https://github.com/twhuang-uiuc
12-
131#include < iostream>
142#include < cstdlib>
153#include < cstdio>
@@ -208,7 +196,7 @@ void parallel(size_t N, size_t num_threads = std::thread::hardware_concurrency()
208196
209197 auto tbeg = std::chrono::steady_clock::now ();
210198
211- tf::Taskflow<int > tf (num_threads);
199+ tf::Taskflow<> tf (num_threads);
212200
213201 // Parallelize the following tasks.
214202 // auto a = load_matrix("a.csv");
@@ -222,27 +210,28 @@ void parallel(size_t N, size_t num_threads = std::thread::hardware_concurrency()
222210 // save_matrix(std::string("b") + std::to_string(j) + ".csv", tmp);
223211 // }
224212 matrix_t a;
225- auto load_a = tf.silent_emplace ([&] () { a = load_matrix (" a.csv" ); });
226- auto save_a1 = tf.silent_emplace ([&] () { save_matrix (" a1.csv" , func1 (a, 1 )); });
227- auto save_a2 = tf.silent_emplace ([&] () { save_matrix (" a2.csv" , func1 (a, 2 )); });
228- auto save_a3 = tf.silent_emplace ([&] () { save_matrix (" a3.csv" , func1 (a, 3 )); });
229- auto save_a4 = tf.silent_emplace ([&] () { save_matrix (" a4.csv" , func1 (a, 4 )); });
230- auto save_a5 = tf.silent_emplace ([&] () { save_matrix (" a5.csv" , func1 (a, 5 )); });
213+ auto load_a = tf.silent_emplace ([&] () { a = load_matrix (" a.csv" ); }). name ( " load_a " ) ;
214+ auto save_a1 = tf.silent_emplace ([&] () { save_matrix (" a1.csv" , func1 (a, 1 )); }). name ( " save_a1 " ) ;
215+ auto save_a2 = tf.silent_emplace ([&] () { save_matrix (" a2.csv" , func1 (a, 2 )); }). name ( " save_a2 " ) ;
216+ auto save_a3 = tf.silent_emplace ([&] () { save_matrix (" a3.csv" , func1 (a, 3 )); }). name ( " save_a3 " ) ;
217+ auto save_a4 = tf.silent_emplace ([&] () { save_matrix (" a4.csv" , func1 (a, 4 )); }). name ( " save_a4 " ) ;
218+ auto save_a5 = tf.silent_emplace ([&] () { save_matrix (" a5.csv" , func1 (a, 5 )); }). name ( " save_a5 " ) ;
231219
232- tf.broadcast (load_a, {save_a1, save_a2, save_a3, save_a4, save_a5});
220+ // tf.broadcast(load_a, {save_a1, save_a2, save_a3, save_a4, save_a5});
221+ load_a.broadcast ({save_a1, save_a2, save_a3, save_a4, save_a5});
233222
234223 matrix_t b;
235- auto load_b = tf.silent_emplace ([&] () { b = load_matrix (" b.csv" ); });
236- auto save_b1 = tf.silent_emplace ([&] () { save_matrix (" b1.csv" , func1 (b, 1 )); });
237- auto save_b2 = tf.silent_emplace ([&] () { save_matrix (" b2.csv" , func1 (b, 2 )); });
238- auto save_b3 = tf.silent_emplace ([&] () { save_matrix (" b3.csv" , func1 (b, 3 )); });
239- auto save_b4 = tf.silent_emplace ([&] () { save_matrix (" b4.csv" , func1 (b, 4 )); });
240- auto save_b5 = tf.silent_emplace ([&] () { save_matrix (" b5.csv" , func1 (b, 5 )); });
224+ auto load_b = tf.silent_emplace ([&] () { b = load_matrix (" b.csv" ); }). name ( " load_b " ) ;
225+ auto save_b1 = tf.silent_emplace ([&] () { save_matrix (" b1.csv" , func1 (b, 1 )); }). name ( " save_b1 " ) ;
226+ auto save_b2 = tf.silent_emplace ([&] () { save_matrix (" b2.csv" , func1 (b, 2 )); }). name ( " save_b2 " ) ;
227+ auto save_b3 = tf.silent_emplace ([&] () { save_matrix (" b3.csv" , func1 (b, 3 )); }). name ( " save_b3 " ) ;
228+ auto save_b4 = tf.silent_emplace ([&] () { save_matrix (" b4.csv" , func1 (b, 4 )); }). name ( " save_b4 " ) ;
229+ auto save_b5 = tf.silent_emplace ([&] () { save_matrix (" b5.csv" , func1 (b, 5 )); }). name ( " save_b5 " ) ;
241230
242231 tf.broadcast (load_b, {save_b1, save_b2, save_b3, save_b4, save_b5});
243232
244233 // Synchronize
245- auto sync = tf.silent_emplace ([&]() {std::cout << " a[1:5].csv and b[1:5].csv written\n " ;});
234+ auto sync = tf.silent_emplace ([&]() {std::cout << " a[1:5].csv and b[1:5].csv written\n " ;}). name ( " sync " ) ;
246235
247236 tf.gather ({save_a1, save_a2, save_a3, save_a4, save_a5,
248237 save_b1, save_b2, save_b3, save_b4, save_b5}, sync);
@@ -255,21 +244,21 @@ void parallel(size_t N, size_t num_threads = std::thread::hardware_concurrency()
255244 // save_matrix(std::string("c") + std::to_string(j) + ".csv", c);
256245 // }
257246 matrix_t a1, a2, a3, a4, a5, b1, b2, b3, b4, b5;
258- auto load_a1 = tf.silent_emplace ([&](){ a1 = load_matrix (" a1.csv" ); });
259- auto load_a2 = tf.silent_emplace ([&](){ a2 = load_matrix (" a2.csv" ); });
260- auto load_a3 = tf.silent_emplace ([&](){ a3 = load_matrix (" a3.csv" ); });
261- auto load_a4 = tf.silent_emplace ([&](){ a4 = load_matrix (" a4.csv" ); });
262- auto load_a5 = tf.silent_emplace ([&](){ a5 = load_matrix (" a5.csv" ); });
263- auto load_b1 = tf.silent_emplace ([&](){ a1 = load_matrix (" b1.csv" ); });
264- auto load_b2 = tf.silent_emplace ([&](){ a2 = load_matrix (" b2.csv" ); });
265- auto load_b3 = tf.silent_emplace ([&](){ a3 = load_matrix (" b3.csv" ); });
266- auto load_b4 = tf.silent_emplace ([&](){ a4 = load_matrix (" b4.csv" ); });
267- auto load_b5 = tf.silent_emplace ([&](){ a5 = load_matrix (" b5.csv" ); });
268- auto save_c1 = tf.silent_emplace ([&](){ save_matrix (" c1.csv" , func2 (a1, b1)); });
269- auto save_c2 = tf.silent_emplace ([&](){ save_matrix (" c2.csv" , func2 (a2, b2)); });
270- auto save_c3 = tf.silent_emplace ([&](){ save_matrix (" c3.csv" , func2 (a3, b3)); });
271- auto save_c4 = tf.silent_emplace ([&](){ save_matrix (" c4.csv" , func2 (a4, b4)); });
272- auto save_c5 = tf.silent_emplace ([&](){ save_matrix (" c5.csv" , func2 (a5, b5)); });
247+ auto load_a1 = tf.silent_emplace ([&](){ a1 = load_matrix (" a1.csv" ); }). name ( " load_a1 " ) ;
248+ auto load_a2 = tf.silent_emplace ([&](){ a2 = load_matrix (" a2.csv" ); }). name ( " load_a2 " ) ;
249+ auto load_a3 = tf.silent_emplace ([&](){ a3 = load_matrix (" a3.csv" ); }). name ( " load_a3 " ) ;
250+ auto load_a4 = tf.silent_emplace ([&](){ a4 = load_matrix (" a4.csv" ); }). name ( " load_a4 " ) ;
251+ auto load_a5 = tf.silent_emplace ([&](){ a5 = load_matrix (" a5.csv" ); }). name ( " load_a5 " ) ;
252+ auto load_b1 = tf.silent_emplace ([&](){ a1 = load_matrix (" b1.csv" ); }). name ( " load_b1 " ) ;
253+ auto load_b2 = tf.silent_emplace ([&](){ a2 = load_matrix (" b2.csv" ); }). name ( " load_b2 " ) ;
254+ auto load_b3 = tf.silent_emplace ([&](){ a3 = load_matrix (" b3.csv" ); }). name ( " load_b3 " ) ;
255+ auto load_b4 = tf.silent_emplace ([&](){ a4 = load_matrix (" b4.csv" ); }). name ( " load_b4 " ) ;
256+ auto load_b5 = tf.silent_emplace ([&](){ a5 = load_matrix (" b5.csv" ); }). name ( " load_b5 " ) ;
257+ auto save_c1 = tf.silent_emplace ([&](){ save_matrix (" c1.csv" , func2 (a1, b1)); }). name ( " save_c1 " ) ;
258+ auto save_c2 = tf.silent_emplace ([&](){ save_matrix (" c2.csv" , func2 (a2, b2)); }). name ( " save_c2 " ) ;
259+ auto save_c3 = tf.silent_emplace ([&](){ save_matrix (" c3.csv" , func2 (a3, b3)); }). name ( " save_c3 " ) ;
260+ auto save_c4 = tf.silent_emplace ([&](){ save_matrix (" c4.csv" , func2 (a4, b4)); }). name ( " save_c4 " ) ;
261+ auto save_c5 = tf.silent_emplace ([&](){ save_matrix (" c5.csv" , func2 (a5, b5)); }). name ( " save_c5 " ) ;
273262
274263 tf.broadcast (sync, {load_a1, load_a2, load_a3, load_a4, load_a5,
275264 load_b1, load_b2, load_b3, load_b4, load_b5});
@@ -283,8 +272,11 @@ void parallel(size_t N, size_t num_threads = std::thread::hardware_concurrency()
283272 .precede (load_a4, save_c4)
284273 .precede (load_b4, save_c4)
285274 .precede (load_a5, save_c5)
286- .precede (load_b5, save_c5)
287- .wait_for_all ();
275+ .precede (load_b5, save_c5);
276+
277+ std::cout << tf.dump () << std::endl;
278+
279+ tf.wait_for_all ();
288280
289281 auto tend = std::chrono::steady_clock::now ();
290282 std::cout << " parallel version takes "
@@ -296,9 +288,9 @@ void parallel(size_t N, size_t num_threads = std::thread::hardware_concurrency()
296288
297289// Function: main
298290int main (int argc, char * argv[]) {
299-
291+
300292 if (argc != 3 ) {
301- std::cerr << " usage: ./cubist N [seq|naive|taskflow]\n " ;
293+ std::cerr << " usage: ./matrix N [seq|naive|taskflow]\n " ;
302294 std::exit (EXIT_FAILURE);
303295 }
304296
@@ -319,12 +311,3 @@ int main(int argc, char* argv[]) {
319311}
320312
321313
322-
323-
324-
325-
326-
327-
328-
329-
330-
0 commit comments