|
@@ -1,7 +1,7 @@
|
|
/* StarPU --- Runtime system for heterogeneous multicore architectures.
|
|
/* StarPU --- Runtime system for heterogeneous multicore architectures.
|
|
*
|
|
*
|
|
* Copyright (C) 2009, 2010-2011, 2013-2015 Université de Bordeaux
|
|
* Copyright (C) 2009, 2010-2011, 2013-2015 Université de Bordeaux
|
|
- * Copyright (C) 2010, 2011, 2012, 2013, 2014 CNRS
|
|
|
|
|
|
+ * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2016 CNRS
|
|
* Copyright (C) 2012 INRIA
|
|
* Copyright (C) 2012 INRIA
|
|
*
|
|
*
|
|
* StarPU is free software; you can redistribute it and/or modify
|
|
* StarPU is free software; you can redistribute it and/or modify
|
|
@@ -44,15 +44,15 @@ void cpu_kernel_add_vectors(void *buffers[], void *cl_arg)
|
|
auto u_data0 = starpu_data_get_user_data(task->handles[0]); assert(u_data0);
|
|
auto u_data0 = starpu_data_get_user_data(task->handles[0]); assert(u_data0);
|
|
auto u_data1 = starpu_data_get_user_data(task->handles[1]); assert(u_data1);
|
|
auto u_data1 = starpu_data_get_user_data(task->handles[1]); assert(u_data1);
|
|
auto u_data2 = starpu_data_get_user_data(task->handles[2]); assert(u_data2);
|
|
auto u_data2 = starpu_data_get_user_data(task->handles[2]); assert(u_data2);
|
|
-
|
|
|
|
|
|
+
|
|
// cast void* in std::vector<char>*
|
|
// cast void* in std::vector<char>*
|
|
auto vec_A = static_cast<std::vector<char>*>(u_data0);
|
|
auto vec_A = static_cast<std::vector<char>*>(u_data0);
|
|
auto vec_B = static_cast<std::vector<char>*>(u_data1);
|
|
auto vec_B = static_cast<std::vector<char>*>(u_data1);
|
|
auto vec_C = static_cast<std::vector<char>*>(u_data2);
|
|
auto vec_C = static_cast<std::vector<char>*>(u_data2);
|
|
-
|
|
|
|
|
|
+
|
|
// all the std::vector have to have the same size
|
|
// all the std::vector have to have the same size
|
|
assert(vec_A->size() == vec_B->size() && vec_B->size() == vec_C->size());
|
|
assert(vec_A->size() == vec_B->size() && vec_B->size() == vec_C->size());
|
|
-
|
|
|
|
|
|
+
|
|
// performs the vector addition (vec_C[] = vec_A[] + vec_B[])
|
|
// performs the vector addition (vec_C[] = vec_A[] + vec_B[])
|
|
for (size_t i = 0; i < vec_C->size(); i++)
|
|
for (size_t i = 0; i < vec_C->size(); i++)
|
|
(*vec_C)[i] = (*vec_A)[i] + (*vec_B)[i];
|
|
(*vec_C)[i] = (*vec_A)[i] + (*vec_B)[i];
|
|
@@ -61,7 +61,7 @@ void cpu_kernel_add_vectors(void *buffers[], void *cl_arg)
|
|
int main(int argc, char **argv)
|
|
int main(int argc, char **argv)
|
|
{
|
|
{
|
|
constexpr int vec_size = 1024;
|
|
constexpr int vec_size = 1024;
|
|
-
|
|
|
|
|
|
+
|
|
std::vector<char> vec_A(vec_size, 2); // all the vector is initialized to 2
|
|
std::vector<char> vec_A(vec_size, 2); // all the vector is initialized to 2
|
|
std::vector<char> vec_B(vec_size, 3); // all the vector is initialized to 3
|
|
std::vector<char> vec_B(vec_size, 3); // all the vector is initialized to 3
|
|
std::vector<char> vec_C(vec_size, 0); // all the vector is initialized to 0
|
|
std::vector<char> vec_C(vec_size, 0); // all the vector is initialized to 0
|
|
@@ -74,17 +74,17 @@ int main(int argc, char **argv)
|
|
starpu_data_handle_t spu_vec_A;
|
|
starpu_data_handle_t spu_vec_A;
|
|
starpu_data_handle_t spu_vec_B;
|
|
starpu_data_handle_t spu_vec_B;
|
|
starpu_data_handle_t spu_vec_C;
|
|
starpu_data_handle_t spu_vec_C;
|
|
-
|
|
|
|
|
|
+
|
|
// give the data of the vector to StarPU (C array)
|
|
// give the data of the vector to StarPU (C array)
|
|
starpu_vector_data_register(&spu_vec_A, STARPU_MAIN_RAM, (uintptr_t)vec_A.data(), vec_A.size(), sizeof(char));
|
|
starpu_vector_data_register(&spu_vec_A, STARPU_MAIN_RAM, (uintptr_t)vec_A.data(), vec_A.size(), sizeof(char));
|
|
starpu_vector_data_register(&spu_vec_B, STARPU_MAIN_RAM, (uintptr_t)vec_B.data(), vec_B.size(), sizeof(char));
|
|
starpu_vector_data_register(&spu_vec_B, STARPU_MAIN_RAM, (uintptr_t)vec_B.data(), vec_B.size(), sizeof(char));
|
|
starpu_vector_data_register(&spu_vec_C, STARPU_MAIN_RAM, (uintptr_t)vec_C.data(), vec_C.size(), sizeof(char));
|
|
starpu_vector_data_register(&spu_vec_C, STARPU_MAIN_RAM, (uintptr_t)vec_C.data(), vec_C.size(), sizeof(char));
|
|
-
|
|
|
|
|
|
+
|
|
// pass the pointer to the C++ vector object to StarPU
|
|
// pass the pointer to the C++ vector object to StarPU
|
|
starpu_data_set_user_data(spu_vec_A, (void*)&vec_A);
|
|
starpu_data_set_user_data(spu_vec_A, (void*)&vec_A);
|
|
starpu_data_set_user_data(spu_vec_B, (void*)&vec_B);
|
|
starpu_data_set_user_data(spu_vec_B, (void*)&vec_B);
|
|
starpu_data_set_user_data(spu_vec_C, (void*)&vec_C);
|
|
starpu_data_set_user_data(spu_vec_C, (void*)&vec_C);
|
|
-
|
|
|
|
|
|
+
|
|
// create the StarPU codelet
|
|
// create the StarPU codelet
|
|
starpu_codelet cl;
|
|
starpu_codelet cl;
|
|
starpu_codelet_init(&cl);
|
|
starpu_codelet_init(&cl);
|
|
@@ -95,19 +95,32 @@ int main(int argc, char **argv)
|
|
cl.modes [1] = STARPU_R;
|
|
cl.modes [1] = STARPU_R;
|
|
cl.modes [2] = STARPU_W;
|
|
cl.modes [2] = STARPU_W;
|
|
cl.name = "add_vectors";
|
|
cl.name = "add_vectors";
|
|
-
|
|
|
|
|
|
+
|
|
// submit a new StarPU task to execute
|
|
// submit a new StarPU task to execute
|
|
ret = starpu_task_insert(&cl,
|
|
ret = starpu_task_insert(&cl,
|
|
STARPU_R, spu_vec_A,
|
|
STARPU_R, spu_vec_A,
|
|
STARPU_R, spu_vec_B,
|
|
STARPU_R, spu_vec_B,
|
|
STARPU_W, spu_vec_C,
|
|
STARPU_W, spu_vec_C,
|
|
0);
|
|
0);
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ if (ret == -ENODEV)
|
|
|
|
+ {
|
|
|
|
+ // StarPU data unregistering
|
|
|
|
+ starpu_data_unregister(spu_vec_C);
|
|
|
|
+ starpu_data_unregister(spu_vec_B);
|
|
|
|
+ starpu_data_unregister(spu_vec_A);
|
|
|
|
+
|
|
|
|
+ // terminate StarPU, no task can be submitted after
|
|
|
|
+ starpu_shutdown();
|
|
|
|
+
|
|
|
|
+ return 77;
|
|
|
|
+ }
|
|
|
|
+
|
|
STARPU_CHECK_RETURN_VALUE(ret, "task_submit::add_vectors");
|
|
STARPU_CHECK_RETURN_VALUE(ret, "task_submit::add_vectors");
|
|
-
|
|
|
|
|
|
+
|
|
// wait the task
|
|
// wait the task
|
|
starpu_task_wait_for_all();
|
|
starpu_task_wait_for_all();
|
|
-
|
|
|
|
|
|
+
|
|
// StarPU data unregistering
|
|
// StarPU data unregistering
|
|
starpu_data_unregister(spu_vec_C);
|
|
starpu_data_unregister(spu_vec_C);
|
|
starpu_data_unregister(spu_vec_B);
|
|
starpu_data_unregister(spu_vec_B);
|
|
@@ -121,7 +134,7 @@ int main(int argc, char **argv)
|
|
auto i = 0;
|
|
auto i = 0;
|
|
while (!fail && i < vec_size)
|
|
while (!fail && i < vec_size)
|
|
fail = vec_C[i++] != 5;
|
|
fail = vec_C[i++] != 5;
|
|
-
|
|
|
|
|
|
+
|
|
if (fail)
|
|
if (fail)
|
|
{
|
|
{
|
|
#ifdef PRINT_OUTPUT
|
|
#ifdef PRINT_OUTPUT
|
|
@@ -137,4 +150,4 @@ int main(int argc, char **argv)
|
|
return EXIT_SUCCESS;
|
|
return EXIT_SUCCESS;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-#endif
|
|
|
|
|
|
+#endif
|