123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- #include <cassert>
- #include <vector>
- #ifdef PRINT_OUTPUT
- #include <iostream>
- #endif
- #include <starpu.h>
- #if !defined(STARPU_HAVE_CXX11)
- int main(int argc, char **argv)
- {
- return 77;
- }
- #else
- void cpu_kernel_add_vectors(void *buffers[], void *cl_arg)
- {
-
- auto task = starpu_task_get_current();
-
- 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_data2 = starpu_data_get_user_data(task->handles[2]); assert(u_data2);
-
- auto vec_A = static_cast<std::vector<char>*>(u_data0);
- auto vec_B = static_cast<std::vector<char>*>(u_data1);
- auto vec_C = static_cast<std::vector<char>*>(u_data2);
-
- assert(vec_A->size() == vec_B->size() && vec_B->size() == vec_C->size());
-
- for (size_t i = 0; i < vec_C->size(); i++)
- (*vec_C)[i] = (*vec_A)[i] + (*vec_B)[i];
- }
- int main(int argc, char **argv)
- {
- constexpr int vec_size = 1024;
- std::vector<char> vec_A(vec_size, 2);
- std::vector<char> vec_B(vec_size, 3);
- std::vector<char> vec_C(vec_size, 0);
- struct starpu_conf conf;
- starpu_conf_init(&conf);
- conf.nmic = 0;
- conf.nscc = 0;
- conf.nmpi_ms = 0;
-
- auto ret = starpu_init(&conf);
- if (ret == -ENODEV)
- return 77;
- STARPU_CHECK_RETURN_VALUE(ret, "starpu_init");
- if (starpu_memory_nodes_get_numa_count() > 1)
- {
- starpu_shutdown();
- return 77;
- }
-
- starpu_data_handle_t spu_vec_A;
- starpu_data_handle_t spu_vec_B;
- starpu_data_handle_t spu_vec_C;
-
- 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_C, STARPU_MAIN_RAM, (uintptr_t)vec_C.data(), vec_C.size(), sizeof(char));
-
- 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_C, (void*)&vec_C);
-
- starpu_codelet cl;
- starpu_codelet_init(&cl);
- cl.cpu_funcs [0] = cpu_kernel_add_vectors;
- cl.cpu_funcs_name[0] = "cpu_kernel_add_vectors";
- cl.nbuffers = 3;
- cl.modes [0] = STARPU_R;
- cl.modes [1] = STARPU_R;
- cl.modes [2] = STARPU_W;
- cl.name = "add_vectors";
-
- ret = starpu_task_insert(&cl,
- STARPU_R, spu_vec_A,
- STARPU_R, spu_vec_B,
- STARPU_W, spu_vec_C,
- 0);
- if (ret == -ENODEV)
- {
-
- starpu_data_unregister(spu_vec_C);
- starpu_data_unregister(spu_vec_B);
- starpu_data_unregister(spu_vec_A);
-
- starpu_shutdown();
- return 77;
- }
- STARPU_CHECK_RETURN_VALUE(ret, "task_submit::add_vectors");
-
- starpu_task_wait_for_all();
-
- starpu_data_unregister(spu_vec_C);
- starpu_data_unregister(spu_vec_B);
- starpu_data_unregister(spu_vec_A);
-
- starpu_shutdown();
-
- auto fail = false;
- auto i = 0;
- while (!fail && i < vec_size)
- fail = vec_C[i++] != 5;
- if (fail)
- {
- #ifdef PRINT_OUTPUT
- std::cout << "Example failed..." << std::endl;
- #endif
- return EXIT_FAILURE;
- }
- else
- {
- #ifdef PRINT_OUTPUT
- std::cout << "Example successfully passed!" << std::endl;
- #endif
- return EXIT_SUCCESS;
- }
- }
- #endif
|