Skip to content

Commit a450802

Browse files
Update example/matrix.cpp
1 parent db02907 commit a450802

3 files changed

Lines changed: 42 additions & 61 deletions

File tree

CMakeLists.txt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required (VERSION 3.10)
1+
cmake_minimum_required (VERSION 3.9)
22
MESSAGE(STATUS "CMAKE_ROOT: " ${CMAKE_ROOT})
33

44
# Project name
@@ -29,21 +29,19 @@ include_directories("${PROJECT_SOURCE_DIR}")
2929
include_directories(doctest)
3030

3131

32-
# Find package
32+
# Find pthread package
3333
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
3434
set(THREADS_PREFER_PTHREAD_FLAG TRUE)
3535
find_package(Threads REQUIRED)
36-
MESSAGE(STATUS "CMAKE_THREAD_LIBS_INIT: " ${CMAKE_THREAD_LIBS_INIT})
3736

37+
# Find OpenMP package
38+
find_package(OpenMP REQUIRED)
3839

3940
# -----------------------------------------------------------------------------
4041
# Example program
4142
# -----------------------------------------------------------------------------
4243
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/example)
4344

44-
# todo: make OpenMP flag private to the example target
45-
find_package(OpenMP REQUIRED)
46-
4745
add_executable(simple example/simple.cpp)
4846
target_link_libraries(simple Threads::Threads)
4947

example/matrix.cpp

Lines changed: 38 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,3 @@
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
298290
int 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-

unittest/taskflow

3.7 KB
Binary file not shown.

0 commit comments

Comments
 (0)