void insert_work_for_one_element(struct element *el) { starpu_data_handle_t tmp_recv; starpu_data_handle_t tmp_send; starpu_vector_data_register(&tmp_recv, -1, 0, el->tag, sizeof(int)); starpu_vector_data_register(&tmp_send, -1, 0, el->tag, sizeof(int)); //Emulate the work to fill the send buffer starpu_insert_task(&fill_tmp_buffer_cl, STARPU_W,tmp_send, 0); //Send operation starpu_insert_task(&submitted_order, STARPU_RW,el->ensure_submitted_order_send, STARPU_W,tmp_send, 0); starpu_mpi_isend_detached(tmp_send,el->foreign_domain,el->tag, MPI_COMM_WORLD, NULL, NULL); //Recv operation for current element starpu_insert_task(&submitted_order, STARPU_RW,el->ensure_submitted_order_recv, STARPU_W,tmp_recv, 0); starpu_mpi_irecv_detached(tmp_recv,el->foreign_domain,el->tag, MPI_COMM_WORLD, NULL, NULL); //Emulate the "reading" of the recv value. starpu_insert_task(&read_ghost_value_cl, STARPU_R,tmp_recv, 0); starpu_data_unregister_submit(tmp_send); starpu_data_unregister_submit(tmp_recv); }
void render() { starpu_data_register(seeds, ...) starpu_insert_task(codelets::init_seeds, seeds); int iteration = 0; while(iteration < config.max_iters) { starpu_data_register(eye_paths, ...) starpu_insert_task(codelets::generate_eye_paths, eye_paths, seeds); starpu_data_register(hit_points, ...) starpu_insert_task(codelets::advance_eye_paths, eye_paths, seeds, hit_points); starpu_data_unregister_submit(eye_paths); ... // all other tasks for this iteration starpu_data_unregister_submit(hit_points); iteration++; } starpu_data_unregister(seeds); }